Merge "SpecialWantedcategories: Actually strike the category if it was emptied"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Sun, 26 Jan 2014 15:25:36 +0000 (15:25 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Sun, 26 Jan 2014 15:25:36 +0000 (15:25 +0000)
396 files changed:
RELEASE-NOTES-1.23
composer-example.json
docs/hooks.txt
img_auth.php
includes/Article.php
includes/AutoLoader.php
includes/Block.php
includes/CategoryViewer.php
includes/Collation.php
includes/DefaultSettings.php
includes/Defines.php
includes/EditPage.php
includes/FakeTitle.php
includes/ForkController.php
includes/GlobalFunctions.php
includes/Hooks.php
includes/Linker.php
includes/MWTimestamp.php [new file with mode: 0644]
includes/MagicWord.php
includes/MessageBlobStore.php
includes/Metadata.php [deleted file]
includes/OutputPage.php
includes/Preferences.php
includes/Sanitizer.php
includes/Setup.php
includes/SpecialPageFactory.php [deleted file]
includes/Timestamp.php [deleted file]
includes/TimestampException.php [new file with mode: 0644]
includes/Title.php
includes/User.php
includes/WatchedItem.php
includes/WebRequest.php
includes/Wiki.php
includes/WikiError.php [deleted file]
includes/WikiPage.php
includes/ZhClient.php [deleted file]
includes/actions/InfoAction.php
includes/api/ApiBase.php
includes/api/ApiCreateAccount.php
includes/api/ApiMain.php
includes/api/ApiPageSet.php
includes/api/ApiParse.php
includes/api/ApiQueryBase.php
includes/api/ApiQueryDeletedrevs.php
includes/api/ApiQueryFilearchive.php
includes/api/ApiQueryImageInfo.php
includes/api/ApiQueryLogEvents.php
includes/api/ApiQueryRecentChanges.php
includes/api/ApiQueryRevisions.php
includes/api/ApiQuerySiteinfo.php
includes/api/ApiQueryUserContributions.php
includes/api/ApiQueryWatchlist.php
includes/changes/ChangesList.php
includes/changes/EnhancedChangesList.php
includes/changes/RecentChange.php
includes/db/ChronologyProtector.php
includes/db/CloneDatabase.php
includes/db/Database.php
includes/db/DatabaseError.php
includes/db/DatabaseMssql.php
includes/db/DatabaseMysql.php
includes/db/DatabaseMysqlBase.php
includes/db/DatabaseMysqli.php
includes/db/DatabaseOracle.php
includes/db/DatabasePostgres.php
includes/db/DatabaseSqlite.php
includes/db/DatabaseUtility.php
includes/db/LBFactory.php
includes/db/LBFactoryMulti.php
includes/db/LBFactorySingle.php
includes/db/LoadBalancer.php
includes/db/LoadMonitor.php
includes/db/ORMTable.php
includes/filebackend/FileBackend.php
includes/filebackend/FileBackendMultiWrite.php
includes/filebackend/FileBackendStore.php
includes/filebackend/MemoryFileBackend.php
includes/filebackend/SwiftFileBackend.php
includes/filebackend/lockmanager/LSLockManager.php [deleted file]
includes/filerepo/FileRepo.php
includes/filerepo/LocalRepo.php
includes/htmlform/HTMLButtonField.php
includes/htmlform/HTMLCheckField.php
includes/htmlform/HTMLCheckMatrix.php
includes/htmlform/HTMLFormField.php
includes/htmlform/HTMLMultiSelectField.php
includes/htmlform/HTMLRadioField.php
includes/htmlform/HTMLSelectAndOtherField.php
includes/htmlform/HTMLSelectField.php
includes/htmlform/HTMLSelectOrOtherField.php
includes/htmlform/HTMLTextAreaField.php
includes/htmlform/HTMLTextField.php
includes/installer/Installer.i18n.php
includes/installer/Installer.php
includes/installer/PhpBugTests.php
includes/installer/WebInstallerPage.php
includes/job/JobQueue.php
includes/job/utils/BacklinkJobUtils.php
includes/libs/MultiHttpClient.php
includes/libs/XmlTypeCheck.php
includes/media/Bitmap.php
includes/normal/.gitignore [new file with mode: 0644]
includes/normal/Makefile
includes/normal/Utf8Case.php [deleted file]
includes/normal/Utf8CaseGenerate.php [deleted file]
includes/objectcache/DBABagOStuff.php [deleted file]
includes/objectcache/EhcacheBagOStuff.php [deleted file]
includes/objectcache/EmptyBagOStuff.php
includes/objectcache/HashBagOStuff.php
includes/objectcache/RedisBagOStuff.php
includes/parser/CoreParserFunctions.php
includes/parser/LinkHolderArray.php
includes/parser/Parser.php
includes/parser/ParserOptions.php
includes/parser/Tidy.php
includes/rcfeed/JSONRCFeedFormatter.php
includes/rcfeed/MachineReadableRCFeedFormatter.php [new file with mode: 0644]
includes/rcfeed/XMLRCFeedFormatter.php [new file with mode: 0644]
includes/resourceloader/ResourceLoader.php
includes/resourceloader/ResourceLoaderUserCSSPrefsModule.php
includes/search/SearchDatabase.php [new file with mode: 0644]
includes/search/SearchEngine.php
includes/search/SearchMssql.php
includes/search/SearchMySQL.php
includes/search/SearchOracle.php
includes/search/SearchPostgres.php
includes/search/SearchSqlite.php
includes/specialpage/ChangesListSpecialPage.php [new file with mode: 0644]
includes/specialpage/SpecialPageFactory.php [new file with mode: 0644]
includes/specials/SpecialAllmessages.php
includes/specials/SpecialBlock.php
includes/specials/SpecialBooksources.php
includes/specials/SpecialChangeEmail.php
includes/specials/SpecialChangePassword.php
includes/specials/SpecialDiff.php [new file with mode: 0644]
includes/specials/SpecialMovepage.php
includes/specials/SpecialRecentchanges.php
includes/specials/SpecialRecentchangeslinked.php
includes/specials/SpecialSearch.php
includes/specials/SpecialUserlogin.php
includes/specials/SpecialVersion.php
includes/specials/SpecialWatchlist.php
includes/upload/UploadBase.php
includes/utils/ArrayUtils.php
includes/utils/IP.php
languages/messages/MessagesAeb.php
languages/messages/MessagesAf.php
languages/messages/MessagesAn.php
languages/messages/MessagesAr.php
languages/messages/MessagesArz.php
languages/messages/MessagesAs.php
languages/messages/MessagesAst.php
languages/messages/MessagesAz.php
languages/messages/MessagesAzb.php
languages/messages/MessagesBa.php
languages/messages/MessagesBcc.php
languages/messages/MessagesBcl.php
languages/messages/MessagesBe.php
languages/messages/MessagesBe_tarask.php
languages/messages/MessagesBg.php
languages/messages/MessagesBjn.php
languages/messages/MessagesBn.php
languages/messages/MessagesBr.php
languages/messages/MessagesBs.php
languages/messages/MessagesCa.php
languages/messages/MessagesCe.php
languages/messages/MessagesCkb.php
languages/messages/MessagesCo.php
languages/messages/MessagesCs.php
languages/messages/MessagesCy.php
languages/messages/MessagesDa.php
languages/messages/MessagesDe.php
languages/messages/MessagesDiq.php
languages/messages/MessagesDsb.php
languages/messages/MessagesEgl.php
languages/messages/MessagesEl.php
languages/messages/MessagesEn.php
languages/messages/MessagesEo.php
languages/messages/MessagesEs.php
languages/messages/MessagesEt.php
languages/messages/MessagesEu.php
languages/messages/MessagesFa.php
languages/messages/MessagesFi.php
languages/messages/MessagesFr.php
languages/messages/MessagesFrp.php
languages/messages/MessagesFrr.php
languages/messages/MessagesGl.php
languages/messages/MessagesGsw.php
languages/messages/MessagesGu.php
languages/messages/MessagesHak.php
languages/messages/MessagesHe.php
languages/messages/MessagesHi.php
languages/messages/MessagesHif_latn.php
languages/messages/MessagesHil.php
languages/messages/MessagesHr.php
languages/messages/MessagesHsb.php
languages/messages/MessagesHu.php
languages/messages/MessagesHy.php
languages/messages/MessagesIa.php
languages/messages/MessagesId.php
languages/messages/MessagesIlo.php
languages/messages/MessagesIs.php
languages/messages/MessagesIt.php
languages/messages/MessagesJa.php
languages/messages/MessagesJv.php
languages/messages/MessagesKa.php
languages/messages/MessagesKab.php
languages/messages/MessagesKiu.php
languages/messages/MessagesKk_cyrl.php
languages/messages/MessagesKm.php
languages/messages/MessagesKo.php
languages/messages/MessagesKrc.php
languages/messages/MessagesKsh.php
languages/messages/MessagesLad.php
languages/messages/MessagesLb.php
languages/messages/MessagesLez.php
languages/messages/MessagesLi.php
languages/messages/MessagesLrc.php
languages/messages/MessagesLt.php
languages/messages/MessagesLv.php
languages/messages/MessagesLzh.php
languages/messages/MessagesMai.php
languages/messages/MessagesMap_bms.php
languages/messages/MessagesMg.php
languages/messages/MessagesMk.php
languages/messages/MessagesMl.php
languages/messages/MessagesMn.php
languages/messages/MessagesMr.php
languages/messages/MessagesMs.php
languages/messages/MessagesMt.php
languages/messages/MessagesNah.php
languages/messages/MessagesNan.php
languages/messages/MessagesNb.php
languages/messages/MessagesNds.php
languages/messages/MessagesNds_nl.php
languages/messages/MessagesNe.php
languages/messages/MessagesNl.php
languages/messages/MessagesNn.php
languages/messages/MessagesOc.php
languages/messages/MessagesOr.php
languages/messages/MessagesOs.php
languages/messages/MessagesPfl.php
languages/messages/MessagesPl.php
languages/messages/MessagesPms.php
languages/messages/MessagesPnb.php
languages/messages/MessagesPrg.php
languages/messages/MessagesPt.php
languages/messages/MessagesPt_br.php
languages/messages/MessagesQqq.php
languages/messages/MessagesQu.php
languages/messages/MessagesRm.php
languages/messages/MessagesRo.php
languages/messages/MessagesRoa_tara.php
languages/messages/MessagesRu.php
languages/messages/MessagesRue.php
languages/messages/MessagesSa.php
languages/messages/MessagesSah.php
languages/messages/MessagesScn.php
languages/messages/MessagesSh.php
languages/messages/MessagesSi.php
languages/messages/MessagesSk.php
languages/messages/MessagesSl.php
languages/messages/MessagesSq.php
languages/messages/MessagesSr_ec.php
languages/messages/MessagesSr_el.php
languages/messages/MessagesStq.php
languages/messages/MessagesSv.php
languages/messages/MessagesSzl.php
languages/messages/MessagesTa.php
languages/messages/MessagesTe.php
languages/messages/MessagesTh.php
languages/messages/MessagesTk.php
languages/messages/MessagesTl.php
languages/messages/MessagesTr.php
languages/messages/MessagesTru.php
languages/messages/MessagesUg_arab.php
languages/messages/MessagesUk.php
languages/messages/MessagesUz.php
languages/messages/MessagesVec.php
languages/messages/MessagesVep.php
languages/messages/MessagesVi.php
languages/messages/MessagesWar.php
languages/messages/MessagesWo.php
languages/messages/MessagesYi.php
languages/messages/MessagesYo.php
languages/messages/MessagesYue.php
languages/messages/MessagesZh_hans.php
languages/messages/MessagesZh_hant.php
maintenance/copyFileBackend.php
maintenance/dictionary/mediawiki.dic
maintenance/findHooks.php
maintenance/getConfiguration.php
maintenance/jsduck/MetaTags.rb
maintenance/jsduck/categories.json
maintenance/jsduck/config.json
maintenance/language/generateNormalizerData.php [deleted file]
maintenance/language/generateNormalizerDataAr.php [new file with mode: 0644]
maintenance/language/generateNormalizerDataMl.php [new file with mode: 0644]
maintenance/language/generateUtf8Case.php [new file with mode: 0644]
maintenance/language/messageTypes.inc
maintenance/language/messages.inc
maintenance/locking/LockServerDaemon.php [deleted file]
maintenance/rebuildrecentchanges.php
maintenance/update.php
resources/Makefile
resources/Resources.php
resources/jquery/jquery.jStorage.js
resources/jquery/jquery.makeCollapsible.css
resources/mediawiki.action/mediawiki.action.history.js
resources/mediawiki.action/mediawiki.action.view.metadata.js
resources/mediawiki.api/mediawiki.api.category.js
resources/mediawiki.language/languages/bs.js
resources/mediawiki.language/languages/dsb.js
resources/mediawiki.language/languages/fi.js
resources/mediawiki.language/languages/ga.js
resources/mediawiki.language/languages/he.js
resources/mediawiki.language/languages/hsb.js
resources/mediawiki.language/languages/hu.js
resources/mediawiki.language/languages/hy.js
resources/mediawiki.language/languages/la.js
resources/mediawiki.language/languages/os.js
resources/mediawiki.language/languages/ru.js
resources/mediawiki.language/languages/sl.js
resources/mediawiki.language/languages/uk.js
resources/mediawiki.language/mediawiki.cldr.js
resources/mediawiki.language/mediawiki.language.init.js
resources/mediawiki.language/mediawiki.language.js
resources/mediawiki.language/mediawiki.language.months.js
resources/mediawiki.language/mediawiki.language.numbers.js
resources/mediawiki.less/mediawiki.mixins.less
resources/mediawiki.page/mediawiki.page.gallery.js
resources/mediawiki.page/mediawiki.page.image.pagination.js
resources/mediawiki.special/mediawiki.special.changeslist.css
resources/mediawiki.special/mediawiki.special.changeslist.js [deleted file]
resources/mediawiki.special/mediawiki.special.changeslist.legend.css [new file with mode: 0644]
resources/mediawiki.special/mediawiki.special.changeslist.legend.js [new file with mode: 0644]
resources/mediawiki.special/mediawiki.special.javaScriptTest.js
resources/mediawiki.special/mediawiki.special.preferences.js
resources/mediawiki.special/mediawiki.special.search.js
resources/mediawiki.special/mediawiki.special.upload.js
resources/mediawiki/mediawiki.Title.js
resources/mediawiki/mediawiki.Uri.js
resources/mediawiki/mediawiki.debug.js
resources/mediawiki/mediawiki.htmlform.js
resources/mediawiki/mediawiki.jqueryMsg.js
resources/mediawiki/mediawiki.js
resources/mediawiki/mediawiki.searchSuggest.js
resources/mediawiki/mediawiki.util.js
serialized/.gitignore [new file with mode: 0644]
serialized/Makefile
serialized/serialize.php [deleted file]
skins/.gitignore [new file with mode: 0644]
skins/Vector.php
skins/vector/collapsibleNav.less [deleted file]
skins/vector/components/collapsibleNav.less [new file with mode: 0644]
skins/vector/components/common.less [new file with mode: 0644]
skins/vector/components/externalLinks.less [new file with mode: 0644]
skins/vector/components/footer.less [new file with mode: 0644]
skins/vector/components/navigation.less [new file with mode: 0644]
skins/vector/components/notifications.less [new file with mode: 0644]
skins/vector/components/personalMenu.less [new file with mode: 0644]
skins/vector/components/search.less [new file with mode: 0644]
skins/vector/components/tabs.less [new file with mode: 0644]
skins/vector/components/watchstar.less [new file with mode: 0644]
skins/vector/externalLinks.less [deleted file]
skins/vector/images/page-fade.png [deleted file]
skins/vector/screen.less [deleted file]
skins/vector/styles.less
skins/vector/variables.less
tests/TestsAutoLoader.php
tests/parser/parserTests.txt
tests/phpunit/MediaWikiTestCase.php
tests/phpunit/data/autoloader/TestAutoloadedAliasedClassNew.php [deleted file]
tests/phpunit/includes/ArrayUtilsTest.php [new file with mode: 0644]
tests/phpunit/includes/BlockTest.php
tests/phpunit/includes/CollationTest.php
tests/phpunit/includes/DiffHistoryBlobTest.php
tests/phpunit/includes/HtmlFormatterTest.php
tests/phpunit/includes/MWTimestampTest.php [new file with mode: 0644]
tests/phpunit/includes/StatusTest.php
tests/phpunit/includes/TimestampTest.php [deleted file]
tests/phpunit/includes/UserTest.php
tests/phpunit/includes/api/format/ApiFormatPhpTest.php
tests/phpunit/includes/filebackend/FileBackendTest.php
tests/phpunit/includes/jobqueue/RefreshLinksPartitionTest.php
tests/phpunit/includes/media/BitmapMetadataHandlerTest.php
tests/phpunit/includes/media/ExifBitmapTest.php
tests/phpunit/includes/media/ExifRotationTest.php
tests/phpunit/includes/media/ExifTest.php
tests/phpunit/includes/media/FormatMetadataTest.php
tests/phpunit/includes/media/JpegTest.php
tests/phpunit/includes/media/TiffTest.php
tests/phpunit/includes/media/XMPTest.php
tests/phpunit/includes/utils/IPTest.php
tests/phpunit/structure/AutoLoaderTest.php
tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js

index 19bbdc7..0bb6bee 100644 (file)
@@ -28,6 +28,7 @@ production.
   should be updated if LBFactory_Simple or LBFactory_Multi is configured.
 * $wgPasswordSenderName has been deprecated. To set a custom mailer name,
   the system message 'emailsender' should be modified (default: "{{SITENAME}}").
+* $wgDBAhandler was removed as the only class using it was also removed
 
 === New features in 1.23 ===
 * ResourceLoader can utilize the Web Storage API to cache modules client-side.
@@ -74,6 +75,9 @@ production.
 * WikitextContent will now render redirects with the expected "redirect"
   header, rather than as an ordered list. Code calling Article::viewRedirect
   can probably be changed to no longer special-case redirects.
+* [[Special:Diff]] was added, allowing users to create internal links to
+  revision comparison pages using syntax such as [[Special:Diff/12345]],
+  [[Special:Diff/12345/prev]] or [[Special:Diff/12345/98765]].
 
 === Bug fixes in 1.23 ===
 * (bug 41759) The "updated since last visit" markers (on history pages, recent
@@ -102,6 +106,10 @@ production.
   remaining page content.
 * (bug 23542) imagelinks now stores both the redirect and target (as
   templatelinks does).
+* (bug 58167) The web installer no longer throws an exception when PHP is
+  compiled without support for MySQL yet with support for another DBMS.
+* (bug 56199) Raw option of parser functions must now match complete word,
+  to take effect.
 
 === Web API changes in 1.23 ===
 * (bug 54884) action=parse&prop=categories now indicates hidden and missing
@@ -120,6 +128,24 @@ production.
 * All API modules now support an assert parameter. See the new features section
   for more details.
 * Added prop=contributors to fetch the list of contributors to the page.
+* The following API modules will now return entries where fields have been
+  revision-deleted: list=deletedrevs, list=filearchive, list=recentchanges,
+  list=watchlist. "hidden" indicators will be included, in the same style as is
+  already done for prop=revisions.
+* The following API modules will now return the content of revision-deleted
+  fields, in addition to the "hidden" indicators, if the querying user has the
+  necessary rights: list=logevents, list=usercontribs, prop=imageinfo,
+  prop=revisions.
+* The above modules, where applicable, will now return entries filtered by
+  revision-deleted fields if the querying user has the necessary rights. For
+  example, prop=revisions with rvuser or rvexcludeuser will no longer skip
+  revisions where the user was revision-deleted if the current user has the
+  deletedhistory right.
+* The 'hideuser' right, used when blocking, is no longer necessary or
+  sufficient for seeing contributions with revision-deleted in
+  list=usercontribs.
+* list=watchlist now uses the querying user's rights rather than the wlowner's
+  rights when checking whether wlprop=patrol is allowed.
 
 === Languages updated in 1.23 ===
 
@@ -157,10 +183,28 @@ changes to languages because of Bugzilla reports.
 * A page_links_updated field has been added to the page table.
 * SpecialPage::getTitle has been deprecated in favor of
   SpecialPage::getPageTitle.
+* BREAKING CHANGE: Two potentially backwards-incompatible changes have been made
+  to the 'SpecialWatchlistQuery' hook's last parameter (array $values) to make
+  the hook more consistent with the 'SpecialRecentChangesQuery' one:
+** Several array keys have been renamed: hideMinor → hideminor,
+   hideBots → hidebots, hideAnons → hideanons, hideLiu → hideliu,
+   hidePatrolled → hidepatrolled, hideOwn → hidemyself.
+** The parameter value is now a FormOptions object, not a plain array (array
+   access operators should continue to work, as it implements the ArrayAccess
+   interface).
+* Option to mark hooks as deprecated has been added.
+* (bug 52811) Preference "Enable section editing via [edit] links" was removed.
+* (bug 52813) Preference "Show table of contents (for pages with more than
+  3 headings)" was removed.
 
 ==== Removed classes ====
-* TitleDependency
-* TitleListDependency
+* FakeMemCachedClient (deprecated in 1.18)
+* RdfMetaData (unused)
+* TitleDependency (unused)
+* TitleListDependency (unused)
+* WikiError (deprecated in 1.17)
+* WikiXmlError (deprecated in 1.17)
+* WikiErrorMsg (deprecated in 1.17)
 
 ==== Renamed classes ====
 * CdbReader_DBA to CdbReaderDBA
@@ -192,15 +236,38 @@ changes to languages because of Bugzilla reports.
 * wikiStatsOutput to WikiStatsOutput
 
 ==== Removed methods ====
+* ApiBase::getValidNamespaces() (deprecated in 1.17)
+* ApiMain::setCachePrivate() (deprecated in 1.17)
+* ApiMain::setVaryCookie (deprecated in 1.17)
+* Article::doRedirect() (deprecated in 1.18)
+* Article::doUnwatch() (deprecated in 1.18)
+* Article::doWatch() (deprecated in 1.18)
+* Article::forUpdate() (deprecated in 1.18)
+* Article::markpatrolled() (deprecated in 1.18)
+* Article::unwatch() (deprecated in 1.18)
+* Article::watch() (deprecated in 1.18)
+* Block::clear() (deprecated in 1.18)
+* Block::decodeExpiry() (deprecated in 1.18)
+* Block::encodeExpiry() (deprecated in 1.18)
+* Block::forUpdate() (deprecated in 1.18)
+* Block::infinity() (deprecated in 1.18)
+* Block::load() (deprecated in 1.18)
+* Block::newFromDB() (deprecated in 1.18)
+* Block::normaliseRange() (deprecated in 1.18)
+* Block::parseExpiryInput() (deprecated in 1.18)
+* CategoryViewer::addSubcategory() (deprecated in 1.17)
 * EditPage::spamPage() (deprecated since 1.17)
 * Exif::getFormattedData() (deprecated in 1.18)
 * Exif::makeFormattedData() (deprecated in 1.18)
+* in_string (deprecated in 1.21)
 * Language::convertLinkToAllVariants() (deprecated in 1.17)
 * LanguageConverter::convertLinkToAllVariants() (deprecated in 1.17)
 * Linker::makeBrokenLink() (deprecated in 1.16)
 * Linker::makeBrokenLinkObj() (deprecated in 1.16)
 * Linker::makeColouredLinkObj() (deprecated in 1.16)
 * Linker::makeSizeLinkObj() (deprecated in 1.17)
+* MediaWiki::articleFromTitle() (deprecated in 1.18)
+* ParserOptions::getkin() (deprecated 1.18)
 * ProfilerSimple::getCpuTime (deprecated in 1.20)
 * Revision::revText() (deprecated in 1.17)
 * SkinTemplate::jstext() (deprecated in 1.21)
@@ -230,10 +297,19 @@ changes to languages because of Bugzilla reports.
 * SpecialRecentChanges::feedSetup()
 * SpecialRevisionDelete::extractBitField() (deprecated in 1.22)
 * User::getPageRenderingHash() (deprecated in 1.17)
+* WebRequest::getFileSize() (deprecated in 1.17)
+* WebRequest::isPathInfoBad() (deprecated in 1.17)
+* wfGenerateToken (deprecated in 1.20)
+* wfStreamFile (deprecated in 1.19)
+* wfUILang (deprecated in 1.18)
+* WikiPage::createUpdates() (deprecated in 1.18)
 * WikiPage::quickEdit() (deprecated in 1.18)
 * WikiPage::useParserCache() (deprecated in 1.18)
 * WikiPage::viewUpdates() (deprecated in 1.18)
 
+==== Removed globals ====
+* $wgBetterDirectionality (deprecated in 1.18)
+
 == Compatibility ==
 
 MediaWiki 1.23 requires PHP 5.3.2 or later.
index 6c4d37f..cf63678 100644 (file)
@@ -3,9 +3,9 @@
                "php": ">=5.3.2"
        },
        "suggest": {
-               "ext-fileinfo": "*",
-               "ext-mbstring": "*",
-               "ext-wikidiff2": "*",
-               "ext-apc": "*"
+               "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)"
        }
 }
index 9dcd2f3..4a43359 100644 (file)
@@ -269,6 +269,9 @@ $reason: the reason for the move (added in 1.13)
 'AbortNewAccount': Return false to cancel explicit account creation.
 $user: the User object about to be created (read-only, incomplete)
 &$msg: out parameter: HTML to display on abort
+&$status: out parameter: Status object to return, replaces the older $msg param (added in 1.23)
+          Create the object with Status::newFatal() to ensure proper API error messages
+          are returned when creating account through API clients.
 
 'AbortTalkPageEmailNotification': Return false to cancel talk page email notification
 $targetUser: the user whom to send talk page email notification
@@ -295,6 +298,15 @@ $article: Article object
 $user: the User object that was created. (Parameter added in 1.7)
 $byEmail: true when account was created "by email" (added in 1.12)
 
+'AddNewAccountApiForm': Allow modifying internal login form when creating an account via API.
+$apiModule: the ApiCreateAccount module calling
+$loginForm: the LoginForm used
+
+'AddNewAccountApiResult': Modify API output when creating a new account via API.
+$apiModule: the ApiCreateAccount module calling
+$loginForm: the LoginForm used
+&$result: associative array for API result data
+
 'AfterFinalPageOutput': At the end of OutputPage::output() but before final
 ob_end_flush() which will send the buffered output to the client. This allows
 for last-minute modification of the output within the buffer by using
@@ -529,6 +541,7 @@ $wikiPage: WikiPage (object) being modified
 Wiki::articleFromTitle().
 $title: Title (object) used to create the article object
 $article: Article (object) that will be returned
+$context: IContextSource (object)
 
 'ArticleInsertComplete': After a new article is created. DEPRECATED, use
 PageContentInsertComplete.
@@ -763,6 +776,7 @@ $block: Block object (which is set to be autoblocking)
 'BlockIp': Before an IP address or user is blocked.
 $block: the Block object about to be saved
 $user: the user _doing_ the block (not the one being blocked)
+&$reason: if the hook is aborted, the error message to be returned in an array
 
 'BlockIpComplete': After an IP address or user is blocked.
 $block: the Block object that was saved
@@ -2407,7 +2421,7 @@ $special: the special page object
 &$tables: array of tables to be queried
 &$join_conds: join conditions for the tables
 &$fields: array of query fields
-$values: array of variables with watchlist options
+$opts: A FormOptions object with watchlist options for the current request
 
 'SpecialWatchlistGetNonRevisionTypes': Called when building sql query for
 SpecialWatchlist. Allows extensions to register custom values they have
index 2d2db9a..72a7dab 100644 (file)
@@ -92,12 +92,17 @@ function wfImageAuthMain() {
                if ( strpos( $path, $prefix ) === 0 ) {
                        $be = FileBackendGroup::singleton()->backendFromPath( $storageDir );
                        $filename = $storageDir . substr( $path, strlen( $prefix ) ); // strip prefix
+                       // Check basic user authorization
+                       if ( !RequestContext::getMain()->getUser()->isAllowed( 'read' ) ) {
+                               wfForbidden( 'img-auth-accessdenied', 'img-auth-noread', $path );
+                               return;
+                       }
                        if ( $be->fileExists( array( 'src' => $filename ) ) ) {
                                wfDebugLog( 'img_auth', "Streaming `" . $filename . "`." );
                                $be->streamFile( array( 'src' => $filename ),
                                        array( 'Cache-Control: private', 'Vary: Cookie' ) );
                        } else {
-                               wfForbidden( 'img-auth-accessdenied', 'img-auth-nofile', $filename );
+                               wfForbidden( 'img-auth-accessdenied', 'img-auth-nofile', $path );
                        }
                        return;
                }
index ce6407a..a5d4d5b 100644 (file)
@@ -158,7 +158,7 @@ class Article implements Page {
                }
 
                $page = null;
-               wfRunHooks( 'ArticleFromTitle', array( &$title, &$page ) );
+               wfRunHooks( 'ArticleFromTitle', array( &$title, &$page, $context ) );
                if ( !$page ) {
                        switch ( $title->getNamespace() ) {
                                case NS_FILE:
@@ -460,14 +460,6 @@ class Article implements Page {
                return $this->mContentObject;
        }
 
-       /**
-        * No-op
-        * @deprecated since 1.18
-        */
-       public function forUpdate() {
-               wfDeprecated( __METHOD__, '1.18' );
-       }
-
        /**
         * Returns true if the currently-referenced revision is the current edit
         * to this page (and it exists).
@@ -980,7 +972,7 @@ class Article implements Page {
                                $outputPage->addSubtitle( wfMessage( 'redirectedfrom' )->rawParams( $redir ) );
 
                                // Set the fragment if one was specified in the redirect
-                               if ( strval( $this->getTitle()->getFragment() ) != '' ) {
+                               if ( $this->getTitle()->hasFragment() ) {
                                        $outputPage->addJsConfigVars( 'wgRedirectToFragment', $this->getTitle()->getFragmentForURL() );
                                        $outputPage->addModules( 'mediawiki.action.view.redirectToFragment' );
                                }
@@ -1620,7 +1612,8 @@ class Article implements Page {
                $outputPage->setPageTitle( wfMessage( 'delete-confirm', $this->getTitle()->getPrefixedText() ) );
                $outputPage->addBacklinkSubtitle( $this->getTitle() );
                $outputPage->setRobotPolicy( 'noindex,nofollow' );
-               if ( $this->getTitle()->getBacklinkCache()->hasLinks( 'pagelinks' ) ) {
+               $backlinkCache = $this->getTitle()->getBacklinkCache();
+               if ( $backlinkCache->hasLinks( 'pagelinks' ) || $backlinkCache->hasLinks( 'templatelinks' ) ) {
                        $outputPage->wrapWikiMsg( "<div class='mw-warning plainlinks'>\n$1\n</div>\n",
                                'deleting-backlinks-warning' );
                }
@@ -1898,15 +1891,6 @@ class Article implements Page {
                Action::factory( 'info', $this )->show();
        }
 
-       /**
-        * Mark this particular edit/page as patrolled
-        * @deprecated since 1.18
-        */
-       public function markpatrolled() {
-               wfDeprecated( __METHOD__, '1.18' );
-               Action::factory( 'markpatrolled', $this )->show();
-       }
-
        /**
         * Handle action=purge
         * @deprecated since 1.19
@@ -1934,72 +1918,6 @@ class Article implements Page {
                Action::factory( 'rollback', $this )->show();
        }
 
-       /**
-        * User-interface handler for the "watch" action.
-        * Requires Request to pass a token as of 1.18.
-        * @deprecated since 1.18
-        */
-       public function watch() {
-               wfDeprecated( __METHOD__, '1.18' );
-               Action::factory( 'watch', $this )->show();
-       }
-
-       /**
-        * Add this page to the current user's watchlist
-        *
-        * This is safe to be called multiple times
-        *
-        * @return bool true on successful watch operation
-        * @deprecated since 1.18
-        */
-       public function doWatch() {
-               wfDeprecated( __METHOD__, '1.18' );
-               return WatchAction::doWatch( $this->getTitle(), $this->getContext()->getUser() );
-       }
-
-       /**
-        * User interface handler for the "unwatch" action.
-        * Requires Request to pass a token as of 1.18.
-        * @deprecated since 1.18
-        */
-       public function unwatch() {
-               wfDeprecated( __METHOD__, '1.18' );
-               Action::factory( 'unwatch', $this )->show();
-       }
-
-       /**
-        * Stop watching a page
-        * @return bool true on successful unwatch
-        * @deprecated since 1.18
-        */
-       public function doUnwatch() {
-               wfDeprecated( __METHOD__, '1.18' );
-               return WatchAction::doUnwatch( $this->getTitle(), $this->getContext()->getUser() );
-       }
-
-       /**
-        * Output a redirect back to the article.
-        * This is typically used after an edit.
-        *
-        * @deprecated in 1.18; call OutputPage::redirect() directly
-        * @param $noRedir Boolean: add redirect=no
-        * @param string $sectionAnchor section to redirect to, including "#"
-        * @param string $extraQuery extra query params
-        */
-       public function doRedirect( $noRedir = false, $sectionAnchor = '', $extraQuery = '' ) {
-               wfDeprecated( __METHOD__, '1.18' );
-               if ( $noRedir ) {
-                       $query = 'redirect=no';
-                       if ( $extraQuery ) {
-                               $query .= "&$extraQuery";
-                       }
-               } else {
-                       $query = $extraQuery;
-               }
-
-               $this->getContext()->getOutput()->redirect( $this->getTitle()->getFullURL( $query ) . $sectionAnchor );
-       }
-
        /**
         * Use PHP's magic __get handler to handle accessing of
         * raw WikiPage fields for backwards compatibility.
index 28c85b7..dabcc5c 100644 (file)
@@ -47,6 +47,7 @@ $wgAutoloadLocalClasses = array(
        'CategoryPage' => 'includes/CategoryPage.php',
        'CategoryViewer' => 'includes/CategoryViewer.php',
        'ChangesFeed' => 'includes/ChangesFeed.php',
+       'ChangesListSpecialPage' => 'includes/specialpage/ChangesListSpecialPage.php',
        'ChangeTags' => 'includes/ChangeTags.php',
        'ChannelFeed' => 'includes/Feed.php',
        'Collation' => 'includes/Collation.php',
@@ -174,7 +175,6 @@ $wgAutoloadLocalClasses = array(
        'QueryPage' => 'includes/QueryPage.php',
        'QuickTemplate' => 'includes/SkinTemplate.php',
        'RawMessage' => 'includes/Message.php',
-       'RdfMetaData' => 'includes/Metadata.php',
        'ReadOnlyError' => 'includes/Exception.php',
        'RedirectSpecialArticle' => 'includes/specialpage/RedirectSpecialPage.php',
        'RedirectSpecialPage' => 'includes/specialpage/RedirectSpecialPage.php',
@@ -200,7 +200,7 @@ $wgAutoloadLocalClasses = array(
        'SpecialMyuploads' => 'includes/specials/SpecialMyRedirectPages.php',
        'SpecialAllMyUploads' => 'includes/specials/SpecialMyRedirectPages.php',
        'SpecialPage' => 'includes/specialpage/SpecialPage.php',
-       'SpecialPageFactory' => 'includes/SpecialPageFactory.php',
+       'SpecialPageFactory' => 'includes/specialpage/SpecialPageFactory.php',
        'SpecialRedirectToSpecial' => 'includes/specialpage/RedirectSpecialPage.php',
        'SquidPurgeClient' => 'includes/SquidPurgeClient.php',
        'SquidPurgeClientPool' => 'includes/SquidPurgeClient.php',
@@ -211,8 +211,8 @@ $wgAutoloadLocalClasses = array(
        'StubObject' => 'includes/StubObject.php',
        'StubUserLang' => 'includes/StubObject.php',
        'TablePager' => 'includes/Pager.php',
-       'MWTimestamp' => 'includes/Timestamp.php',
-       'TimestampException' => 'includes/Timestamp.php',
+       'MWTimestamp' => 'includes/MWTimestamp.php',
+       'TimestampException' => 'includes/TimestampException.php',
        'Title' => 'includes/Title.php',
        'TitleArray' => 'includes/TitleArray.php',
        'TitleArrayFromResult' => 'includes/TitleArray.php',
@@ -234,8 +234,6 @@ $wgAutoloadLocalClasses = array(
        'WebRequestUpload' => 'includes/WebRequest.php',
        'WebResponse' => 'includes/WebResponse.php',
        'WikiCategoryPage' => 'includes/WikiCategoryPage.php',
-       'WikiError' => 'includes/WikiError.php',
-       'WikiErrorMsg' => 'includes/WikiError.php',
        'WikiExporter' => 'includes/Export.php',
        'WikiFilePage' => 'includes/WikiFilePage.php',
        'WikiImporter' => 'includes/Import.php',
@@ -243,13 +241,11 @@ $wgAutoloadLocalClasses = array(
        'WikiRevision' => 'includes/Import.php',
        'WikiMap' => 'includes/WikiMap.php',
        'WikiReference' => 'includes/WikiMap.php',
-       'WikiXmlError' => 'includes/WikiError.php',
        'Xml' => 'includes/Xml.php',
        'XmlDumpWriter' => 'includes/Export.php',
        'XmlJsCode' => 'includes/Xml.php',
        'XMLReader2' => 'includes/Import.php',
        'XmlSelect' => 'includes/Xml.php',
-       'ZhClient' => 'includes/ZhClient.php',
 
        # includes/actions
        'CachedAction' => 'includes/actions/CachedAction.php',
@@ -563,7 +559,6 @@ $wgAutoloadLocalClasses = array(
        'ScopedLock' => 'includes/filebackend/lockmanager/ScopedLock.php',
        'FSLockManager' => 'includes/filebackend/lockmanager/FSLockManager.php',
        'DBLockManager' => 'includes/filebackend/lockmanager/DBLockManager.php',
-       'LSLockManager' => 'includes/filebackend/lockmanager/LSLockManager.php',
        'MemcLockManager' => 'includes/filebackend/lockmanager/MemcLockManager.php',
        'QuorumLockManager' => 'includes/filebackend/lockmanager/QuorumLockManager.php',
        'MySqlLockManager' => 'includes/filebackend/lockmanager/DBLockManager.php',
@@ -615,7 +610,6 @@ $wgAutoloadLocalClasses = array(
        'MysqlUpdater' => 'includes/installer/MysqlUpdater.php',
        'OracleInstaller' => 'includes/installer/OracleInstaller.php',
        'OracleUpdater' => 'includes/installer/OracleUpdater.php',
-       'PhpRefCallBugTester' => 'includes/installer/PhpBugTests.php',
        'PhpXmlBugTester' => 'includes/installer/PhpBugTests.php',
        'PostgresInstaller' => 'includes/installer/PostgresInstaller.php',
        'PostgresUpdater' => 'includes/installer/PostgresUpdater.php',
@@ -771,10 +765,7 @@ $wgAutoloadLocalClasses = array(
        # includes/objectcache
        'APCBagOStuff' => 'includes/objectcache/APCBagOStuff.php',
        'BagOStuff' => 'includes/objectcache/BagOStuff.php',
-       'DBABagOStuff' => 'includes/objectcache/DBABagOStuff.php',
-       'EhcacheBagOStuff' => 'includes/objectcache/EhcacheBagOStuff.php',
        'EmptyBagOStuff' => 'includes/objectcache/EmptyBagOStuff.php',
-       'FakeMemCachedClient' => 'includes/objectcache/EmptyBagOStuff.php',
        'HashBagOStuff' => 'includes/objectcache/HashBagOStuff.php',
        'MediaWikiBagOStuff' => 'includes/objectcache/SqlBagOStuff.php',
        'MemCachedClientforWiki' => 'includes/objectcache/MemcachedClient.php',
@@ -845,6 +836,8 @@ $wgAutoloadLocalClasses = array(
        'RCFeedFormatter' => 'includes/rcfeed/RCFeedFormatter.php',
        'IRCColourfulRCFeedFormatter' => 'includes/rcfeed/IRCColourfulRCFeedFormatter.php',
        'JSONRCFeedFormatter' => 'includes/rcfeed/JSONRCFeedFormatter.php',
+       'XMLRCFeedFormatter' => 'includes/rcfeed/XMLRCFeedFormatter.php',
+       'MachineReadableRCFeedFormatter' => 'includes/rcfeed/MachineReadableRCFeedFormatter.php',
 
        # includes/resourceloader
        'ResourceLoader' => 'includes/resourceloader/ResourceLoader.php',
@@ -888,6 +881,7 @@ $wgAutoloadLocalClasses = array(
        'MySQLSearchResultSet' => 'includes/search/SearchMySQL.php',
        'PostgresSearchResult' => 'includes/search/SearchPostgres.php',
        'PostgresSearchResultSet' => 'includes/search/SearchPostgres.php',
+       'SearchDatabase' => 'includes/search/SearchDatabase.php',
        'SearchEngine' => 'includes/search/SearchEngine.php',
        'SearchEngineDummy' => 'includes/search/SearchEngine.php',
        'SearchHighlighter' => 'includes/search/SearchEngine.php',
@@ -971,6 +965,7 @@ $wgAutoloadLocalClasses = array(
        'SpecialChangePassword' => 'includes/specials/SpecialChangePassword.php',
        'SpecialComparePages' => 'includes/specials/SpecialComparePages.php',
        'SpecialContributions' => 'includes/specials/SpecialContributions.php',
+       'SpecialDiff' => 'includes/specials/SpecialDiff.php',
        'SpecialEditWatchlist' => 'includes/specials/SpecialEditWatchlist.php',
        'SpecialEmailUser' => 'includes/specials/SpecialEmailuser.php',
        'SpecialExpandTemplates' => 'includes/specials/SpecialExpandTemplates.php',
@@ -1212,32 +1207,6 @@ class AutoLoader {
                        return;
                }
 
-               if ( substr( $filename, 0, 6 ) === 'alias:' ) {
-                       // Supported alias formats:
-                       // - No deprecation warning: alias:MyNewClassName
-                       // - Deprecated in MediaWiki 1.1: alias:MyNewClassName?v=1.1
-                       // - Deprecated in MyExtension 1.1: alias:MyNewClassName?c=MyExtension&v=1.1
-                       $parts = explode( '?', substr( $filename, 6 ), 2 );
-                       $newClassName = $parts[0];
-
-                       // If necessary, this will make a recursive call to this function to
-                       // load the class using its actual, canonical name.
-                       class_alias( $newClassName, $className );
-
-                       if ( isset( $parts[1] ) && function_exists( 'wfDeprecated' ) ) {
-                               $info = wfCgiToArray( $parts[1] );
-                               $function = "name $className for class $newClassName";
-                               $version = isset( $info['v'] ) ? $info['v'] : false;
-                               $component = isset( $info['c'] ) ? $info['c'] : false;
-
-                               // https://github.com/facebook/hhvm/issues/1018
-                               $callerOffset = wfIsHHVM() ? 2 : 3;
-                               wfDeprecated( $function, $version, $component, $callerOffset );
-                       }
-
-                       return;
-               }
-
                # Make an absolute path, this improves performance by avoiding some stat calls
                if ( substr( $filename, 0, 1 ) != '/' && substr( $filename, 1, 1 ) != ':' ) {
                        global $IP;
index 8673a3d..3c22f9b 100644 (file)
@@ -101,21 +101,6 @@ class Block {
                $this->mFromMaster = false;
        }
 
-       /**
-        * Load a block from the database, using either the IP address or
-        * user ID. Tries the user ID first, and if that doesn't work, tries
-        * the address.
-        *
-        * @param string $address IP address of user/anon
-        * @param $user Integer: user id of user
-        * @return Block Object
-        * @deprecated since 1.18
-        */
-       public static function newFromDB( $address, $user = 0 ) {
-               wfDeprecated( __METHOD__, '1.18' );
-               return self::newFromTarget( User::whoIs( $user ), $address );
-       }
-
        /**
         * Load a blocked user from their block id.
         *
@@ -186,44 +171,6 @@ class Block {
                );
        }
 
-       /**
-        * Clear all member variables in the current object. Does not clear
-        * the block from the DB.
-        * @deprecated since 1.18
-        */
-       public function clear() {
-               wfDeprecated( __METHOD__, '1.18' );
-               # Noop
-       }
-
-       /**
-        * Get a block from the DB, with either the given address or the given username
-        *
-        * @param string $address The IP address of the user, or blank to skip IP blocks
-        * @param int $user The user ID, or zero for anonymous users
-        * @return Boolean: the user is blocked from editing
-        * @deprecated since 1.18
-        */
-       public function load( $address = '', $user = 0 ) {
-               wfDeprecated( __METHOD__, '1.18' );
-               if ( $user ) {
-                       $username = User::whoIs( $user );
-                       $block = self::newFromTarget( $username, $address );
-               } else {
-                       $block = self::newFromTarget( null, $address );
-               }
-
-               if ( $block instanceof Block ) {
-                       # This is mildly evil, but hey, it's B/C :D
-                       foreach ( $block as $variable => $value ) {
-                               $this->$variable = $value;
-                       }
-                       return true;
-               } else {
-                       return false;
-               }
-       }
-
        /**
         * Load a block from the database which affects the already-set $this->target:
         *     1) A block directly on the given user or IP
@@ -859,17 +806,6 @@ class Block {
                return $this->mId;
        }
 
-       /**
-        * Get/set the SELECT ... FOR UPDATE flag
-        * @deprecated since 1.18
-        *
-        * @param $x Bool
-        */
-       public function forUpdate( $x = null ) {
-               wfDeprecated( __METHOD__, '1.18' );
-               # noop
-       }
-
        /**
         * Get/set a flag determining whether the master is used for reads
         *
@@ -946,33 +882,6 @@ class Block {
                }
        }
 
-       /**
-        * Encode expiry for DB
-        *
-        * @param string $expiry timestamp for expiry, or
-        * @param $db DatabaseBase object
-        * @return String
-        * @deprecated since 1.18; use $dbw->encodeExpiry() instead
-        */
-       public static function encodeExpiry( $expiry, $db ) {
-               wfDeprecated( __METHOD__, '1.18' );
-               return $db->encodeExpiry( $expiry );
-       }
-
-       /**
-        * Decode expiry which has come from the DB
-        *
-        * @param string $expiry Database expiry format
-        * @param int $timestampType Requested timestamp format
-        * @return String
-        * @deprecated since 1.18; use $wgLang->formatExpiry() instead
-        */
-       public static function decodeExpiry( $expiry, $timestampType = TS_MW ) {
-               wfDeprecated( __METHOD__, '1.18' );
-               global $wgContLang;
-               return $wgContLang->formatExpiry( $expiry, $timestampType );
-       }
-
        /**
         * Get a timestamp of the expiry for autoblocks
         *
@@ -985,18 +894,6 @@ class Block {
                return wfTimestamp( TS_MW, wfTimestamp( TS_UNIX, $timestamp ) + $wgAutoblockExpiry );
        }
 
-       /**
-        * Gets rid of unneeded numbers in quad-dotted/octet IP strings
-        * For example, 127.111.113.151/24 -> 127.111.113.0/24
-        * @param string $range IP address to normalize
-        * @return string
-        * @deprecated since 1.18, call IP::sanitizeRange() directly
-        */
-       public static function normaliseRange( $range ) {
-               wfDeprecated( __METHOD__, '1.18' );
-               return IP::sanitizeRange( $range );
-       }
-
        /**
         * Purge expired blocks from the ipblocks table
         */
@@ -1013,29 +910,6 @@ class Block {
                } );
        }
 
-       /**
-        * Get a value to insert into expiry field of the database when infinite expiry
-        * is desired
-        * @deprecated since 1.18, call $dbr->getInfinity() directly
-        * @return String
-        */
-       public static function infinity() {
-               wfDeprecated( __METHOD__, '1.18' );
-               return wfGetDB( DB_SLAVE )->getInfinity();
-       }
-
-       /**
-        * Convert a submitted expiry time, which may be relative ("2 weeks", etc) or absolute
-        * ("24 May 2034"), into an absolute timestamp we can put into the database.
-        * @param string $expiry whatever was typed into the form
-        * @return String: timestamp or "infinity" string for th DB implementation
-        * @deprecated since 1.18 moved to SpecialBlock::parseExpiryInput()
-        */
-       public static function parseExpiryInput( $expiry ) {
-               wfDeprecated( __METHOD__, '1.18' );
-               return SpecialBlock::parseExpiryInput( $expiry );
-       }
-
        /**
         * Given a target and the target's type, get an existing Block object if possible.
         * @param $specificTarget String|User|Int a block target, which may be one of several types:
index 55d9c1e..4027bef 100644 (file)
@@ -181,15 +181,6 @@ class CategoryViewer extends ContextSource {
                        $this->getSubcategorySortChar( $cat->getTitle(), $sortkey );
        }
 
-       /**
-        * Add a subcategory to the internal lists, using a title object
-        * @deprecated since 1.17 kept for compatibility, use addSubcategoryObject instead
-        */
-       function addSubcategory( Title $title, $sortkey, $pageLength ) {
-               wfDeprecated( __METHOD__, '1.17' );
-               $this->addSubcategoryObject( Category::newFromTitle( $title ), $sortkey, $pageLength );
-       }
-
        /**
         * Get the character to be used for sorting subcategories.
         * If there's a link from Category:A to Category:B, the sortkey of the resulting
index 7204f31..b51256b 100644 (file)
@@ -333,7 +333,7 @@ class IcuCollation extends Collation {
                $sortKey = $this->getPrimarySortKey( $string );
 
                // Do a binary search to find the correct letter to sort under
-               $min = $this->findLowerBound(
+               $min = ArrayUtils::findLowerBound(
                        array( $this, 'getSortKeyByLetterIndex' ),
                        $this->getFirstLetterCount(),
                        'strcmp',
@@ -514,6 +514,8 @@ class IcuCollation extends Collation {
         * Do a binary search, and return the index of the largest item that sorts
         * less than or equal to the target value.
         *
+        * @deprecated in 1.22; use ArrayUtils::findLowerBound() instead
+        *
         * @param array $valueCallback A function to call to get the value with
         *     a given array index.
         * @param int $valueCount The number of items accessible via $valueCallback,
@@ -526,35 +528,8 @@ class IcuCollation extends Collation {
         *     sorts before all items.
         */
        function findLowerBound( $valueCallback, $valueCount, $comparisonCallback, $target ) {
-               if ( $valueCount === 0 ) {
-                       return false;
-               }
-
-               $min = 0;
-               $max = $valueCount;
-               do {
-                       $mid = $min + ( ( $max - $min ) >> 1 );
-                       $item = call_user_func( $valueCallback, $mid );
-                       $comparison = call_user_func( $comparisonCallback, $target, $item );
-                       if ( $comparison > 0 ) {
-                               $min = $mid;
-                       } elseif ( $comparison == 0 ) {
-                               $min = $mid;
-                               break;
-                       } else {
-                               $max = $mid;
-                       }
-               } while ( $min < $max - 1 );
-
-               if ( $min == 0 ) {
-                       $item = call_user_func( $valueCallback, $min );
-                       $comparison = call_user_func( $comparisonCallback, $target, $item );
-                       if ( $comparison < 0 ) {
-                               // Before the first item
-                               return false;
-                       }
-               }
-               return $min;
+               wfDeprecated( __METHOD__, '1.22' );
+               return ArrayUtils::findLowerBound( $valueCallback, $valueCount, $comparisonCallback, $target );
        }
 
        static function isCjk( $codepoint ) {
index 92ceb6f..9264947 100644 (file)
@@ -1945,9 +1945,6 @@ $wgCacheDirectory = false;
  *   - CACHE_DB:         Store cache objects in the DB
  *   - CACHE_MEMCACHED:  MemCached, must specify servers in $wgMemCachedServers
  *   - CACHE_ACCEL:      APC, XCache or WinCache
- *   - CACHE_DBA:        Use PHP's DBA extension to store in a DBM-style
- *                       database. This is slow, and is not recommended for
- *                       anything other than debugging.
  *   - (other):          A string may be used which identifies a cache
  *                       configuration in $wgObjectCaches.
  *
@@ -2000,15 +1997,10 @@ $wgLanguageConverterCacheType = CACHE_ANYTHING;
  * the value is an associative array of parameters. The "class" parameter is the
  * class name which will be used. Alternatively, a "factory" parameter may be
  * given, giving a callable function which will generate a suitable cache object.
- *
- * The other parameters are dependent on the class used.
- * - CACHE_DBA uses $wgTmpDirectory by default. The 'dir' parameter let you
- *   overrides that.
  */
 $wgObjectCaches = array(
        CACHE_NONE => array( 'class' => 'EmptyBagOStuff' ),
        CACHE_DB => array( 'class' => 'SqlBagOStuff', 'table' => 'objectcache' ),
-       CACHE_DBA => array( 'class' => 'DBABagOStuff' ),
 
        CACHE_ANYTHING => array( 'factory' => 'ObjectCache::newAnything' ),
        CACHE_ACCEL => array( 'factory' => 'ObjectCache::newAccelerator' ),
@@ -2028,12 +2020,6 @@ $wgObjectCaches = array(
  */
 $wgParserCacheExpireTime = 86400;
 
-/**
- * Select which DBA handler <http://www.php.net/manual/en/dba.requirements.php>
- * to use as CACHE_DBA backend.
- */
-$wgDBAhandler = 'db3';
-
 /**
  * Deprecated alias for $wgSessionsInObjectCache.
  *
@@ -3070,14 +3056,6 @@ $wgVectorUseIconWatch = true;
  */
 $wgEdititis = false;
 
-/**
- * Better directionality support (bug 6100 and related).
- * Removed in 1.18, still kept here for LiquidThreads backwards compatibility.
- *
- * @deprecated since 1.18
- */
-$wgBetterDirectionality = true;
-
 /**
  * Some web hosts attempt to rewrite all responses with a 404 (not found)
  * status code, mangling or hiding MediaWiki's output. If you are using such a
@@ -3988,8 +3966,8 @@ $wgReservedUsernames = array(
 /**
  * Settings added to this array will override the default globals for the user
  * preferences used by anonymous visitors and newly created accounts.
- * For instance, to disable section editing links:
- * $wgDefaultUserOptions ['editsection'] = 0;
+ * For instance, to disable editing on double clicks:
+ * $wgDefaultUserOptions ['editondblclick'] = 0;
  */
 $wgDefaultUserOptions = array(
        'ccmeonemails' => 0,
@@ -3999,7 +3977,6 @@ $wgDefaultUserOptions = array(
        'disablemail' => 0,
        'editfont' => 'default',
        'editondblclick' => 0,
-       'editsection' => 1,
        'editsectiononrightclick' => 0,
        'enotifminoredits' => 0,
        'enotifrevealaddr' => 0,
@@ -4028,7 +4005,6 @@ $wgDefaultUserOptions = array(
        'rows' => 25,
        'showhiddencats' => 0,
        'shownumberswatching' => 1,
-       'showtoc' => 1,
        'showtoolbar' => 1,
        'skin' => false,
        'stubthreshold' => 0,
@@ -4577,6 +4553,15 @@ $wgAvailableRights = array();
  */
 $wgDeleteRevisionsLimit = 0;
 
+/**
+ * The maximum number of edits a user can have and
+ * can still be hidden by users with the hideuser permission.
+ * This is limited for performance reason.
+ * Set to false to disable the limit.
+ * @since 1.23
+ */
+$wgHideUserContribLimit = 1000;
+
 /**
  * Number of accounts each IP address may create, 0 to disable.
  *
@@ -5494,7 +5479,7 @@ $wgGitBin = '/usr/bin/git';
  * @since 1.20
  */
 $wgGitRepositoryViewers = array(
-       'https://gerrit.wikimedia.org/r/p/(.*)' => 'https://git.wikimedia.org/commit/%r/%H',
+       'https://(?:[a-z0-9_]+@)?gerrit.wikimedia.org/r/(?:p/)?(.*)' => 'https://git.wikimedia.org/commit/%r/%H',
        'ssh://(?:[a-z0-9_]+@)?gerrit.wikimedia.org:29418/(.*)'
                => 'https://git.wikimedia.org/commit/%r/%H',
 );
@@ -5523,10 +5508,15 @@ $wgRCMaxAge = 13 * 7 * 24 * 3600;
 $wgRCFilterByAge = false;
 
 /**
- * List of Days and Limits options to list in the Special:Recentchanges and
+ * List of Limits options to list in the Special:Recentchanges and
  * Special:Recentchangeslinked pages.
  */
 $wgRCLinkLimits = array( 50, 100, 250, 500 );
+
+/**
+ * List of Days options to list in the Special:Recentchanges and
+ * Special:Recentchangeslinked pages.
+ */
 $wgRCLinkDays = array( 1, 3, 7, 14, 30 );
 
 /**
@@ -6603,12 +6593,45 @@ $wgDebugAPI = false;
  * API module extensions.
  * Associative array mapping module name to class name.
  * Extension modules may override the core modules.
- * @todo Describe each of the variables, group them and add examples
+ *
+ * See ApiMain::$Modules for a list of the core modules.
  */
 $wgAPIModules = array();
+
+/**
+ * API format module extensions.
+ * Associative array mapping format module name to class name.
+ * Extension modules may override the core modules.
+ *
+ * See ApiMain::$Formats for a list of the core format modules.
+ */
 $wgAPIFormatModules = array();
+
+/**
+ * API Query meta module extensions.
+ * Associative array mapping meta module name to class name.
+ * Extension modules may override the core modules.
+ *
+ * See ApiQuery::$QueryMetaModules for a list of the core meta modules.
+ */
 $wgAPIMetaModules = array();
+
+/**
+ * API Query prop module extensions.
+ * Associative array mapping properties module name to class name.
+ * Extension modules may override the core modules.
+ *
+ * See ApiQuery::$QueryPropModules for a list of the core prop modules.
+ */
 $wgAPIPropModules = array();
+
+/**
+ * API Query list module extensions.
+ * Associative array mapping list module name to class name.
+ * Extension modules may override the core modules.
+ *
+ * See ApiQuery::$QueryListModules for a list of the core list modules.
+ */
 $wgAPIListModules = array();
 
 /**
index 7c71fe7..015ea9c 100644 (file)
@@ -113,7 +113,6 @@ define( 'CACHE_NONE', 0 );       // Do not cache
 define( 'CACHE_DB', 1 );         // Store cache objects in the DB
 define( 'CACHE_MEMCACHED', 2 );  // MemCached, must specify servers in $wgMemCacheServers
 define( 'CACHE_ACCEL', 3 );      // APC, XCache or WinCache
-define( 'CACHE_DBA', 4 );        // Use PHP's DBA extension to store in a DBM-style database
 /**@}*/
 
 /**@{
index 1a69707..7115eab 100644 (file)
@@ -319,6 +319,18 @@ class EditPage {
                }
        }
 
+       /**
+        * Returns if the given content model is editable.
+        *
+        * @param string $modelId The ID of the content model to test. Use CONTENT_MODEL_XXX constants.
+        * @return bool
+        * @throws MWException if $modelId has no known handler
+        */
+       public function isSupportedContentModel( $modelId ) {
+               return $this->allowNonTextContent ||
+                       ContentHandler::getForModelID( $modelId ) instanceof TextContentHandler;
+       }
+
        function submit() {
                $this->edit();
        }
@@ -613,6 +625,7 @@ class EditPage {
        /**
         * This function collects the form data and uses it to populate various member variables.
         * @param $request WebRequest
+        * @throws ErrorPageError
         */
        function importFormData( &$request ) {
                global $wgContLang, $wgUser;
@@ -777,12 +790,17 @@ class EditPage {
                $this->bot = $request->getBool( 'bot', true );
                $this->nosummary = $request->getBool( 'nosummary' );
 
-               $content_handler = ContentHandler::getForTitle( $this->mTitle );
-               $this->contentModel = $request->getText( 'model', $content_handler->getModelID() ); #may be overridden by revision
-               $this->contentFormat = $request->getText( 'format', $content_handler->getDefaultFormat() ); #may be overridden by revision
+               $this->contentModel = $request->getText( 'model', $this->contentModel ); #may be overridden by revision
+               $this->contentFormat = $request->getText( 'format', $this->contentFormat ); #may be overridden by revision
 
+               if ( !ContentHandler::getForModelID( $this->contentModel )->isSupportedFormat( $this->contentFormat ) ) {
+                       throw new ErrorPageError(
+                               'editpage-notsupportedcontentformat-title',
+                               'editpage-notsupportedcontentformat-text',
+                               array( $this->contentFormat, ContentHandler::getLocalizedName( $this->contentModel ) )
+                       );
+               }
                #TODO: check if the desired model is allowed in this namespace, and if a transition from the page's current model to the new model is allowed
-               #TODO: check if the desired content model supports the given content format!
 
                $this->live = $request->getCheck( 'live' );
                $this->editintro = $request->getText( 'editintro',
@@ -2126,9 +2144,9 @@ class EditPage {
                        return $content;
                }
 
-               if ( !$this->allowNonTextContent && !( $content instanceof TextContent ) ) {
-                       throw new MWException( "This content model can not be edited as text: "
-                                                               . ContentHandler::getLocalizedName( $content->getModel() ) );
+               if ( !$this->isSupportedContentModel( $content->getModel() ) ) {
+                       throw new MWException( 'This content model is not supported: '
+                               . ContentHandler::getLocalizedName( $content->getModel() ) );
                }
 
                return $content->serialize( $this->contentFormat );
@@ -2156,8 +2174,8 @@ class EditPage {
                $content = ContentHandler::makeContent( $text, $this->getTitle(),
                        $this->contentModel, $this->contentFormat );
 
-               if ( !$this->allowNonTextContent && !( $content instanceof TextContent ) ) {
-                       throw new MWException( "This content model can not be edited as text: "
+               if ( !$this->isSupportedContentModel( $content->getModel() ) ) {
+                       throw new MWException( 'This content model is not supported: '
                                . ContentHandler::getLocalizedName( $content->getModel() ) );
                }
 
index efa213f..4aa15bf 100644 (file)
@@ -39,6 +39,7 @@ class FakeTitle extends Title {
        function canTalk() { $this->error(); }
        function getInterwiki() { $this->error(); }
        function getFragment() { $this->error(); }
+       function hasFragment() { $this->error(); }
        function getFragmentForURL() { $this->error(); }
        function getDefaultNamespace() { $this->error(); }
        function getIndexTitle() { $this->error(); }
index 2d5aa4b..0582230 100644 (file)
@@ -30,7 +30,7 @@
  * @ingroup Maintenance
  */
 class ForkController {
-       protected $children = array();
+       protected $children = array(), $childNumber = 0;
        protected $termReceived = false;
        protected $flags = 0, $procsToStart = 0;
 
@@ -137,6 +137,16 @@ class ForkController {
                return 'done';
        }
 
+       /**
+        * Get the number of the child currently running. Note, this
+        * is not the pid, but rather which of the total number of children
+        * we are
+        * @return int
+        */
+       public function getChildNumber() {
+               return $this->childNumber;
+       }
+
        protected function prepareEnvironment() {
                global $wgMemc;
                // Don't share DB, storage, or memcached connections
@@ -166,6 +176,7 @@ class ForkController {
 
                        if ( !$pid ) {
                                $this->initChild();
+                               $this->childNumber = $i;
                                return 'child';
                        } else {
                                // This is the parent process
index 3250ec8..2dda695 100644 (file)
@@ -1340,19 +1340,6 @@ function wfGetLangObj( $langcode = false ) {
        return $wgContLang;
 }
 
-/**
- * Old function when $wgBetterDirectionality existed
- * All usage removed, wfUILang can be removed in near future
- *
- * @deprecated since 1.18
- * @return Language
- */
-function wfUILang() {
-       wfDeprecated( __METHOD__, '1.18' );
-       global $wgLang;
-       return $wgLang;
-}
-
 /**
  * This is the function for getting translated interface messages.
  *
@@ -2619,25 +2606,6 @@ function wfPercent( $nr, $acc = 2, $round = true ) {
        return $round ? round( $ret, $acc ) . '%' : "$ret%";
 }
 
-/**
- * Find out whether or not a mixed variable exists in a string
- *
- * @deprecated Just use str(i)pos
- * @param $needle String
- * @param $str String
- * @param $insensitive Boolean
- * @return Boolean
- */
-function in_string( $needle, $str, $insensitive = false ) {
-       wfDeprecated( __METHOD__, '1.21' );
-       $func = 'strpos';
-       if ( $insensitive ) {
-               $func = 'stripos';
-       }
-
-       return $func( $str, $needle ) !== false;
-}
-
 /**
  * Safety wrapper around ini_get() for boolean settings.
  * The values returned from ini_get() are pre-normalized for settings
@@ -3712,15 +3680,6 @@ function wfLocalFile( $title ) {
        return RepoGroup::singleton()->getLocalRepo()->newFile( $title );
 }
 
-/**
- * Stream a file to the browser. Back-compat alias for StreamFile::stream()
- * @deprecated since 1.19
- */
-function wfStreamFile( $fname, $headers = array() ) {
-       wfDeprecated( __FUNCTION__, '1.19' );
-       StreamFile::stream( $fname, $headers );
-}
-
 /**
  * Should low-performance queries be disabled?
  *
@@ -3848,23 +3807,6 @@ function wfCountDown( $n ) {
        echo "\n";
 }
 
-/**
- * Generate a random 32-character hexadecimal token.
- * @param $salt Mixed: some sort of salt, if necessary, to add to random
- *              characters before hashing.
- * @return string
- * @codeCoverageIgnore
- * @deprecated since 1.20; Please use MWCryptRand for security purposes and
- * wfRandomString for pseudo-random strings
- * @warning This method is NOT secure. Additionally it has many callers that
- * use it for pseudo-random purposes.
- */
-function wfGenerateToken( $salt = '' ) {
-       wfDeprecated( __METHOD__, '1.20' );
-       $salt = serialize( $salt );
-       return md5( mt_rand( 0, 0x7fffffff ) . $salt );
-}
-
 /**
  * Replace all invalid characters with -
  * Additional characters can be defined in $wgIllegalFileChars (see bug 20489)
@@ -4026,10 +3968,12 @@ function wfGetLangConverterCacheStorage() {
  *
  * @param string $event event name
  * @param array $args parameters passed to hook functions
+ * @param string|null $deprecatedVersion optionally mark hook as deprecated with version number
+ *
  * @return Boolean True if no handler aborted the hook
  */
-function wfRunHooks( $event, array $args = array() ) {
-       return Hooks::run( $event, $args );
+function wfRunHooks( $event, array $args = array(), $deprecatedVersion = null ) {
+       return Hooks::run( $event, $args, $deprecatedVersion );
 }
 
 /**
index db47d31..785e717 100644 (file)
@@ -124,6 +124,7 @@ class Hooks {
         *
         * @param string $event Event name
         * @param array $args  Array of parameters passed to hook functions
+        * @param string|null $deprecatedVersion Optionally, mark hook as deprecated with version number
         * @return bool True if no handler aborted the hook
         *
         * @since 1.22 A hook function is not required to return a value for
@@ -132,7 +133,7 @@ class Hooks {
         * @throws MWException
         * @throws FatalError
         */
-       public static function run( $event, array $args = array() ) {
+       public static function run( $event, array $args = array(), $deprecatedVersion = null ) {
                wfProfileIn( 'hook: ' . $event );
                foreach ( self::getHandlers( $event ) as $hook ) {
                        // Turn non-array values into an array. (Can't use casting because of objects.)
@@ -195,6 +196,12 @@ class Hooks {
                        // Profile first in case the Profiler causes errors.
                        wfProfileIn( $func );
                        set_error_handler( 'Hooks::hookErrorHandler' );
+
+                       // mark hook as deprecated, if deprecation version is specified
+                       if ( $deprecatedVersion !== null ) {
+                               wfDeprecated( "$event hook (used in $func)", $deprecatedVersion );
+                       }
+
                        try {
                                $retval = call_user_func_array( $callback, $hook_args );
                        } catch ( MWHookException $e ) {
index 867b88b..23bfd61 100644 (file)
@@ -159,9 +159,6 @@ class Linker {
         * link() replaces the old functions in the makeLink() family.
         *
         * @since 1.18 Method exists since 1.16 as non-static, made static in 1.18.
-        * You can call it using this if you want to keep compat with these:
-        * $linker = class_exists( 'DummyLinker' ) ? new DummyLinker() : new Linker();
-        * $linker->link( ... );
         *
         * @param $target        Title  Can currently only be a Title, but this may
         *   change to support Images, literal URLs, etc.
@@ -281,9 +278,9 @@ class Linker {
                wfProfileIn( __METHOD__ );
                # We don't want to include fragments for broken links, because they
                # generally make no sense.
-               if ( in_array( 'broken', $options ) && $target->mFragment !== '' ) {
+               if ( in_array( 'broken', $options ) && $target->hasFragment() ) {
                        $target = clone $target;
-                       $target->mFragment = '';
+                       $target->setFragment( '' );
                }
 
                # If it's a broken link, add the appropriate query pieces, unless
@@ -387,7 +384,7 @@ class Linker {
 
                // If the target is just a fragment, with no title, we return the fragment
                // text.  Otherwise, we return the title text itself.
-               if ( $target->getPrefixedText() === '' && $target->getFragment() !== '' ) {
+               if ( $target->getPrefixedText() === '' && $target->hasFragment() ) {
                        return htmlspecialchars( $target->getFragment() );
                }
                return htmlspecialchars( $target->getPrefixedText() );
@@ -451,8 +448,7 @@ class Linker {
                        if ( !$name ) {
                                return $title;
                        }
-                       $ret = SpecialPage::getTitleFor( $name, $subpage );
-                       $ret->mFragment = $title->getFragment();
+                       $ret = SpecialPage::getTitleFor( $name, $subpage, $title->getFragment() );
                        return $ret;
                } else {
                        return $title;
diff --git a/includes/MWTimestamp.php b/includes/MWTimestamp.php
new file mode 100644 (file)
index 0000000..9de2c0a
--- /dev/null
@@ -0,0 +1,391 @@
+<?php
+/**
+ * Creation and parsing of MW-style timestamps.
+ *
+ * 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
+ * @since 1.20
+ * @author Tyler Romeo, 2012
+ */
+
+/**
+ * Library for creating and parsing MW-style timestamps. Based on the JS
+ * library that does the same thing.
+ *
+ * @since 1.20
+ */
+class MWTimestamp {
+       /**
+        * Standard gmdate() formats for the different timestamp types.
+        */
+       private static $formats = array(
+               TS_UNIX => 'U',
+               TS_MW => 'YmdHis',
+               TS_DB => 'Y-m-d H:i:s',
+               TS_ISO_8601 => 'Y-m-d\TH:i:s\Z',
+               TS_ISO_8601_BASIC => 'Ymd\THis\Z',
+               TS_EXIF => 'Y:m:d H:i:s', // This shouldn't ever be used, but is included for completeness
+               TS_RFC2822 => 'D, d M Y H:i:s',
+               TS_ORACLE => 'd-m-Y H:i:s.000000', // Was 'd-M-y h.i.s A' . ' +00:00' before r51500
+               TS_POSTGRES => 'Y-m-d H:i:s',
+       );
+
+       /**
+        * The actual timestamp being wrapped (DateTime object).
+        * @var DateTime
+        */
+       public $timestamp;
+
+       /**
+        * Make a new timestamp and set it to the specified time,
+        * or the current time if unspecified.
+        *
+        * @since 1.20
+        *
+        * @param bool|string $timestamp Timestamp to set, or false for current time
+        */
+       public function __construct( $timestamp = false ) {
+               $this->setTimestamp( $timestamp );
+       }
+
+       /**
+        * Set the timestamp to the specified time, or the current time if unspecified.
+        *
+        * Parse the given timestamp into either a DateTime object or a Unix timestamp,
+        * and then store it.
+        *
+        * @since 1.20
+        *
+        * @param string|bool $ts Timestamp to store, or false for now
+        * @throws TimestampException
+        */
+       public function setTimestamp( $ts = false ) {
+               $da = array();
+               $strtime = '';
+
+               if ( !$ts || $ts === "\0\0\0\0\0\0\0\0\0\0\0\0\0\0" ) { // We want to catch 0, '', null... but not date strings starting with a letter.
+                       $uts = time();
+                       $strtime = "@$uts";
+               } elseif ( preg_match( '/^(\d{4})\-(\d\d)\-(\d\d) (\d\d):(\d\d):(\d\d)$/D', $ts, $da ) ) {
+                       # TS_DB
+               } elseif ( preg_match( '/^(\d{4}):(\d\d):(\d\d) (\d\d):(\d\d):(\d\d)$/D', $ts, $da ) ) {
+                       # TS_EXIF
+               } elseif ( preg_match( '/^(\d{4})(\d\d)(\d\d)(\d\d)(\d\d)(\d\d)$/D', $ts, $da ) ) {
+                       # TS_MW
+               } elseif ( preg_match( '/^-?\d{1,13}$/D', $ts ) ) {
+                       # TS_UNIX
+                       $strtime = "@$ts"; // http://php.net/manual/en/datetime.formats.compound.php
+               } elseif ( preg_match( '/^\d{2}-\d{2}-\d{4} \d{2}:\d{2}:\d{2}.\d{6}$/', $ts ) ) {
+                       # TS_ORACLE // session altered to DD-MM-YYYY HH24:MI:SS.FF6
+                       $strtime = preg_replace( '/(\d\d)\.(\d\d)\.(\d\d)(\.(\d+))?/', "$1:$2:$3",
+                                       str_replace( '+00:00', 'UTC', $ts ) );
+               } elseif ( preg_match( '/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(?:\.*\d*)?Z?$/', $ts, $da ) ) {
+                       # TS_ISO_8601
+               } elseif ( preg_match( '/^(\d{4})(\d{2})(\d{2})T(\d{2})(\d{2})(\d{2})(?:\.*\d*)?Z?$/', $ts, $da ) ) {
+                       #TS_ISO_8601_BASIC
+               } elseif ( preg_match( '/^(\d{4})\-(\d\d)\-(\d\d) (\d\d):(\d\d):(\d\d)\.*\d*[\+\- ](\d\d)$/', $ts, $da ) ) {
+                       # TS_POSTGRES
+               } elseif ( preg_match( '/^(\d{4})\-(\d\d)\-(\d\d) (\d\d):(\d\d):(\d\d)\.*\d* GMT$/', $ts, $da ) ) {
+                       # TS_POSTGRES
+               } elseif ( preg_match( '/^[ \t\r\n]*([A-Z][a-z]{2},[ \t\r\n]*)?' . # Day of week
+                                                               '\d\d?[ \t\r\n]*[A-Z][a-z]{2}[ \t\r\n]*\d{2}(?:\d{2})?' .  # dd Mon yyyy
+                                                               '[ \t\r\n]*\d\d[ \t\r\n]*:[ \t\r\n]*\d\d[ \t\r\n]*:[ \t\r\n]*\d\d/S', $ts ) ) { # hh:mm:ss
+                       # TS_RFC2822, accepting a trailing comment. See http://www.squid-cache.org/mail-archive/squid-users/200307/0122.html / r77171
+                       # The regex is a superset of rfc2822 for readability
+                       $strtime = strtok( $ts, ';' );
+               } elseif ( preg_match( '/^[A-Z][a-z]{5,8}, \d\d-[A-Z][a-z]{2}-\d{2} \d\d:\d\d:\d\d/', $ts ) ) {
+                       # TS_RFC850
+                       $strtime = $ts;
+               } elseif ( preg_match( '/^[A-Z][a-z]{2} [A-Z][a-z]{2} +\d{1,2} \d\d:\d\d:\d\d \d{4}/', $ts ) ) {
+                       # asctime
+                       $strtime = $ts;
+               } else {
+                       throw new TimestampException( __METHOD__ . ": Invalid timestamp - $ts" );
+               }
+
+               if ( !$strtime ) {
+                       $da = array_map( 'intval', $da );
+                       $da[0] = "%04d-%02d-%02dT%02d:%02d:%02d.00+00:00";
+                       $strtime = call_user_func_array( "sprintf", $da );
+               }
+
+               try {
+                       $final = new DateTime( $strtime, new DateTimeZone( 'GMT' ) );
+               } catch ( Exception $e ) {
+                       throw new TimestampException( __METHOD__ . ': Invalid timestamp format.', $e->getCode(), $e );
+               }
+
+               if ( $final === false ) {
+                       throw new TimestampException( __METHOD__ . ': Invalid timestamp format.' );
+               }
+               $this->timestamp = $final;
+       }
+
+       /**
+        * Get the timestamp represented by this object in a certain form.
+        *
+        * Convert the internal timestamp to the specified format and then
+        * return it.
+        *
+        * @since 1.20
+        *
+        * @param int $style Constant Output format for timestamp
+        * @throws TimestampException
+        * @return string The formatted timestamp
+        */
+       public function getTimestamp( $style = TS_UNIX ) {
+               if ( !isset( self::$formats[$style] ) ) {
+                       throw new TimestampException( __METHOD__ . ': Illegal timestamp output type.' );
+               }
+
+               $output = $this->timestamp->format( self::$formats[$style] );
+
+               if ( ( $style == TS_RFC2822 ) || ( $style == TS_POSTGRES ) ) {
+                       $output .= ' GMT';
+               }
+
+               return $output;
+       }
+
+       /**
+        * Get the timestamp in a human-friendly relative format, e.g., "3 days ago".
+        *
+        * Determine the difference between the timestamp and the current time, and
+        * generate a readable timestamp by returning "<N> <units> ago", where the
+        * largest possible unit is used.
+        *
+        * @since 1.20
+        * @since 1.22 Uses Language::getHumanTimestamp to produce the timestamp
+        *
+        * @param MWTimestamp|null $relativeTo The base timestamp to compare to (defaults to now)
+        * @param User|null $user User the timestamp is being generated for (or null to use main context's user)
+        * @param Language|null $lang Language to use to make the human timestamp (or null to use main context's language)
+        * @return string Formatted timestamp
+        */
+       public function getHumanTimestamp( MWTimestamp $relativeTo = null, User $user = null, Language $lang = null ) {
+               if ( $relativeTo === null ) {
+                       $relativeTo = new self();
+               }
+               if ( $user === null ) {
+                       $user = RequestContext::getMain()->getUser();
+               }
+               if ( $lang === null ) {
+                       $lang = RequestContext::getMain()->getLanguage();
+               }
+
+               // Adjust for the user's timezone.
+               $offsetThis = $this->offsetForUser( $user );
+               $offsetRel = $relativeTo->offsetForUser( $user );
+
+               $ts = '';
+               if ( wfRunHooks( 'GetHumanTimestamp', array( &$ts, $this, $relativeTo, $user, $lang ) ) ) {
+                       $ts = $lang->getHumanTimestamp( $this, $relativeTo, $user );
+               }
+
+               // Reset the timezone on the objects.
+               $this->timestamp->sub( $offsetThis );
+               $relativeTo->timestamp->sub( $offsetRel );
+
+               return $ts;
+       }
+
+       /**
+        * Adjust the timestamp depending on the given user's preferences.
+        *
+        * @since 1.22
+        *
+        * @param User $user User to take preferences from
+        * @param[out] MWTimestamp $ts Timestamp to adjust
+        * @return DateInterval Offset that was applied to the timestamp
+        */
+       public function offsetForUser( User $user ) {
+               global $wgLocalTZoffset;
+
+               $option = $user->getOption( 'timecorrection' );
+               $data = explode( '|', $option, 3 );
+
+               // First handle the case of an actual timezone being specified.
+               if ( $data[0] == 'ZoneInfo' ) {
+                       try {
+                               $tz = new DateTimeZone( $data[2] );
+                       } catch ( Exception $e ) {
+                               $tz = false;
+                       }
+
+                       if ( $tz ) {
+                               $this->timestamp->setTimezone( $tz );
+                               return new DateInterval( 'P0Y' );
+                       } else {
+                               $data[0] = 'Offset';
+                       }
+               }
+
+               $diff = 0;
+               // If $option is in fact a pipe-separated value, check the
+               // first value.
+               if ( $data[0] == 'System' ) {
+                       // First value is System, so use the system offset.
+                       if ( isset( $wgLocalTZoffset ) ) {
+                               $diff = $wgLocalTZoffset;
+                       }
+               } elseif ( $data[0] == 'Offset' ) {
+                       // First value is Offset, so use the specified offset
+                       $diff = (int)$data[1];
+               } else {
+                       // $option actually isn't a pipe separated value, but instead
+                       // a comma separated value. Isn't MediaWiki fun?
+                       $data = explode( ':', $option );
+                       if ( count( $data ) >= 2 ) {
+                               // Combination hours and minutes.
+                               $diff = abs( (int)$data[0] ) * 60 + (int)$data[1];
+                               if ( (int)$data[0] < 0 ) {
+                                       $diff *= -1;
+                               }
+                       } else {
+                               // Just hours.
+                               $diff = (int)$data[0] * 60;
+                       }
+               }
+
+               $interval = new DateInterval( 'PT' . abs( $diff ) . 'M' );
+               if ( $diff < 1 ) {
+                       $interval->invert = 1;
+               }
+
+               $this->timestamp->add( $interval );
+               return $interval;
+       }
+
+       /**
+        * Generate a purely relative timestamp, i.e., represent the time elapsed between
+        * the given base timestamp and this object.
+        *
+        * @param MWTimestamp $relativeTo Relative base timestamp (defaults to now)
+        * @param User $user Use to use offset for
+        * @param Language $lang Language to use
+        * @param array $chosenIntervals Intervals to use to represent it
+        * @return string Relative timestamp
+        */
+       public function getRelativeTimestamp(
+               MWTimestamp $relativeTo = null,
+               User $user = null,
+               Language $lang = null,
+               array $chosenIntervals = array()
+       ) {
+               if ( $relativeTo === null ) {
+                       $relativeTo = new self;
+               }
+               if ( $user === null ) {
+                       $user = RequestContext::getMain()->getUser();
+               }
+               if ( $lang === null ) {
+                       $lang = RequestContext::getMain()->getLanguage();
+               }
+
+               $ts = '';
+               $diff = $this->diff( $relativeTo );
+               if ( wfRunHooks( 'GetRelativeTimestamp', array( &$ts, &$diff, $this, $relativeTo, $user, $lang ) ) ) {
+                       $seconds = ( ( ( $diff->days * 24 + $diff->h ) * 60 + $diff->i ) * 60 + $diff->s );
+                       $ts = wfMessage( 'ago', $lang->formatDuration( $seconds, $chosenIntervals ) )
+                               ->inLanguage( $lang )
+                               ->text();
+               }
+
+               return $ts;
+       }
+
+       /**
+        * @since 1.20
+        *
+        * @return string
+        */
+       public function __toString() {
+               return $this->getTimestamp();
+       }
+
+       /**
+        * Calculate the difference between two MWTimestamp objects.
+        *
+        * @since 1.22
+        * @param MWTimestamp $relativeTo Base time to calculate difference from
+        * @return DateInterval|bool The DateInterval object representing the difference between the two dates or false on failure
+        */
+       public function diff( MWTimestamp $relativeTo ) {
+               return $this->timestamp->diff( $relativeTo->timestamp );
+       }
+
+       /**
+        * Set the timezone of this timestamp to the specified timezone.
+        *
+        * @since 1.22
+        * @param String $timezone Timezone to set
+        * @throws TimestampException
+        */
+       public function setTimezone( $timezone ) {
+               try {
+                       $this->timestamp->setTimezone( new DateTimeZone( $timezone ) );
+               } catch ( Exception $e ) {
+                       throw new TimestampException( __METHOD__ . ': Invalid timezone.', $e->getCode(), $e );
+               }
+       }
+
+       /**
+        * Get the timezone of this timestamp.
+        *
+        * @since 1.22
+        * @return DateTimeZone The timezone
+        */
+       public function getTimezone() {
+               return $this->timestamp->getTimezone();
+       }
+
+       /**
+        * Format the timestamp in a given format.
+        *
+        * @since 1.22
+        * @param string $format Pattern to format in
+        * @return string The formatted timestamp
+        */
+       public function format( $format ) {
+               return $this->timestamp->format( $format );
+       }
+
+       /**
+        * Get a timestamp instance in the server local timezone ($wgLocaltimezone)
+        *
+        * @since 1.22
+        * @param bool|string $ts Timestamp to set, or false for current time
+        * @return MWTimestamp the local instance
+        */
+       public static function getLocalInstance( $ts = false ) {
+               global $wgLocaltimezone;
+               $timestamp = new self( $ts );
+               $timestamp->setTimezone( $wgLocaltimezone );
+               return $timestamp;
+       }
+
+       /**
+        * Get a timestamp instance in GMT
+        *
+        * @since 1.22
+        * @param bool|string $ts Timestamp to set, or false for current time
+        * @return MWTimestamp the instance
+        */
+       public static function getInstance( $ts = false ) {
+               return new self( $ts );
+       }
+}
index bf15bf3..377d406 100644 (file)
@@ -65,6 +65,7 @@ class MagicWord {
        var $mId, $mSynonyms, $mCaseSensitive;
        var $mRegex = '';
        var $mRegexStart = '';
+       var $mRegexStartToEnd = '';
        var $mBaseRegex = '';
        var $mVariableRegex = '';
        var $mVariableStartToEndRegex = '';
@@ -339,6 +340,7 @@ class MagicWord {
                $case = $this->mCaseSensitive ? '' : 'iu';
                $this->mRegex = "/{$this->mBaseRegex}/{$case}";
                $this->mRegexStart = "/^(?:{$this->mBaseRegex})/{$case}";
+               $this->mRegexStartToEnd = "/^(?:{$this->mBaseRegex})$/{$case}";
                $this->mVariableRegex = str_replace( "\\$1", "(.*?)", $this->mRegex );
                $this->mVariableStartToEndRegex = str_replace( "\\$1", "(.*?)",
                        "/^(?:{$this->mBaseRegex})$/{$case}" );
@@ -405,6 +407,19 @@ class MagicWord {
                return $this->mRegexStart;
        }
 
+       /**
+        * Gets a regex matching the word from start to end of a string
+        *
+        * @return string
+        * @since 1.23
+        */
+       function getRegexStartToEnd() {
+               if ( $this->mRegexStartToEnd == '' ) {
+                       $this->initRegex();
+               }
+               return $this->mRegexStartToEnd;
+       }
+
        /**
         * regex without the slashes and what not
         *
@@ -439,6 +454,18 @@ class MagicWord {
                return (bool)preg_match( $this->getRegexStart(), $text );
        }
 
+       /**
+        * Returns true if the text matched the word
+        *
+        * @param $text string
+        *
+        * @return bool
+        * @since 1.23
+        */
+       function matchStartToEnd( $text ) {
+               return (bool)preg_match( $this->getRegexStartToEnd(), $text );
+       }
+
        /**
         * Returns NULL if there's no match, the value of $1 otherwise
         * The return code is the matched string, if there's no variable
index 8a8142b..7e1c745 100644 (file)
@@ -242,8 +242,9 @@ class MessageBlobStore {
 
        public static function clear() {
                // TODO: Give this some more thought
-               // TODO: Is TRUNCATE better?
                try {
+                       // Not using TRUNCATE, because that needs extra permissions,
+                       // which maybe not granted to the database user.
                        $dbw = wfGetDB( DB_MASTER );
                        $dbw->delete( 'msg_resource', '*', __METHOD__ );
                        $dbw->delete( 'msg_resource_links', '*', __METHOD__ );
diff --git a/includes/Metadata.php b/includes/Metadata.php
deleted file mode 100644 (file)
index ea89f52..0000000
+++ /dev/null
@@ -1,207 +0,0 @@
-<?php
-/**
- * Base code to format metadata.
- *
- * Copyright 2004, Evan Prodromou <evan@wikitravel.org>.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @author Evan Prodromou <evan@wikitravel.org>
- * @file
- */
-
-abstract class RdfMetaData {
-       const RDF_TYPE_PREFS = 'application/rdf+xml,text/xml;q=0.7,application/xml;q=0.5,text/rdf;q=0.1';
-
-       /**
-        * Constructor
-        * @param Page $page
-        */
-       public function __construct( Page $page ) {
-               $this->mArticle = $page;
-       }
-
-       abstract public function show();
-
-       protected function setup() {
-               global $wgOut, $wgRequest;
-
-               $httpaccept = isset( $_SERVER['HTTP_ACCEPT'] ) ? $_SERVER['HTTP_ACCEPT'] : null;
-               $rdftype = wfNegotiateType(
-                       wfAcceptToPrefs( $httpaccept ),
-                       wfAcceptToPrefs( self::RDF_TYPE_PREFS )
-               );
-
-               if ( !$rdftype ) {
-                       throw new HttpError( 406, wfMessage( 'notacceptable' ) );
-               }
-
-               $wgOut->disable();
-               $wgRequest->response()->header( "Content-type: {$rdftype}; charset=utf-8" );
-               $wgOut->sendCacheControl();
-               return true;
-       }
-
-       protected function reallyFullUrl() {
-               return $this->mArticle->getTitle()->getFullURL();
-       }
-
-       protected function basics() {
-               global $wgLanguageCode, $wgSitename;
-
-               $this->element( 'title', $this->mArticle->getTitle()->getText() );
-               $this->pageOrString( 'publisher', wfMessage( 'aboutpage' )->text(), $wgSitename );
-               $this->element( 'language', $wgLanguageCode );
-               $this->element( 'type', 'Text' );
-               $this->element( 'format', 'text/html' );
-               $this->element( 'identifier', $this->reallyFullUrl() );
-               $this->element( 'date', $this->date( $this->mArticle->getTimestamp() ) );
-
-               $lastEditor = User::newFromId( $this->mArticle->getUser() );
-               $this->person( 'creator', $lastEditor );
-
-               foreach ( $this->mArticle->getContributors() as $user ) {
-                       $this->person( 'contributor', $user );
-               }
-
-               $this->rights();
-       }
-
-       protected function element( $name, $value ) {
-               $value = htmlspecialchars( $value );
-               print "\t\t<dc:{$name}>{$value}</dc:{$name}>\n";
-       }
-
-       protected function date( $timestamp ) {
-               return substr( $timestamp, 0, 4 ) . '-'
-                       . substr( $timestamp, 4, 2 ) . '-'
-                       . substr( $timestamp, 6, 2 );
-       }
-
-       protected function pageOrString( $name, $page, $str ) {
-               if ( $page instanceof Title ) {
-                       $nt = $page;
-               } else {
-                       $nt = Title::newFromText( $page );
-               }
-
-               if ( !$nt || $nt->getArticleID() == 0 ) {
-                       $this->element( $name, $str );
-               } else {
-                       $this->page( $name, $nt );
-               }
-       }
-
-       /**
-        * @param string $name
-        * @param Title $title
-        */
-       protected function page( $name, $title ) {
-               $this->url( $name, $title->getFullURL() );
-       }
-
-       protected function url( $name, $url ) {
-               $url = htmlspecialchars( $url );
-               print "\t\t<dc:{$name} rdf:resource=\"{$url}\" />\n";
-       }
-
-       protected function person( $name, User $user ) {
-               global $wgHiddenPrefs;
-
-               if ( $user->isAnon() ) {
-                       $this->element( $name, wfMessage( 'anonymous' )->numParams( 1 )->text() );
-               } else {
-                       $real = $user->getRealName();
-                       if ( $real && !in_array( 'realname', $wgHiddenPrefs ) ) {
-                               $this->element( $name, $real );
-                       } else {
-                               $userName = $user->getName();
-                               $this->pageOrString(
-                                       $name,
-                                       $user->getUserPage(),
-                                       wfMessage( 'siteuser', $userName, $userName )->text()
-                               );
-                       }
-               }
-       }
-
-       /**
-        * Takes an arg, for future enhancement with different rights for
-        * different pages.
-        */
-       protected function rights() {
-               global $wgRightsPage, $wgRightsUrl, $wgRightsText;
-
-               if ( $wgRightsPage && ( $nt = Title::newFromText( $wgRightsPage ) )
-                       && ( $nt->getArticleID() != 0 ) ) {
-                       $this->page( 'rights', $nt );
-               } elseif ( $wgRightsUrl ) {
-                       $this->url( 'rights', $wgRightsUrl );
-               } elseif ( $wgRightsText ) {
-                       $this->element( 'rights', $wgRightsText );
-               }
-       }
-
-       protected function getTerms( $url ) {
-               global $wgLicenseTerms;
-
-               if ( $wgLicenseTerms ) {
-                       return $wgLicenseTerms;
-               } else {
-                       $known = $this->getKnownLicenses();
-                       if ( isset( $known[$url] ) ) {
-                               return $known[$url];
-                       } else {
-                               return array();
-                       }
-               }
-       }
-
-       protected function getKnownLicenses() {
-               $ccLicenses = array( 'by', 'by-nd', 'by-nd-nc', 'by-nc',
-                                                       'by-nc-sa', 'by-sa' );
-               $ccVersions = array( '1.0', '2.0' );
-               $knownLicenses = array();
-
-               foreach ( $ccVersions as $version ) {
-                       foreach ( $ccLicenses as $license ) {
-                               if ( $version == '2.0' && substr( $license, 0, 2 ) != 'by' ) {
-                                       # 2.0 dropped the non-attribs licenses
-                                       continue;
-                               }
-                               $lurl = "http://creativecommons.org/licenses/{$license}/{$version}/";
-                               $knownLicenses[$lurl] = explode( '-', $license );
-                               $knownLicenses[$lurl][] = 're';
-                               $knownLicenses[$lurl][] = 'di';
-                               $knownLicenses[$lurl][] = 'no';
-                               if ( !in_array( 'nd', $knownLicenses[$lurl] ) ) {
-                                       $knownLicenses[$lurl][] = 'de';
-                               }
-                       }
-               }
-
-               /* Handle the GPL and LGPL, too. */
-
-               $knownLicenses['http://creativecommons.org/licenses/GPL/2.0/'] =
-                       array( 'de', 're', 'di', 'no', 'sa', 'sc' );
-               $knownLicenses['http://creativecommons.org/licenses/LGPL/2.1/'] =
-                       array( 'de', 're', 'di', 'no', 'sa', 'sc' );
-               $knownLicenses['http://www.gnu.org/copyleft/fdl.html'] =
-                       array( 'de', 're', 'di', 'no', 'sa', 'sc' );
-
-               return $knownLicenses;
-       }
-}
index b6a8d24..9866e2c 100644 (file)
@@ -2510,6 +2510,10 @@ $templates
 
                $ret .= Html::element( 'title', null, $this->getHTMLTitle() ) . "\n";
 
+               // Avoid Internet Explorer "compatibility view", so that
+               // jQuery can work correctly.
+               $ret .= Html::element( 'meta', array( 'http-equiv' => 'X-UA-Compatible', 'content' => 'IE=EDGE' ) );
+
                $ret .= implode( "\n", array(
                        $this->getHeadLinks(),
                        $this->buildCssLinks(),
index 5413f30..04e9114 100644 (file)
@@ -755,13 +755,6 @@ class Preferences {
                        'label-raw' => $context->msg( 'stub-threshold' )->text(), // Raw HTML message. Yay?
                );
 
-               if ( $wgAllowUserCssPrefs ) {
-                       $defaultPreferences['showtoc'] = array(
-                               'type' => 'toggle',
-                               'section' => 'rendering/advancedrendering',
-                               'label-message' => 'tog-showtoc',
-                       );
-               }
                $defaultPreferences['showhiddencats'] = array(
                        'type' => 'toggle',
                        'section' => 'rendering/advancedrendering',
@@ -792,13 +785,6 @@ class Preferences {
                global $wgAllowUserCssPrefs;
 
                ## Editing #####################################
-               if ( $wgAllowUserCssPrefs ) {
-                       $defaultPreferences['editsection'] = array(
-                               'type' => 'toggle',
-                               'section' => 'editing/advancedediting',
-                               'label-message' => 'tog-editsection',
-                       );
-               }
                $defaultPreferences['editsectiononrightclick'] = array(
                        'type' => 'toggle',
                        'section' => 'editing/advancedediting',
@@ -1455,7 +1441,6 @@ class Preferences {
                        # If users have saved a value for a preference which has subsequently been disabled
                        # via $wgHiddenPrefs, we don't want to destroy that setting in case the preference
                        # is subsequently re-enabled
-                       # TODO: maintenance script to actually delete these
                        foreach ( $wgHiddenPrefs as $pref ) {
                                # If the user has not set a non-default value here, the default will be returned
                                # and subsequently discarded
index 3384af0..0de8cda 100644 (file)
@@ -355,12 +355,12 @@ class Sanitizer {
         * Cleans up HTML, removes dangerous tags and attributes, and
         * removes HTML comments
         * @private
-        * @param $text String
-        * @param $processCallback Callback to do any variable or parameter
-        *        replacements in HTML attribute values
-        * @param array $args for the processing callback
-        * @param array $extratags for any extra tags to include
-        * @param array $removetags for any tags (default or extra) to exclude
+        * @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 $extratags For any extra tags to include
+        * @param array $removetags For any tags (default or extra) to exclude
         * @return string
         */
        static function removeHTMLtags( $text, $processCallback = null,
@@ -601,7 +601,7 @@ class Sanitizer {
         * trailing spaces and one of the newlines.
         *
         * @private
-        * @param $text String
+        * @param string $text
         * @return string
         */
        static function removeHTMLcomments( $text ) {
@@ -649,8 +649,8 @@ class Sanitizer {
         * where we may want to allow a tag within content but ONLY when it has
         * specific attributes set.
         *
-        * @param $params
-        * @param $element
+        * @param string $params
+        * @param string $element
         * @return bool
         */
        static function validateTag( $params, $element ) {
@@ -682,9 +682,9 @@ class Sanitizer {
         * - Unsafe style attributes are discarded
         * - Invalid id attributes are re-encoded
         *
-        * @param $attribs Array
-        * @param $element String
-        * @return Array
+        * @param array $attribs
+        * @param string $element
+        * @return array
         *
         * @todo Check for legal values where the DTD limits things.
         * @todo Check for unique id attribute :P
@@ -702,9 +702,9 @@ class Sanitizer {
         * - Unsafe style attributes are discarded
         * - Invalid id attributes are re-encoded
         *
-        * @param $attribs Array
+        * @param array $attribs
         * @param array $whitelist list of allowed attribute names
-        * @return Array
+        * @return array
         *
         * @todo Check for legal values where the DTD limits things.
         * @todo Check for unique id attribute :P
@@ -801,8 +801,8 @@ class Sanitizer {
         * will be combined (if they're both strings).
         *
         * @todo implement merging for other attributes such as style
-        * @param $a Array
-        * @param $b Array
+        * @param array $a
+        * @param array $b
         * @return array
         */
        static function mergeAttributes( $a, $b ) {
@@ -833,8 +833,8 @@ class Sanitizer {
         * clever input strings. These character references must
         * be escaped before the return value is embedded in HTML.
         *
-        * @param $value String
-        * @return String
+        * @param string $value
+        * @return string
         */
        static function checkCss( $value ) {
                // Decode character references like &#123;
@@ -867,7 +867,7 @@ class Sanitizer {
 
                // Normalize Halfwidth and Fullwidth Unicode block that IE6 might treat as ascii
                $value = preg_replace_callback(
-                       '/[ï¼\81½\9a]/u', // U+FF01 to U+FF5A
+                       '/[ï¼\81¼»ï¼½-ï½\9a]/u', // U+FF01 to U+FF5A, excluding U+FF3C (bug 58088)
                        function ( $matches ) {
                                $cp = utf8ToCodepoint( $matches[0] );
                                if ( $cp === false ) {
@@ -925,15 +925,25 @@ class Sanitizer {
                // Reject problematic keywords and control characters
                if ( preg_match( '/[\000-\010\013\016-\037\177]/', $value ) ) {
                        return '/* invalid control char */';
-               } elseif ( preg_match( '! expression | filter\s*: | accelerator\s*: | url\s*\( | image\s*\( | image-set\s*\( !ix', $value ) ) {
+               } elseif ( preg_match(
+                       '! expression
+                               | filter\s*:
+                               | accelerator\s*:
+                               | -o-link\s*:
+                               | -o-link-source\s*:
+                               | -o-replace\s*:
+                               | url\s*\(
+                               | image\s*\(
+                               | image-set\s*\(
+                       !ix', $value ) ) {
                        return '/* insecure input */';
                }
                return $value;
        }
 
        /**
-        * @param $matches array
-        * @return String
+        * @param array $matches
+        * @return string
         */
        static function cssDecodeCallback( $matches ) {
                if ( $matches[1] !== '' ) {
@@ -971,9 +981,9 @@ class Sanitizer {
         * - Unsafe style attributes are discarded
         * - Prepends space if there are attributes.
         *
-        * @param $text String
-        * @param $element String
-        * @return String
+        * @param string $text
+        * @param string $element
+        * @return string
         */
        static function fixTagAttributes( $text, $element ) {
                if ( trim( $text ) == '' ) {
@@ -988,8 +998,8 @@ class Sanitizer {
 
        /**
         * Encode an attribute value for HTML output.
-        * @param $text String
-        * @return HTML-encoded text fragment
+        * @param string $text
+        * @return string HTML-encoded text fragment
         */
        static function encodeAttribute( $text ) {
                $encValue = htmlspecialchars( $text, ENT_QUOTES );
@@ -1009,8 +1019,8 @@ class Sanitizer {
        /**
         * Encode an attribute value for HTML tags, with extra armoring
         * against further wiki processing.
-        * @param $text String
-        * @return HTML-encoded text fragment
+        * @param string $text
+        * @return string HTML-encoded text fragment
         */
        static function safeEncodeAttribute( $text ) {
                $encValue = Sanitizer::encodeAttribute( $text );
@@ -1053,9 +1063,9 @@ class Sanitizer {
         * (which don't work reliably in fragments cross-browser).
         *
         * @see http://www.w3.org/TR/html401/types.html#type-name Valid characters
-        *                                                          in the id and
-        *                                                          name attributes
-        * @see http://www.w3.org/TR/html401/struct/links.html#h-12.2.3 Anchors with the id attribute
+        *   in the id and name attributes
+        * @see http://www.w3.org/TR/html401/struct/links.html#h-12.2.3 Anchors with
+        *   the id attribute
         * @see http://www.whatwg.org/html/elements.html#the-id-attribute
         *   HTML5 definition of id attribute
         *
@@ -1068,7 +1078,7 @@ class Sanitizer {
         *   'legacy': Behave the way the old HTML 4-based ID escaping worked even
         *       if $wgExperimentalHtmlIds is used, so we can generate extra
         *       anchors and links won't break.
-        * @return String
+        * @return string
         */
        static function escapeId( $id, $options = array() ) {
                global $wgExperimentalHtmlIds;
@@ -1111,8 +1121,8 @@ class Sanitizer {
         *
         * @see http://www.w3.org/TR/CSS21/syndata.html Valid characters/format
         *
-        * @param $class String
-        * @return String
+        * @param string $class
+        * @return string
         */
        static function escapeClass( $class ) {
                // Convert ugly stuff to underscores and kill underscores in ugly places
@@ -1126,8 +1136,8 @@ class Sanitizer {
         * Given HTML input, escape with htmlspecialchars but un-escape entities.
         * This allows (generally harmless) entities like &#160; to survive.
         *
-        * @param string $html to escape
-        * @return String: escaped input
+        * @param string $html HTML to escape
+        * @return string: escaped input
         */
        static function escapeHtmlAllowEntities( $html ) {
                $html = Sanitizer::decodeCharReferences( $html );
@@ -1139,7 +1149,7 @@ class Sanitizer {
 
        /**
         * Regex replace callback for armoring links against further processing.
-        * @param $matches Array
+        * @param array $matches
         * @return string
         */
        private static function armorLinksCallback( $matches ) {
@@ -1151,8 +1161,8 @@ class Sanitizer {
         * a partial tag string. Attribute names are forces to lowercase,
         * character references are decoded to UTF-8 text.
         *
-        * @param $text String
-        * @return Array
+        * @param string $text
+        * @return array
         */
        public static function decodeTagAttributes( $text ) {
                if ( trim( $text ) == '' ) {
@@ -1187,8 +1197,8 @@ class Sanitizer {
         * Build a partial tag string from an associative array of attribute
         * names and values as returned by decodeTagAttributes.
         *
-        * @param $assoc_array Array
-        * @return String
+        * @param array $assoc_array
+        * @return string
         */
        public static function safeEncodeTagAttributes( $assoc_array ) {
                $attribs = array();
@@ -1205,9 +1215,9 @@ class Sanitizer {
         * Pick the appropriate attribute value from a match set from the
         * attribs regex matches.
         *
-        * @param $set Array
-        * @throws MWException
-        * @return String
+        * @param array $set
+        * @throws MWException when tag conditions are not met.
+        * @return string
         */
        private static function getTagAttributeCallback( $set ) {
                if ( isset( $set[6] ) ) {
@@ -1239,8 +1249,9 @@ class Sanitizer {
         * but note that we're not returning the value, but are returning
         * XML source fragments that will be slapped into output.
         *
-        * @param $text String
-        * @return String
+        * @param string $text
+        * @return string
+        * @todo Remove, unused?
         */
        private static function normalizeAttributeValue( $text ) {
                return str_replace( '"', '&quot;',
@@ -1249,8 +1260,8 @@ class Sanitizer {
        }
 
        /**
-        * @param $text string
-        * @return mixed
+        * @param string $text
+        * @return string
         */
        private static function normalizeWhitespace( $text ) {
                return preg_replace(
@@ -1264,8 +1275,8 @@ class Sanitizer {
         * by Parser::stripSectionName(), for use in the id's that are used for
         * section links.
         *
-        * @param $section String
-        * @return String
+        * @param string $section
+        * @return string
         */
        static function normalizeSectionNameWhitespace( $section ) {
                return trim( preg_replace( '/[ _]+/', ' ', $section ) );
@@ -1282,8 +1293,8 @@ class Sanitizer {
         * c. use lower cased "&#x", not "&#X"
         * d. fix or reject non-valid attributes
         *
-        * @param $text String
-        * @return String
+        * @param string $text
+        * @return string
         * @private
         */
        static function normalizeCharReferences( $text ) {
@@ -1293,8 +1304,8 @@ class Sanitizer {
                        $text );
        }
        /**
-        * @param $matches String
-        * @return String
+        * @param string $matches
+        * @return string
         */
        static function normalizeCharReferencesCallback( $matches ) {
                $ret = null;
@@ -1319,8 +1330,8 @@ class Sanitizer {
         * the HTML equivalent. Otherwise, returns HTML-escaped text of
         * pseudo-entity source (eg &amp;foo;)
         *
-        * @param $name String
-        * @return String
+        * @param string $name
+        * @return string
         */
        static function normalizeEntity( $name ) {
                if ( isset( self::$htmlEntityAliases[$name] ) ) {
@@ -1336,7 +1347,7 @@ class Sanitizer {
        }
 
        /**
-        * @param $codepoint
+        * @param int $codepoint
         * @return null|string
         */
        static function decCharReference( $codepoint ) {
@@ -1349,7 +1360,7 @@ class Sanitizer {
        }
 
        /**
-        * @param $codepoint
+        * @param int $codepoint
         * @return null|string
         */
        static function hexCharReference( $codepoint ) {
@@ -1363,8 +1374,8 @@ class Sanitizer {
 
        /**
         * Returns true if a given Unicode codepoint is a valid character in XML.
-        * @param $codepoint Integer
-        * @return Boolean
+        * @param int $codepoint
+        * @return bool
         */
        private static function validateCodepoint( $codepoint ) {
                return $codepoint == 0x09
@@ -1379,8 +1390,8 @@ class Sanitizer {
         * Decode any character references, numeric or named entities,
         * in the text and return a UTF-8 string.
         *
-        * @param $text String
-        * @return String
+        * @param string $text
+        * @return string
         */
        public static function decodeCharReferences( $text ) {
                return preg_replace_callback(
@@ -1396,8 +1407,8 @@ class Sanitizer {
         * This is useful for page titles, not for text to be displayed,
         * MediaWiki allows HTML entities to escape normalization as a feature.
         *
-        * @param string $text (already normalized, containing entities)
-        * @return String (still normalized, without entities)
+        * @param string $text Already normalized, containing entities
+        * @return string Still normalized, without entities
         */
        public static function decodeCharReferencesAndNormalize( $text ) {
                global $wgContLang;
@@ -1414,8 +1425,8 @@ class Sanitizer {
        }
 
        /**
-        * @param $matches String
-        * @return String
+        * @param string $matches
+        * @return string
         */
        static function decodeCharReferencesCallback( $matches ) {
                if ( $matches[1] != '' ) {
@@ -1432,8 +1443,8 @@ class Sanitizer {
        /**
         * Return UTF-8 string for a codepoint if that is a valid
         * character reference, otherwise U+FFFD REPLACEMENT CHARACTER.
-        * @param $codepoint Integer
-        * @return String
+        * @param int $codepoint
+        * @return string
         * @private
         */
        static function decodeChar( $codepoint ) {
@@ -1449,8 +1460,8 @@ class Sanitizer {
         * return the UTF-8 encoding of that character. Otherwise, returns
         * pseudo-entity source (eg "&foo;")
         *
-        * @param $name String
-        * @return String
+        * @param string $name
+        * @return string
         */
        static function decodeEntity( $name ) {
                if ( isset( self::$htmlEntityAliases[$name] ) ) {
@@ -1466,8 +1477,8 @@ class Sanitizer {
        /**
         * Fetch the whitelist of acceptable attributes for a given element name.
         *
-        * @param $element String
-        * @return Array
+        * @param string $element
+        * @return array
         */
        static function attributeWhitelist( $element ) {
                $list = Sanitizer::setupAttributeWhitelist();
@@ -1479,7 +1490,7 @@ class Sanitizer {
        /**
         * Foreach array key (an allowed HTML element), return an array
         * of allowed attributes
-        * @return Array
+        * @return array
         */
        static function setupAttributeWhitelist() {
                global $wgAllowRdfaAttributes, $wgAllowMicrodataAttributes;
@@ -1702,7 +1713,7 @@ class Sanitizer {
         * inclusion in HTML output as of 1.10!
         *
         * @param string $text HTML fragment
-        * @return String
+        * @return string
         */
        static function stripAllTags( $text ) {
                # Actual <tags>
@@ -1722,7 +1733,7 @@ class Sanitizer {
         *
         * Use for passing XHTML fragments to PHP's XML parsing functions
         *
-        * @return String
+        * @return string
         */
        static function hackDocType() {
                $out = "<!DOCTYPE html [\n";
@@ -1734,7 +1745,7 @@ class Sanitizer {
        }
 
        /**
-        * @param $url string
+        * @param string $url
         * @return mixed|string
         */
        static function cleanUrl( $url ) {
@@ -1781,7 +1792,7 @@ class Sanitizer {
        }
 
        /**
-        * @param $matches array
+        * @param array $matches
         * @return string
         */
        static function cleanUrlCallback( $matches ) {
@@ -1814,7 +1825,7 @@ class Sanitizer {
         * @since 1.18
         *
         * @param string $addr E-mail address
-        * @return Bool
+        * @return bool
         */
        public static function validateEmail( $addr ) {
                $result = null;
index 531d1a4..d1269ad 100644 (file)
@@ -417,8 +417,8 @@ MWExceptionHandler::installHandler();
 wfProfileOut( $fname . '-exception' );
 
 wfProfileIn( $fname . '-includes' );
-require_once "$IP/includes/normal/UtfNormalUtil.php";
 require_once "$IP/includes/GlobalFunctions.php";
+require_once "$IP/includes/normal/UtfNormalUtil.php";
 require_once "$IP/includes/normal/UtfNormalDefines.php";
 wfProfileOut( $fname . '-includes' );
 
@@ -457,6 +457,8 @@ if ( !$wgHTCPRouting && $wgHTCPMulticastAddress ) {
        );
 }
 
+$wgDeferredUpdateList = array(); // b/c
+
 wfProfileOut( $fname . '-defaults2' );
 wfProfileIn( $fname . '-misc1' );
 
@@ -501,21 +503,22 @@ if ( $wgCommandLineMode ) {
 }
 
 wfProfileOut( $fname . '-misc1' );
-wfProfileIn( $fname . '-memcached' );
-
-$wgMemc = wfGetMainCache();
-$messageMemc = wfGetMessageCacheStorage();
-$parserMemc = wfGetParserCacheStorage();
-$wgLangConvMemc = wfGetLangConverterCacheStorage();
+if ( !defined( 'MW_SETUP_NO_CACHE' ) ) {
+       wfProfileIn( $fname . '-memcached' );
 
-wfDebug( 'CACHES: ' . get_class( $wgMemc ) . '[main] ' .
-       get_class( $messageMemc ) . '[message] ' .
-       get_class( $parserMemc ) . "[parser]\n" );
+       $wgMemc = wfGetMainCache();
+       $messageMemc = wfGetMessageCacheStorage();
+       $parserMemc = wfGetParserCacheStorage();
+       $wgLangConvMemc = wfGetLangConverterCacheStorage();
 
-wfProfileOut( $fname . '-memcached' );
+       wfDebug( 'CACHES: ' . get_class( $wgMemc ) . '[main] ' .
+               get_class( $messageMemc ) . '[message] ' .
+               get_class( $parserMemc ) . "[parser]\n" );
 
-# # Most of the config is out, some might want to run hooks here.
-wfRunHooks( 'SetupAfterCache' );
+       wfProfileOut( $fname . '-memcached' );
+       # # Most of the config is out, some might want to run hooks here.
+       wfRunHooks( 'SetupAfterCache' );
+}
 
 wfProfileIn( $fname . '-session' );
 
@@ -534,42 +537,44 @@ if ( !defined( 'MW_NO_SESSION' ) && !$wgCommandLineMode ) {
 }
 
 wfProfileOut( $fname . '-session' );
-wfProfileIn( $fname . '-globals' );
 
-$wgContLang = Language::factory( $wgLanguageCode );
-$wgContLang->initEncoding();
-$wgContLang->initContLang();
+if ( !defined( 'MW_SETUP_NO_CONTEXT' ) ) {
+       wfProfileIn( $fname . '-globals' );
 
-// Now that variant lists may be available...
-$wgRequest->interpolateTitle();
-$wgUser = RequestContext::getMain()->getUser(); # BackCompat
+       $wgContLang = Language::factory( $wgLanguageCode );
+       $wgContLang->initEncoding();
+       $wgContLang->initContLang();
 
-/**
- * @var $wgLang Language
- */
-$wgLang = new StubUserLang;
+       // Now that variant lists may be available...
+       $wgRequest->interpolateTitle();
+       $wgUser = RequestContext::getMain()->getUser(); # BackCompat
 
-/**
* @var OutputPage
- */
-$wgOut = RequestContext::getMain()->getOutput(); # BackCompat
+       /**
       * @var $wgLang Language
       */
+       $wgLang = new StubUserLang;
 
-/**
- * @var $wgParser Parser
- */
-$wgParser = new StubObject( 'wgParser', $wgParserConf['class'], array( $wgParserConf ) );
+       /**
+        * @var OutputPage
       */
+       $wgOut = RequestContext::getMain()->getOutput(); # BackCompat
 
-if ( !is_object( $wgAuth ) ) {
-       $wgAuth = new StubObject( 'wgAuth', 'AuthPlugin' );
-       wfRunHooks( 'AuthPluginSetup', array( &$wgAuth ) );
-}
+       /**
+        * @var $wgParser Parser
+        */
+       $wgParser = new StubObject( 'wgParser', $wgParserConf['class'], array( $wgParserConf ) );
 
-# Placeholders in case of DB error
-$wgTitle = null;
+       if ( !is_object( $wgAuth ) ) {
+               $wgAuth = new StubObject( 'wgAuth', 'AuthPlugin' );
+               wfRunHooks( 'AuthPluginSetup', array( &$wgAuth ) );
+       }
+
+       # Placeholders in case of DB error
+       $wgTitle = null;
 
-$wgDeferredUpdateList = array();
+       wfProfileOut( $fname . '-globals' );
+}
 
-wfProfileOut( $fname . '-globals' );
 wfProfileIn( $fname . '-extensions' );
 
 # Extension setup functions for extensions other than skins
diff --git a/includes/SpecialPageFactory.php b/includes/SpecialPageFactory.php
deleted file mode 100644 (file)
index 18b8f0b..0000000
+++ /dev/null
@@ -1,587 +0,0 @@
-<?php
-/**
- * Factory for handling the special page list and generating SpecialPage objects.
- *
- * 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 SpecialPage
- * @defgroup SpecialPage SpecialPage
- */
-
-/**
- * Factory for handling the special page list and generating SpecialPage objects.
- *
- * To add a special page in an extension, add to $wgSpecialPages either
- * an object instance or an array containing the name and constructor
- * parameters. The latter is preferred for performance reasons.
- *
- * The object instantiated must be either an instance of SpecialPage or a
- * sub-class thereof. It must have an execute() method, which sends the HTML
- * for the special page to $wgOut. The parent class has an execute() method
- * which distributes the call to the historical global functions. Additionally,
- * execute() also checks if the user has the necessary access privileges
- * and bails out if not.
- *
- * To add a core special page, use the similar static list in
- * SpecialPageFactory::$list. To remove a core static special page at runtime, use
- * a SpecialPage_initList hook.
- *
- * @ingroup SpecialPage
- * @since 1.17
- */
-class SpecialPageFactory {
-       /**
-        * List of special page names to the subclass of SpecialPage which handles them.
-        */
-       private static $list = array(
-               // Maintenance Reports
-               'BrokenRedirects'           => 'BrokenRedirectsPage',
-               'Deadendpages'              => 'DeadendpagesPage',
-               'DoubleRedirects'           => 'DoubleRedirectsPage',
-               'Longpages'                 => 'LongpagesPage',
-               'Ancientpages'              => 'AncientpagesPage',
-               'Lonelypages'               => 'LonelypagesPage',
-               'Fewestrevisions'           => 'FewestrevisionsPage',
-               'Withoutinterwiki'          => 'WithoutinterwikiPage',
-               'Protectedpages'            => 'SpecialProtectedpages',
-               'Protectedtitles'           => 'SpecialProtectedtitles',
-               'Shortpages'                => 'ShortpagesPage',
-               'Uncategorizedcategories'   => 'UncategorizedcategoriesPage',
-               'Uncategorizedimages'       => 'UncategorizedimagesPage',
-               'Uncategorizedpages'        => 'UncategorizedpagesPage',
-               'Uncategorizedtemplates'    => 'UncategorizedtemplatesPage',
-               'Unusedcategories'          => 'UnusedcategoriesPage',
-               'Unusedimages'              => 'UnusedimagesPage',
-               'Unusedtemplates'           => 'UnusedtemplatesPage',
-               'Unwatchedpages'            => 'UnwatchedpagesPage',
-               'Wantedcategories'          => 'WantedcategoriesPage',
-               'Wantedfiles'               => 'WantedfilesPage',
-               'Wantedpages'               => 'WantedpagesPage',
-               'Wantedtemplates'           => 'WantedtemplatesPage',
-
-               // List of pages
-               'Allpages'                  => 'SpecialAllpages',
-               'Prefixindex'               => 'SpecialPrefixindex',
-               'Categories'                => 'SpecialCategories',
-               'Listredirects'             => 'ListredirectsPage',
-               'PagesWithProp'             => 'SpecialPagesWithProp',
-
-               // Login/create account
-               'Userlogin'                 => 'LoginForm',
-               'CreateAccount'             => 'SpecialCreateAccount',
-
-               // Users and rights
-               'Block'                     => 'SpecialBlock',
-               'Unblock'                   => 'SpecialUnblock',
-               'BlockList'                 => 'SpecialBlockList',
-               'ChangePassword'            => 'SpecialChangePassword',
-               'PasswordReset'             => 'SpecialPasswordReset',
-               'DeletedContributions'      => 'DeletedContributionsPage',
-               'Preferences'               => 'SpecialPreferences',
-               'ResetTokens'               => 'SpecialResetTokens',
-               'Contributions'             => 'SpecialContributions',
-               'Listgrouprights'           => 'SpecialListGroupRights',
-               'Listusers'                 => 'SpecialListUsers',
-               'Listadmins'                => 'SpecialListAdmins',
-               'Listbots'                  => 'SpecialListBots',
-               'Activeusers'               => 'SpecialActiveUsers',
-               'Userrights'                => 'UserrightsPage',
-               'EditWatchlist'             => 'SpecialEditWatchlist',
-
-               // Recent changes and logs
-               'Newimages'                 => 'SpecialNewFiles',
-               'Log'                       => 'SpecialLog',
-               'Watchlist'                 => 'SpecialWatchlist',
-               'Newpages'                  => 'SpecialNewpages',
-               'Recentchanges'             => 'SpecialRecentChanges',
-               'Recentchangeslinked'       => 'SpecialRecentChangesLinked',
-               'Tags'                      => 'SpecialTags',
-
-               // Media reports and uploads
-               'Listfiles'                 => 'SpecialListFiles',
-               'Filepath'                  => 'SpecialFilepath',
-               'MIMEsearch'                => 'MIMEsearchPage',
-               'FileDuplicateSearch'       => 'FileDuplicateSearchPage',
-               'Upload'                    => 'SpecialUpload',
-               'UploadStash'               => 'SpecialUploadStash',
-
-               // Data and tools
-               'Statistics'                => 'SpecialStatistics',
-               'Allmessages'               => 'SpecialAllmessages',
-               'Version'                   => 'SpecialVersion',
-               'Lockdb'                    => 'SpecialLockdb',
-               'Unlockdb'                  => 'SpecialUnlockdb',
-
-               // Redirecting special pages
-               'LinkSearch'                => 'LinkSearchPage',
-               'Randompage'                => 'Randompage',
-               'RandomInCategory'          => 'SpecialRandomInCategory',
-               'Randomredirect'            => 'SpecialRandomredirect',
-
-               // High use pages
-               'Mostlinkedcategories'      => 'MostlinkedCategoriesPage',
-               'Mostimages'                => 'MostimagesPage',
-               'Mostinterwikis'            => 'MostinterwikisPage',
-               'Mostlinked'                => 'MostlinkedPage',
-               'Mostlinkedtemplates'       => 'MostlinkedTemplatesPage',
-               'Mostcategories'            => 'MostcategoriesPage',
-               'Mostrevisions'             => 'MostrevisionsPage',
-
-               // Page tools
-               'ComparePages'              => 'SpecialComparePages',
-               'Export'                    => 'SpecialExport',
-               'Import'                    => 'SpecialImport',
-               'Undelete'                  => 'SpecialUndelete',
-               'Whatlinkshere'             => 'SpecialWhatlinkshere',
-               'MergeHistory'              => 'SpecialMergeHistory',
-               'ExpandTemplates'           => 'SpecialExpandTemplates',
-
-               // Other
-               'Booksources'               => 'SpecialBookSources',
-
-               // Unlisted / redirects
-               'Blankpage'                 => 'SpecialBlankpage',
-               'Emailuser'                 => 'SpecialEmailUser',
-               'Movepage'                  => 'MovePageForm',
-               'Mycontributions'           => 'SpecialMycontributions',
-               'Mypage'                    => 'SpecialMypage',
-               'Mytalk'                    => 'SpecialMytalk',
-               'Myuploads'                 => 'SpecialMyuploads',
-               'AllMyUploads'              => 'SpecialAllMyUploads',
-               'PermanentLink'             => 'SpecialPermanentLink',
-               'Redirect'                  => 'SpecialRedirect',
-               'Revisiondelete'            => 'SpecialRevisionDelete',
-               'Specialpages'              => 'SpecialSpecialpages',
-               'Userlogout'                => 'SpecialUserlogout',
-       );
-
-       private static $aliases;
-
-       /**
-        * Get the special page list
-        *
-        * @return array
-        */
-       static function getList() {
-               global $wgSpecialPages;
-               global $wgDisableCounters, $wgDisableInternalSearch, $wgEmailAuthentication;
-               global $wgEnableEmail, $wgEnableJavaScriptTest;
-
-               if ( !is_object( self::$list ) ) {
-                       wfProfileIn( __METHOD__ );
-
-                       if ( !$wgDisableCounters ) {
-                               self::$list['Popularpages'] = 'PopularpagesPage';
-                       }
-
-                       if ( !$wgDisableInternalSearch ) {
-                               self::$list['Search'] = 'SpecialSearch';
-                       }
-
-                       if ( $wgEmailAuthentication ) {
-                               self::$list['Confirmemail'] = 'EmailConfirmation';
-                               self::$list['Invalidateemail'] = 'EmailInvalidation';
-                       }
-
-                       if ( $wgEnableEmail ) {
-                               self::$list['ChangeEmail'] = 'SpecialChangeEmail';
-                       }
-
-                       if ( $wgEnableJavaScriptTest ) {
-                               self::$list['JavaScriptTest'] = 'SpecialJavaScriptTest';
-                       }
-
-                       // Add extension special pages
-                       self::$list = array_merge( self::$list, $wgSpecialPages );
-
-                       // Run hooks
-                       // This hook can be used to remove undesired built-in special pages
-                       wfRunHooks( 'SpecialPage_initList', array( &self::$list ) );
-
-                       // Cast to object: func()[$key] doesn't work, but func()->$key does
-                       settype( self::$list, 'object' );
-
-                       wfProfileOut( __METHOD__ );
-               }
-               return self::$list;
-       }
-
-       /**
-        * Initialise and return the list of special page aliases.  Returns an object with
-        * properties which can be accessed $obj->pagename - each property is an array of
-        * aliases; the first in the array is the canonical alias.  All registered special
-        * pages are guaranteed to have a property entry, and for that property array to
-        * contain at least one entry (English fallbacks will be added if necessary).
-        * @return Object
-        */
-       static function getAliasList() {
-               if ( !is_object( self::$aliases ) ) {
-                       global $wgContLang;
-                       $aliases = $wgContLang->getSpecialPageAliases();
-
-                       // Objects are passed by reference by default, need to create a copy
-                       $missingPages = clone self::getList();
-
-                       self::$aliases = array();
-                       foreach ( $aliases as $realName => $aliasList ) {
-                               foreach ( $aliasList as $alias ) {
-                                       self::$aliases[$wgContLang->caseFold( $alias )] = $realName;
-                               }
-                               unset( $missingPages->$realName );
-                       }
-                       foreach ( $missingPages as $name => $stuff ) {
-                               self::$aliases[$wgContLang->caseFold( $name )] = $name;
-                       }
-
-                       // Cast to object: func()[$key] doesn't work, but func()->$key does
-                       self::$aliases = (object)self::$aliases;
-               }
-               return self::$aliases;
-       }
-
-       /**
-        * Given a special page name with a possible subpage, return an array
-        * where the first element is the special page name and the second is the
-        * subpage.
-        *
-        * @param string $alias
-        * @return array Array( String, String|null ), or array( null, null ) if the page is invalid
-        */
-       public static function resolveAlias( $alias ) {
-               global $wgContLang;
-               $bits = explode( '/', $alias, 2 );
-
-               $caseFoldedAlias = $wgContLang->caseFold( $bits[0] );
-               $caseFoldedAlias = str_replace( ' ', '_', $caseFoldedAlias );
-               if ( isset( self::getAliasList()->$caseFoldedAlias ) ) {
-                       $name = self::getAliasList()->$caseFoldedAlias;
-               } else {
-                       return array( null, null );
-               }
-
-               if ( !isset( $bits[1] ) ) { // bug 2087
-                       $par = null;
-               } else {
-                       $par = $bits[1];
-               }
-
-               return array( $name, $par );
-       }
-
-       /**
-        * Add a page to a certain display group for Special:SpecialPages
-        *
-        * @param SpecialPage|string $page
-        * @param string $group
-        * @deprecated since 1.21 Override SpecialPage::getGroupName
-        */
-       public static function setGroup( $page, $group ) {
-               wfDeprecated( __METHOD__, '1.21' );
-
-               global $wgSpecialPageGroups;
-               $name = is_object( $page ) ? $page->getName() : $page;
-               $wgSpecialPageGroups[$name] = $group;
-       }
-
-       /**
-        * Get the group that the special page belongs in on Special:SpecialPage
-        *
-        * @param SpecialPage $page
-        * @return string
-        * @deprecated since 1.21 Use SpecialPage::getFinalGroupName
-        */
-       public static function getGroup( &$page ) {
-               wfDeprecated( __METHOD__, '1.21' );
-
-               return $page->getFinalGroupName();
-       }
-
-       /**
-        * Check if a given name exist as a special page or as a special page alias
-        *
-        * @param string $name Name of a special page
-        * @return bool True if a special page exists with this name
-        */
-       public static function exists( $name ) {
-               list( $title, /*...*/ ) = self::resolveAlias( $name );
-               return property_exists( self::getList(), $title );
-       }
-
-       /**
-        * Find the object with a given name and return it (or NULL)
-        *
-        * @param string $name Special page name, may be localised and/or an alias
-        * @return SpecialPage|null SpecialPage object or null if the page doesn't exist
-        */
-       public static function getPage( $name ) {
-               list( $realName, /*...*/ ) = self::resolveAlias( $name );
-               if ( property_exists( self::getList(), $realName ) ) {
-                       $rec = self::getList()->$realName;
-                       if ( is_string( $rec ) ) {
-                               $className = $rec;
-                               return new $className;
-                       } elseif ( is_array( $rec ) ) {
-                               // @deprecated, officially since 1.18, unofficially since forever
-                               wfDebug( "Array syntax for \$wgSpecialPages is deprecated, define a subclass of SpecialPage instead." );
-                               $className = array_shift( $rec );
-                               self::getList()->$realName = MWFunction::newObj( $className, $rec );
-                       }
-                       return self::getList()->$realName;
-               } else {
-                       return null;
-               }
-       }
-
-       /**
-        * Return categorised listable special pages which are available
-        * for the current user, and everyone.
-        *
-        * @param $user User object to check permissions, $wgUser will be used if
-        *   if not provided
-        * @return array ( string => Specialpage )
-        */
-       public static function getUsablePages( User $user = null ) {
-               $pages = array();
-               if ( $user === null ) {
-                       global $wgUser;
-                       $user = $wgUser;
-               }
-               foreach ( self::getList() as $name => $rec ) {
-                       $page = self::getPage( $name );
-                       if ( $page ) { // not null
-                               $page->setContext( RequestContext::getMain() );
-                               if ( $page->isListed()
-                                       && ( !$page->isRestricted() || $page->userCanExecute( $user ) )
-                               ) {
-                                       $pages[$name] = $page;
-                               }
-                       }
-               }
-               return $pages;
-       }
-
-       /**
-        * Return categorised listable special pages for all users
-        *
-        * @return array ( string => Specialpage )
-        */
-       public static function getRegularPages() {
-               $pages = array();
-               foreach ( self::getList() as $name => $rec ) {
-                       $page = self::getPage( $name );
-                       if ( $page->isListed() && !$page->isRestricted() ) {
-                               $pages[$name] = $page;
-                       }
-               }
-               return $pages;
-       }
-
-       /**
-        * Return categorised listable special pages which are available
-        * for the current user, but not for everyone
-        *
-        * @return array ( string => Specialpage )
-        */
-       public static function getRestrictedPages() {
-               global $wgUser;
-               $pages = array();
-               foreach ( self::getList() as $name => $rec ) {
-                       $page = self::getPage( $name );
-                       if (
-                               $page->isListed()
-                               && $page->isRestricted()
-                               && $page->userCanExecute( $wgUser )
-                       ) {
-                               $pages[$name] = $page;
-                       }
-               }
-               return $pages;
-       }
-
-       /**
-        * Execute a special page path.
-        * The path may contain parameters, e.g. Special:Name/Params
-        * Extracts the special page name and call the execute method, passing the parameters
-        *
-        * Returns a title object if the page is redirected, false if there was no such special
-        * page, and true if it was successful.
-        *
-        * @param Title $title
-        * @param IContextSource $context
-        * @param bool $including Bool output is being captured for use in {{special:whatever}}
-        *
-        * @return bool
-        */
-       public static function executePath( Title &$title, IContextSource &$context, $including = false ) {
-               wfProfileIn( __METHOD__ );
-
-               // @todo FIXME: Redirects broken due to this call
-               $bits = explode( '/', $title->getDBkey(), 2 );
-               $name = $bits[0];
-               if ( !isset( $bits[1] ) ) { // bug 2087
-                       $par = null;
-               } else {
-                       $par = $bits[1];
-               }
-               $page = self::getPage( $name );
-               // Nonexistent?
-               if ( !$page ) {
-                       $context->getOutput()->setArticleRelated( false );
-                       $context->getOutput()->setRobotPolicy( 'noindex,nofollow' );
-
-                       global $wgSend404Code;
-                       if ( $wgSend404Code ) {
-                               $context->getOutput()->setStatusCode( 404 );
-                       }
-
-                       $context->getOutput()->showErrorPage( 'nosuchspecialpage', 'nospecialpagetext' );
-                       wfProfileOut( __METHOD__ );
-                       return false;
-               }
-
-               // Page exists, set the context
-               $page->setContext( $context );
-
-               if ( !$including ) {
-                       // Redirect to canonical alias for GET commands
-                       // Not for POST, we'd lose the post data, so it's best to just distribute
-                       // the request. Such POST requests are possible for old extensions that
-                       // generate self-links without being aware that their default name has
-                       // changed.
-                       if ( $name != $page->getLocalName() && !$context->getRequest()->wasPosted() ) {
-                               $query = $context->getRequest()->getQueryValues();
-                               unset( $query['title'] );
-                               $title = $page->getPageTitle( $par );
-                               $url = $title->getFullURL( $query );
-                               $context->getOutput()->redirect( $url );
-                               wfProfileOut( __METHOD__ );
-                               return $title;
-                       } else {
-                               $context->setTitle( $page->getPageTitle( $par ) );
-                       }
-
-               } elseif ( !$page->isIncludable() ) {
-                       wfProfileOut( __METHOD__ );
-                       return false;
-               }
-
-               $page->including( $including );
-
-               // Execute special page
-               $profName = 'Special:' . $page->getName();
-               wfProfileIn( $profName );
-               $page->run( $par );
-               wfProfileOut( $profName );
-               wfProfileOut( __METHOD__ );
-               return true;
-       }
-
-       /**
-        * Just like executePath() but will override global variables and execute
-        * the page in "inclusion" mode. Returns true if the execution was
-        * successful or false if there was no such special page, or a title object
-        * if it was a redirect.
-        *
-        * Also saves the current $wgTitle, $wgOut, $wgRequest, $wgUser and $wgLang
-        * variables so that the special page will get the context it'd expect on a
-        * normal request, and then restores them to their previous values after.
-        *
-        * @param Title $title
-        * @param IContextSource $context
-        * @return string HTML fragment
-        */
-       static function capturePath( Title $title, IContextSource $context ) {
-               global $wgOut, $wgTitle, $wgRequest, $wgUser, $wgLang;
-
-               // Save current globals
-               $oldTitle = $wgTitle;
-               $oldOut = $wgOut;
-               $oldRequest = $wgRequest;
-               $oldUser = $wgUser;
-               $oldLang = $wgLang;
-
-               // Set the globals to the current context
-               $wgTitle = $title;
-               $wgOut = $context->getOutput();
-               $wgRequest = $context->getRequest();
-               $wgUser = $context->getUser();
-               $wgLang = $context->getLanguage();
-
-               // The useful part
-               $ret = self::executePath( $title, $context, true );
-
-               // And restore the old globals
-               $wgTitle = $oldTitle;
-               $wgOut = $oldOut;
-               $wgRequest = $oldRequest;
-               $wgUser = $oldUser;
-               $wgLang = $oldLang;
-
-               return $ret;
-       }
-
-       /**
-        * Get the local name for a specified canonical name
-        *
-        * @param string $name
-        * @param string|bool $subpage
-        * @return string
-        */
-       static function getLocalNameFor( $name, $subpage = false ) {
-               global $wgContLang;
-               $aliases = $wgContLang->getSpecialPageAliases();
-
-               if ( isset( $aliases[$name][0] ) ) {
-                       $name = $aliases[$name][0];
-               } else {
-                       // Try harder in case someone misspelled the correct casing
-                       $found = false;
-                       foreach ( $aliases as $n => $values ) {
-                               if ( strcasecmp( $name, $n ) === 0 ) {
-                                       wfWarn( "Found alias defined for $n when searching for " .
-                                               "special page aliases for $name. Case mismatch?" );
-                                       $name = $values[0];
-                                       $found = true;
-                                       break;
-                               }
-                       }
-                       if ( !$found ) {
-                               wfWarn( "Did not find alias for special page '$name'. " .
-                                       "Perhaps no aliases are defined for it?" );
-                       }
-               }
-               if ( $subpage !== false && !is_null( $subpage ) ) {
-                       $name = "$name/$subpage";
-               }
-               return $wgContLang->ucfirst( $name );
-       }
-
-       /**
-        * Get a title for a given alias
-        *
-        * @param string $alias
-        * @return Title|null Title or null if there is no such alias
-        */
-       static function getTitleForAlias( $alias ) {
-               $name = self::resolveAlias( $alias );
-               if ( $name ) {
-                       return SpecialPage::getTitleFor( $name );
-               } else {
-                       return null;
-               }
-       }
-}
diff --git a/includes/Timestamp.php b/includes/Timestamp.php
deleted file mode 100644 (file)
index c1c6455..0000000
+++ /dev/null
@@ -1,396 +0,0 @@
-<?php
-/**
- * Creation and parsing of MW-style timestamps.
- *
- * 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
- * @since 1.20
- * @author Tyler Romeo, 2012
- */
-
-/**
- * Library for creating and parsing MW-style timestamps. Based on the JS
- * library that does the same thing.
- *
- * @since 1.20
- */
-class MWTimestamp {
-       /**
-        * Standard gmdate() formats for the different timestamp types.
-        */
-       private static $formats = array(
-               TS_UNIX => 'U',
-               TS_MW => 'YmdHis',
-               TS_DB => 'Y-m-d H:i:s',
-               TS_ISO_8601 => 'Y-m-d\TH:i:s\Z',
-               TS_ISO_8601_BASIC => 'Ymd\THis\Z',
-               TS_EXIF => 'Y:m:d H:i:s', // This shouldn't ever be used, but is included for completeness
-               TS_RFC2822 => 'D, d M Y H:i:s',
-               TS_ORACLE => 'd-m-Y H:i:s.000000', // Was 'd-M-y h.i.s A' . ' +00:00' before r51500
-               TS_POSTGRES => 'Y-m-d H:i:s',
-       );
-
-       /**
-        * The actual timestamp being wrapped (DateTime object).
-        * @var DateTime
-        */
-       public $timestamp;
-
-       /**
-        * Make a new timestamp and set it to the specified time,
-        * or the current time if unspecified.
-        *
-        * @since 1.20
-        *
-        * @param bool|string $timestamp Timestamp to set, or false for current time
-        */
-       public function __construct( $timestamp = false ) {
-               $this->setTimestamp( $timestamp );
-       }
-
-       /**
-        * Set the timestamp to the specified time, or the current time if unspecified.
-        *
-        * Parse the given timestamp into either a DateTime object or a Unix timestamp,
-        * and then store it.
-        *
-        * @since 1.20
-        *
-        * @param string|bool $ts Timestamp to store, or false for now
-        * @throws TimestampException
-        */
-       public function setTimestamp( $ts = false ) {
-               $da = array();
-               $strtime = '';
-
-               if ( !$ts || $ts === "\0\0\0\0\0\0\0\0\0\0\0\0\0\0" ) { // We want to catch 0, '', null... but not date strings starting with a letter.
-                       $uts = time();
-                       $strtime = "@$uts";
-               } elseif ( preg_match( '/^(\d{4})\-(\d\d)\-(\d\d) (\d\d):(\d\d):(\d\d)$/D', $ts, $da ) ) {
-                       # TS_DB
-               } elseif ( preg_match( '/^(\d{4}):(\d\d):(\d\d) (\d\d):(\d\d):(\d\d)$/D', $ts, $da ) ) {
-                       # TS_EXIF
-               } elseif ( preg_match( '/^(\d{4})(\d\d)(\d\d)(\d\d)(\d\d)(\d\d)$/D', $ts, $da ) ) {
-                       # TS_MW
-               } elseif ( preg_match( '/^-?\d{1,13}$/D', $ts ) ) {
-                       # TS_UNIX
-                       $strtime = "@$ts"; // http://php.net/manual/en/datetime.formats.compound.php
-               } elseif ( preg_match( '/^\d{2}-\d{2}-\d{4} \d{2}:\d{2}:\d{2}.\d{6}$/', $ts ) ) {
-                       # TS_ORACLE // session altered to DD-MM-YYYY HH24:MI:SS.FF6
-                       $strtime = preg_replace( '/(\d\d)\.(\d\d)\.(\d\d)(\.(\d+))?/', "$1:$2:$3",
-                                       str_replace( '+00:00', 'UTC', $ts ) );
-               } elseif ( preg_match( '/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(?:\.*\d*)?Z?$/', $ts, $da ) ) {
-                       # TS_ISO_8601
-               } elseif ( preg_match( '/^(\d{4})(\d{2})(\d{2})T(\d{2})(\d{2})(\d{2})(?:\.*\d*)?Z?$/', $ts, $da ) ) {
-                       #TS_ISO_8601_BASIC
-               } elseif ( preg_match( '/^(\d{4})\-(\d\d)\-(\d\d) (\d\d):(\d\d):(\d\d)\.*\d*[\+\- ](\d\d)$/', $ts, $da ) ) {
-                       # TS_POSTGRES
-               } elseif ( preg_match( '/^(\d{4})\-(\d\d)\-(\d\d) (\d\d):(\d\d):(\d\d)\.*\d* GMT$/', $ts, $da ) ) {
-                       # TS_POSTGRES
-               } elseif ( preg_match( '/^[ \t\r\n]*([A-Z][a-z]{2},[ \t\r\n]*)?' . # Day of week
-                                                               '\d\d?[ \t\r\n]*[A-Z][a-z]{2}[ \t\r\n]*\d{2}(?:\d{2})?' .  # dd Mon yyyy
-                                                               '[ \t\r\n]*\d\d[ \t\r\n]*:[ \t\r\n]*\d\d[ \t\r\n]*:[ \t\r\n]*\d\d/S', $ts ) ) { # hh:mm:ss
-                       # TS_RFC2822, accepting a trailing comment. See http://www.squid-cache.org/mail-archive/squid-users/200307/0122.html / r77171
-                       # The regex is a superset of rfc2822 for readability
-                       $strtime = strtok( $ts, ';' );
-               } elseif ( preg_match( '/^[A-Z][a-z]{5,8}, \d\d-[A-Z][a-z]{2}-\d{2} \d\d:\d\d:\d\d/', $ts ) ) {
-                       # TS_RFC850
-                       $strtime = $ts;
-               } elseif ( preg_match( '/^[A-Z][a-z]{2} [A-Z][a-z]{2} +\d{1,2} \d\d:\d\d:\d\d \d{4}/', $ts ) ) {
-                       # asctime
-                       $strtime = $ts;
-               } else {
-                       throw new TimestampException( __METHOD__ . ": Invalid timestamp - $ts" );
-               }
-
-               if ( !$strtime ) {
-                       $da = array_map( 'intval', $da );
-                       $da[0] = "%04d-%02d-%02dT%02d:%02d:%02d.00+00:00";
-                       $strtime = call_user_func_array( "sprintf", $da );
-               }
-
-               try {
-                       $final = new DateTime( $strtime, new DateTimeZone( 'GMT' ) );
-               } catch ( Exception $e ) {
-                       throw new TimestampException( __METHOD__ . ': Invalid timestamp format.', $e->getCode(), $e );
-               }
-
-               if ( $final === false ) {
-                       throw new TimestampException( __METHOD__ . ': Invalid timestamp format.' );
-               }
-               $this->timestamp = $final;
-       }
-
-       /**
-        * Get the timestamp represented by this object in a certain form.
-        *
-        * Convert the internal timestamp to the specified format and then
-        * return it.
-        *
-        * @since 1.20
-        *
-        * @param int $style Constant Output format for timestamp
-        * @throws TimestampException
-        * @return string The formatted timestamp
-        */
-       public function getTimestamp( $style = TS_UNIX ) {
-               if ( !isset( self::$formats[$style] ) ) {
-                       throw new TimestampException( __METHOD__ . ': Illegal timestamp output type.' );
-               }
-
-               $output = $this->timestamp->format( self::$formats[$style] );
-
-               if ( ( $style == TS_RFC2822 ) || ( $style == TS_POSTGRES ) ) {
-                       $output .= ' GMT';
-               }
-
-               return $output;
-       }
-
-       /**
-        * Get the timestamp in a human-friendly relative format, e.g., "3 days ago".
-        *
-        * Determine the difference between the timestamp and the current time, and
-        * generate a readable timestamp by returning "<N> <units> ago", where the
-        * largest possible unit is used.
-        *
-        * @since 1.20
-        * @since 1.22 Uses Language::getHumanTimestamp to produce the timestamp
-        *
-        * @param MWTimestamp|null $relativeTo The base timestamp to compare to (defaults to now)
-        * @param User|null $user User the timestamp is being generated for (or null to use main context's user)
-        * @param Language|null $lang Language to use to make the human timestamp (or null to use main context's language)
-        * @return string Formatted timestamp
-        */
-       public function getHumanTimestamp( MWTimestamp $relativeTo = null, User $user = null, Language $lang = null ) {
-               if ( $relativeTo === null ) {
-                       $relativeTo = new self();
-               }
-               if ( $user === null ) {
-                       $user = RequestContext::getMain()->getUser();
-               }
-               if ( $lang === null ) {
-                       $lang = RequestContext::getMain()->getLanguage();
-               }
-
-               // Adjust for the user's timezone.
-               $offsetThis = $this->offsetForUser( $user );
-               $offsetRel = $relativeTo->offsetForUser( $user );
-
-               $ts = '';
-               if ( wfRunHooks( 'GetHumanTimestamp', array( &$ts, $this, $relativeTo, $user, $lang ) ) ) {
-                       $ts = $lang->getHumanTimestamp( $this, $relativeTo, $user );
-               }
-
-               // Reset the timezone on the objects.
-               $this->timestamp->sub( $offsetThis );
-               $relativeTo->timestamp->sub( $offsetRel );
-
-               return $ts;
-       }
-
-       /**
-        * Adjust the timestamp depending on the given user's preferences.
-        *
-        * @since 1.22
-        *
-        * @param User $user User to take preferences from
-        * @param[out] MWTimestamp $ts Timestamp to adjust
-        * @return DateInterval Offset that was applied to the timestamp
-        */
-       public function offsetForUser( User $user ) {
-               global $wgLocalTZoffset;
-
-               $option = $user->getOption( 'timecorrection' );
-               $data = explode( '|', $option, 3 );
-
-               // First handle the case of an actual timezone being specified.
-               if ( $data[0] == 'ZoneInfo' ) {
-                       try {
-                               $tz = new DateTimeZone( $data[2] );
-                       } catch ( Exception $e ) {
-                               $tz = false;
-                       }
-
-                       if ( $tz ) {
-                               $this->timestamp->setTimezone( $tz );
-                               return new DateInterval( 'P0Y' );
-                       } else {
-                               $data[0] = 'Offset';
-                       }
-               }
-
-               $diff = 0;
-               // If $option is in fact a pipe-separated value, check the
-               // first value.
-               if ( $data[0] == 'System' ) {
-                       // First value is System, so use the system offset.
-                       if ( isset( $wgLocalTZoffset ) ) {
-                               $diff = $wgLocalTZoffset;
-                       }
-               } elseif ( $data[0] == 'Offset' ) {
-                       // First value is Offset, so use the specified offset
-                       $diff = (int)$data[1];
-               } else {
-                       // $option actually isn't a pipe separated value, but instead
-                       // a comma separated value. Isn't MediaWiki fun?
-                       $data = explode( ':', $option );
-                       if ( count( $data ) >= 2 ) {
-                               // Combination hours and minutes.
-                               $diff = abs( (int)$data[0] ) * 60 + (int)$data[1];
-                               if ( (int)$data[0] < 0 ) {
-                                       $diff *= -1;
-                               }
-                       } else {
-                               // Just hours.
-                               $diff = (int)$data[0] * 60;
-                       }
-               }
-
-               $interval = new DateInterval( 'PT' . abs( $diff ) . 'M' );
-               if ( $diff < 1 ) {
-                       $interval->invert = 1;
-               }
-
-               $this->timestamp->add( $interval );
-               return $interval;
-       }
-
-       /**
-        * Generate a purely relative timestamp, i.e., represent the time elapsed between
-        * the given base timestamp and this object.
-        *
-        * @param MWTimestamp $relativeTo Relative base timestamp (defaults to now)
-        * @param User $user Use to use offset for
-        * @param Language $lang Language to use
-        * @param array $chosenIntervals Intervals to use to represent it
-        * @return string Relative timestamp
-        */
-       public function getRelativeTimestamp(
-               MWTimestamp $relativeTo = null,
-               User $user = null,
-               Language $lang = null,
-               array $chosenIntervals = array()
-       ) {
-               if ( $relativeTo === null ) {
-                       $relativeTo = new self;
-               }
-               if ( $user === null ) {
-                       $user = RequestContext::getMain()->getUser();
-               }
-               if ( $lang === null ) {
-                       $lang = RequestContext::getMain()->getLanguage();
-               }
-
-               $ts = '';
-               $diff = $this->diff( $relativeTo );
-               if ( wfRunHooks( 'GetRelativeTimestamp', array( &$ts, &$diff, $this, $relativeTo, $user, $lang ) ) ) {
-                       $seconds = ( ( ( $diff->days * 24 + $diff->h ) * 60 + $diff->i ) * 60 + $diff->s );
-                       $ts = wfMessage( 'ago', $lang->formatDuration( $seconds, $chosenIntervals ) )
-                               ->inLanguage( $lang )
-                               ->text();
-               }
-
-               return $ts;
-       }
-
-       /**
-        * @since 1.20
-        *
-        * @return string
-        */
-       public function __toString() {
-               return $this->getTimestamp();
-       }
-
-       /**
-        * Calculate the difference between two MWTimestamp objects.
-        *
-        * @since 1.22
-        * @param MWTimestamp $relativeTo Base time to calculate difference from
-        * @return DateInterval|bool The DateInterval object representing the difference between the two dates or false on failure
-        */
-       public function diff( MWTimestamp $relativeTo ) {
-               return $this->timestamp->diff( $relativeTo->timestamp );
-       }
-
-       /**
-        * Set the timezone of this timestamp to the specified timezone.
-        *
-        * @since 1.22
-        * @param String $timezone Timezone to set
-        * @throws TimestampException
-        */
-       public function setTimezone( $timezone ) {
-               try {
-                       $this->timestamp->setTimezone( new DateTimeZone( $timezone ) );
-               } catch ( Exception $e ) {
-                       throw new TimestampException( __METHOD__ . ': Invalid timezone.', $e->getCode(), $e );
-               }
-       }
-
-       /**
-        * Get the timezone of this timestamp.
-        *
-        * @since 1.22
-        * @return DateTimeZone The timezone
-        */
-       public function getTimezone() {
-               return $this->timestamp->getTimezone();
-       }
-
-       /**
-        * Format the timestamp in a given format.
-        *
-        * @since 1.22
-        * @param string $format Pattern to format in
-        * @return string The formatted timestamp
-        */
-       public function format( $format ) {
-               return $this->timestamp->format( $format );
-       }
-
-       /**
-        * Get a timestamp instance in the server local timezone ($wgLocaltimezone)
-        *
-        * @since 1.22
-        * @param bool|string $ts Timestamp to set, or false for current time
-        * @return MWTimestamp the local instance
-        */
-       public static function getLocalInstance( $ts = false ) {
-               global $wgLocaltimezone;
-               $timestamp = new self( $ts );
-               $timestamp->setTimezone( $wgLocaltimezone );
-               return $timestamp;
-       }
-
-       /**
-        * Get a timestamp instance in GMT
-        *
-        * @since 1.22
-        * @param bool|string $ts Timestamp to set, or false for current time
-        * @return MWTimestamp the instance
-        */
-       public static function getInstance( $ts = false ) {
-               return new self( $ts );
-       }
-}
-
-/**
- * @since 1.20
- */
-class TimestampException extends MWException {}
diff --git a/includes/TimestampException.php b/includes/TimestampException.php
new file mode 100644 (file)
index 0000000..18f58fd
--- /dev/null
@@ -0,0 +1,6 @@
+<?php
+
+/**
+ * @since 1.20
+ */
+class TimestampException extends MWException {}
\ No newline at end of file
index 096a04d..bdba578 100644 (file)
@@ -60,7 +60,7 @@ class Title {
        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 $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
@@ -706,6 +706,8 @@ class Title {
        /**
         * Get the interwiki prefix
         *
+        * Use Title::isExternal to check if a interwiki is set
+        *
         * @return String Interwiki prefix
         */
        public function getInterwiki() {
@@ -1194,21 +1196,33 @@ class Title {
        /**
         * Get the Title fragment (i.e.\ the bit after the #) in text form
         *
+        * Use Title::hasFragment to check for a fragment
+        *
         * @return String Title fragment
         */
        public function getFragment() {
                return $this->mFragment;
        }
 
+       /**
+        * Check if a Title fragment is set
+        *
+        * @return bool
+        * @since 1.23
+        */
+       public function hasFragment() {
+               return $this->mFragment !== '';
+       }
+
        /**
         * Get the fragment in URL form, including the "#" character if there is one
         * @return String Fragment in URL form
         */
        public function getFragmentForURL() {
-               if ( $this->mFragment == '' ) {
+               if ( !$this->hasFragment() ) {
                        return '';
                } else {
-                       return '#' . Title::escapeFragmentForURL( $this->mFragment );
+                       return '#' . Title::escapeFragmentForURL( $this->getFragment() );
                }
        }
 
@@ -1290,8 +1304,8 @@ class Title {
         */
        public function getFullText() {
                $text = $this->getPrefixedText();
-               if ( $this->mFragment != '' ) {
-                       $text .= '#' . $this->mFragment;
+               if ( $this->hasFragment() ) {
+                       $text .= '#' . $this->getFragment();
                }
                return $text;
        }
@@ -1628,7 +1642,7 @@ class Title {
                wfProfileIn( __METHOD__ );
                if ( $this->isExternal() || $proto !== PROTO_RELATIVE ) {
                        $ret = $this->getFullURL( $query, $query2, $proto );
-               } elseif ( $this->getPrefixedText() === '' && $this->getFragment() !== '' ) {
+               } elseif ( $this->getPrefixedText() === '' && $this->hasFragment() ) {
                        $ret = $this->getFragmentForURL();
                } else {
                        $ret = $this->getLocalURL( $query, $query2 ) . $this->getFragmentForURL();
@@ -2555,6 +2569,19 @@ class Title {
                return ( $sources > 0 );
        }
 
+       /**
+        * Determines whether cascading protection sources have already been loaded from
+        * the database.
+        *
+        * @param bool $getPages True to check if the pages are loaded, or false to check
+        * if the status is loaded.
+        * @return bool Whether or not the specified information has been loaded
+        * @since 1.23
+        */
+       public function areCascadeProtectionSourcesLoaded( $getPages = true ) {
+               return $getPages ? isset( $this->mCascadeSources ) : isset( $this->mHasCascadingRestrictions );
+       }
+
        /**
         * Cascading protection: Get the source of any cascading restrictions on this page.
         *
@@ -2655,6 +2682,17 @@ class Title {
                return array( $sources, $pagerestrictions );
        }
 
+       /**
+        * Accessor for mRestrictionsLoaded
+        *
+        * @return bool Whether or not the page's restrictions have already been
+        * loaded from the database
+        * @since 1.23
+        */
+       public function areRestrictionsLoaded() {
+               return $this->mRestrictionsLoaded;
+       }
+
        /**
         * Accessor/initialisation for mRestrictions
         *
@@ -2670,6 +2708,21 @@ class Title {
                                : array();
        }
 
+       /**
+        * Accessor/initialisation for mRestrictions
+        *
+        * @return Array of Arrays of Strings the first level indexed by
+        * action, the second level containing the names of the groups
+        * allowed to perform each action
+        * @since 1.23
+        */
+       public function getAllRestrictions() {
+               if ( !$this->mRestrictionsLoaded ) {
+                       $this->loadRestrictions();
+               }
+               return $this->mRestrictions;
+       }
+
        /**
         * Get the expiry time for the restriction against a given action
         *
@@ -3161,7 +3214,8 @@ class Title {
                global $wgContLang, $wgLocalInterwiki;
 
                # Initialisation
-               $this->mInterwiki = $this->mFragment = '';
+               $this->mInterwiki = '';
+               $this->mFragment = '';
                $this->mNamespace = $this->mDefaultNamespace; # Usually NS_MAIN
 
                $dbkey = $this->mDbkeyform;
@@ -3256,10 +3310,6 @@ class Title {
                        break;
                } while ( true );
 
-               # We already know that some pages won't be in the database!
-               if ( $this->isExternal() || NS_SPECIAL == $this->mNamespace ) {
-                       $this->mArticleID = 0;
-               }
                $fragment = strstr( $dbkey, '#' );
                if ( false !== $fragment ) {
                        $this->setFragment( $fragment );
@@ -3329,9 +3379,9 @@ class Title {
                // there are numerous ways to present the same IP. Having sp:contribs scan
                // them all is silly and having some show the edits and others not is
                // inconsistent. Same for talk/userpages. Keep them normalized instead.
-               $dbkey = ( $this->mNamespace == NS_USER || $this->mNamespace == NS_USER_TALK )
-                       ? IP::sanitizeIP( $dbkey )
-                       : $dbkey;
+               if ( $this->mNamespace == NS_USER || $this->mNamespace == NS_USER_TALK ) {
+                       $dbkey = IP::sanitizeIP( $dbkey );
+               }
 
                // Any remaining initial :s are illegal.
                if ( $dbkey !== '' && ':' == $dbkey[0] ) {
@@ -3344,6 +3394,11 @@ class Title {
 
                $this->mTextform = str_replace( '_', ' ', $dbkey );
 
+               # We already know that some pages won't be in the database!
+               if ( $this->isExternal() || $this->mNamespace == NS_SPECIAL ) {
+                       $this->mArticleID = 0;
+               }
+
                return true;
        }
 
index ca3f79b..7f7a22d 100644 (file)
@@ -4629,20 +4629,20 @@ class User {
                        return;
                }
 
+               $defaultOptions = self::getDefaultOptions();
+
                $userId = $this->getId();
                $insert_rows = array();
-               foreach ( $saveOptions as $key => $value ) {
-                       // Don't bother storing default values
-                       $defaultOption = self::getDefaultOption( $key );
-                       if ( ( is_null( $defaultOption ) &&
-                                       !( $value === false || is_null( $value ) ) ) ||
-                                       $value != $defaultOption ) {
-                               $insert_rows[] = array(
-                                               'up_user' => $userId,
-                                               'up_property' => $key,
-                                               'up_value' => $value,
-                                       );
+               $changedOptions = array_diff_assoc( $saveOptions, $defaultOptions );
+               foreach ( $changedOptions as $key => $value ) {
+                       if ( $value === false || is_null( $value ) ) {
+                               continue;
                        }
+                       $insert_rows[] = array(
+                               'up_user' => $userId,
+                               'up_property' => $key,
+                               'up_value' => $value,
+                       );
                }
 
                $dbw = wfGetDB( DB_MASTER );
index d2fb468..fe97843 100644 (file)
@@ -113,6 +113,12 @@ class WatchedItem {
                        return;
                }
 
+               // some pages cannot be watched
+               if ( !$this->getTitle()->isWatchable() ) {
+                       $this->watched = false;
+                       return;
+               }
+
                # Pages and their talk pages are considered equivalent for watching;
                # remember that talk namespaces are numbered as page namespace+1.
 
index 2a7c032..b42564c 100644 (file)
@@ -795,11 +795,12 @@ class WebRequest {
         * defaults if not given. The limit must be positive and is capped at 5000.
         * Offset must be positive but is not capped.
         *
-        * @param $deflimit Integer: limit to use if no input and the user hasn't set the option.
+        * @param int $deflimit limit to use if no input and the user hasn't set the option.
         * @param string $optionname to specify an option other than rclimit to pull from.
+        * @param int $hardlimit the maximum upper limit to allow, usually 5000
         * @return array first element is limit, second is offset
         */
-       public function getLimitOffset( $deflimit = 50, $optionname = 'rclimit' ) {
+       public function getLimitOffset( $deflimit = 50, $optionname = 'rclimit', $hardlimit = 5000 ) {
                global $wgUser;
 
                $limit = $this->getInt( 'limit', 0 );
@@ -812,8 +813,8 @@ class WebRequest {
                if ( $limit <= 0 ) {
                        $limit = $deflimit;
                }
-               if ( $limit > 5000 ) {
-                       $limit = 5000; # We have *some* limits...
+               if ( $limit > $hardlimit ) {
+                       $limit = $hardlimit; # We have *some* limits...
                }
 
                $offset = $this->getInt( 'offset', 0 );
@@ -835,19 +836,6 @@ class WebRequest {
                return $file->getTempName();
        }
 
-       /**
-        * Return the size of the upload, or 0.
-        *
-        * @deprecated since 1.17
-        * @param $key String:
-        * @return integer
-        */
-       public function getFileSize( $key ) {
-               wfDeprecated( __METHOD__, '1.17' );
-               $file = new WebRequestUpload( $this, $key );
-               return $file->getSize();
-       }
-
        /**
         * Return the upload error or 0
         *
@@ -1035,35 +1023,6 @@ HTML;
                return true;
        }
 
-       /**
-        * Returns true if the PATH_INFO ends with an extension other than a script
-        * extension. This could confuse IE for scripts that send arbitrary data which
-        * is not HTML but may be detected as such.
-        *
-        * Various past attempts to use the URL to make this check have generally
-        * run up against the fact that CGI does not provide a standard method to
-        * determine the URL. PATH_INFO may be mangled (e.g. if cgi.fix_pathinfo=0),
-        * but only by prefixing it with the script name and maybe some other stuff,
-        * the extension is not mangled. So this should be a reasonably portable
-        * way to perform this security check.
-        *
-        * Also checks for anything that looks like a file extension at the end of
-        * QUERY_STRING, since IE 6 and earlier will use this to get the file type
-        * if there was no dot before the question mark (bug 28235).
-        *
-        * @deprecated Use checkUrlExtension().
-        *
-        * @param $extWhitelist array
-        *
-        * @return bool
-        */
-       public function isPathInfoBad( $extWhitelist = array() ) {
-               wfDeprecated( __METHOD__, '1.17' );
-               global $wgScriptExtension;
-               $extWhitelist[] = ltrim( $wgScriptExtension, '.' );
-               return IEUrlExtension::areServerVarsBad( $_SERVER, $extWhitelist );
-       }
-
        /**
         * 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
@@ -1462,14 +1421,6 @@ class FauxRequest extends WebRequest {
                return $this->session;
        }
 
-       /**
-        * @param array $extWhitelist
-        * @return bool
-        */
-       public function isPathInfoBad( $extWhitelist = array() ) {
-               return false;
-       }
-
        /**
         * FauxRequests shouldn't depend on raw request data (but that could be implemented here)
         * @return String
index 5fab9dc..9a6e6b9 100644 (file)
@@ -154,19 +154,6 @@ class MediaWiki {
                return $action;
        }
 
-       /**
-        * Create an Article object of the appropriate class for the given page.
-        *
-        * @deprecated in 1.18; use Article::newFromTitle() instead
-        * @param $title Title
-        * @param $context IContextSource
-        * @return Article object
-        */
-       public static function articleFromTitle( $title, IContextSource $context ) {
-               wfDeprecated( __METHOD__, '1.18' );
-               return Article::newFromTitle( $title, $context );
-       }
-
        /**
         * Performs the request.
         * - bad titles
diff --git a/includes/WikiError.php b/includes/WikiError.php
deleted file mode 100644 (file)
index 08eb800..0000000
+++ /dev/null
@@ -1,154 +0,0 @@
-<?php
-/**
- * MediaWiki error classes
- *
- * Copyright © 2005 Brion Vibber <brion@pobox.com>
- * http://www.mediawiki.org/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- */
-
-/**
- * Since PHP4 doesn't have exceptions, here's some error objects
- * loosely modeled on the standard PEAR_Error model...
- * @ingroup Exception
- */
-class WikiError {
-       /**
-        * @param $message string
-        *
-        * @deprecated since 1.17
-        */
-       function __construct( $message ) {
-               wfDeprecated( __METHOD__, '1.17' );
-               $this->mMessage = $message;
-       }
-
-       /**
-        * @return string Plaintext error message to display
-        */
-       function getMessage() {
-               return $this->mMessage;
-       }
-
-       /**
-        * In following PEAR_Error model this could be formatted differently,
-        * but so far it's not.
-        * @return string
-        */
-       function toString() {
-               return $this->getMessage();
-       }
-
-       /**
-        * Returns true if the given object is a WikiError-descended
-        * error object, false otherwise.
-        *
-        * @param $object mixed
-        * @return bool
-        *
-        * @deprecated since 1.17
-        */
-       public static function isError( $object ) {
-               wfDeprecated( __METHOD__, '1.17' );
-               if ( $object instanceof WikiError ) {
-                       return true;
-               } elseif ( $object instanceof Status ) {
-                       return !$object->isOK();
-               } else {
-                       return false;
-               }
-       }
-}
-
-/**
- * Localized error message object
- * @ingroup Exception
- */
-class WikiErrorMsg extends WikiError {
-       /**
-        * @param string $message wiki message name
-        * @param ... parameters to pass to wfMsg()
-        *
-        * @deprecated since 1.17
-        */
-       function __construct( $message/*, ... */ ) {
-               wfDeprecated( __METHOD__, '1.17' );
-               $args = func_get_args();
-               array_shift( $args );
-               $this->mMessage = wfMessage( $message )->rawParams( $args )->text();
-               $this->mMsgKey = $message;
-               $this->mMsgArgs = $args;
-       }
-
-       function getMessageKey() {
-               return $this->mMsgKey;
-       }
-
-       function getMessageArgs() {
-               return $this->mMsgArgs;
-       }
-}
-
-/**
- * Error class designed to handle errors involved with
- * XML parsing
- * @ingroup Exception
- */
-class WikiXmlError extends WikiError {
-       /**
-        * @param $parser resource
-        * @param $message string
-        * @param $context
-        * @param $offset Int
-        *
-        * @deprecated since 1.17
-        */
-       function __construct( $parser, $message = 'XML parsing error', $context = null, $offset = 0 ) {
-               wfDeprecated( __METHOD__, '1.17' );
-               $this->mXmlError = xml_get_error_code( $parser );
-               $this->mColumn = xml_get_current_column_number( $parser );
-               $this->mLine = xml_get_current_line_number( $parser );
-               $this->mByte = xml_get_current_byte_index( $parser );
-               $this->mContext = $this->_extractContext( $context, $offset );
-               $this->mMessage = $message;
-               xml_parser_free( $parser );
-               wfDebug( "WikiXmlError: " . $this->getMessage() . "\n" );
-       }
-
-       /** @return string */
-       function getMessage() {
-               // '$1 at line $2, col $3 (byte $4): $5',
-               return wfMessage( 'xml-error-string',
-                       $this->mMessage,
-                       $this->mLine,
-                       $this->mColumn,
-                       $this->mByte . $this->mContext,
-                       xml_error_string( $this->mXmlError ) )->escaped();
-       }
-
-       function _extractContext( $context, $offset ) {
-               if ( is_null( $context ) ) {
-                       return null;
-               } else {
-                       // Hopefully integer overflow will be handled transparently here
-                       $inlineOffset = $this->mByte - $offset;
-                       return '; "' . substr( $context, $inlineOffset, 16 ) . '"';
-               }
-       }
-}
index 8c035aa..5fc5a38 100644 (file)
@@ -3334,22 +3334,6 @@ class WikiPage implements Page, IDBAccessObject {
                return $this->mTitle->getTemplateLinksFrom();
        }
 
-       /**
-        * Perform article updates on a special page creation.
-        *
-        * @param $rev Revision object
-        *
-        * @todo This is a shitty interface function. Kill it and replace the
-        * other shitty functions like doEditUpdates and such so it's not needed
-        * anymore.
-        * @deprecated since 1.18, use doEditUpdates()
-        */
-       public function createUpdates( $rev ) {
-               wfDeprecated( __METHOD__, '1.18' );
-               global $wgUser;
-               $this->doEditUpdates( $rev, $wgUser, array( 'created' => true ) );
-       }
-
        /**
         * This function is called right before saving the wikitext,
         * so we can do things like signatures and links-in-context.
diff --git a/includes/ZhClient.php b/includes/ZhClient.php
deleted file mode 100644 (file)
index c5955ae..0000000
+++ /dev/null
@@ -1,164 +0,0 @@
-<?php
-/**
- * Client for querying zhdaemon.
- *
- * 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
- */
-
-/**
- * Client for querying zhdaemon
- */
-class ZhClient {
-       var $mHost, $mPort, $mFP, $mConnected;
-
-       /**
-        * Constructor
-        *
-        * @param $host
-        * @param $port
-        *
-        * @return ZhClient
-        */
-       function __construct( $host, $port ) {
-               $this->mHost = $host;
-               $this->mPort = $port;
-               $this->mConnected = $this->connect();
-       }
-
-       /**
-        * Check if connection to zhdaemon is successful
-        *
-        * @return bool
-        */
-       function isconnected() {
-               return $this->mConnected;
-       }
-
-       /**
-        * Establish connection
-        *
-        * @access private
-        *
-        * @return bool
-        */
-       function connect() {
-               wfSuppressWarnings();
-               $errno = $errstr = '';
-               $this->mFP = fsockopen( $this->mHost, $this->mPort, $errno, $errstr, 30 );
-               wfRestoreWarnings();
-               return !$this->mFP;
-       }
-
-       /**
-        * Query the daemon and return the result
-        *
-        * @access private
-        *
-        * @return string
-        */
-       function query( $request ) {
-               if ( !$this->mConnected ) {
-                       return false;
-               }
-
-               fwrite( $this->mFP, $request );
-
-               $result = fgets( $this->mFP, 1024 );
-
-               list( $status, $len ) = explode( ' ', $result );
-               if ( $status == 'ERROR' ) {
-                       // $len is actually the error code...
-                       print "zhdaemon error $len<br />\n";
-                       return false;
-               }
-               $bytesread = 0;
-               $data = '';
-               while ( !feof( $this->mFP ) && $bytesread < $len ) {
-                       $str = fread( $this->mFP, $len - $bytesread );
-                       $bytesread += strlen( $str );
-                       $data .= $str;
-               }
-               // data should be of length $len. otherwise something is wrong
-               return strlen( $data ) == $len;
-       }
-
-       /**
-        * Convert the input to a different language variant
-        *
-        * @param string $text input text
-        * @param string $tolang language variant
-        * @return string the converted text
-        */
-       function convert( $text, $tolang ) {
-               $len = strlen( $text );
-               $q = "CONV $tolang $len\n$text";
-               $result = $this->query( $q );
-               if ( !$result ) {
-                       $result = $text;
-               }
-               return $result;
-       }
-
-       /**
-        * Convert the input to all possible variants
-        *
-        * @param string $text input text
-        * @return array langcode => converted_string
-        */
-       function convertToAllVariants( $text ) {
-               $len = strlen( $text );
-               $q = "CONV ALL $len\n$text";
-               $result = $this->query( $q );
-               if ( !$result ) {
-                       return false;
-               }
-               list( $infoline, $data ) = explode( '|', $result, 2 );
-               $info = explode( ';', $infoline );
-               $ret = array();
-               $i = 0;
-               foreach ( $info as $variant ) {
-                       list( $code, $len ) = explode( ' ', $variant );
-                       $ret[strtolower( $code )] = substr( $data, $i, $len );
-                       $i += $len;
-               }
-               return $ret;
-       }
-
-       /**
-        * Perform word segmentation
-        *
-        * @param string $text input text
-        * @return string segmented text
-        */
-       function segment( $text ) {
-               $len = strlen( $text );
-               $q = "SEG $len\n$text";
-               $result = $this->query( $q );
-               if ( !$result ) { // fallback to character based segmentation
-                       $result = $this->segment( $text );
-               }
-               return $result;
-       }
-
-       /**
-        * Close the connection
-        */
-       function close() {
-               fclose( $this->mFP );
-       }
-}
index 811e35d..a424b9d 100644 (file)
@@ -193,7 +193,7 @@ class InfoAction extends FormlessAction {
         * @return array
         */
        protected function pageInfo() {
-               global $wgContLang, $wgRCMaxAge, $wgMemc,
+               global $wgContLang, $wgRCMaxAge, $wgMemc, $wgMiserMode,
                        $wgUnwatchedPageThreshold, $wgPageInfoTransclusionLimit;
 
                $user = $this->getUser();
@@ -540,7 +540,11 @@ class InfoAction extends FormlessAction {
                ) {
                        $options = array( 'LIMIT' => $wgPageInfoTransclusionLimit );
                        $transcludedTemplates = $title->getTemplateLinksFrom( $options );
-                       $transcludedTargets = $title->getTemplateLinksTo( $options );
+                       if ( $wgMiserMode ) {
+                               $transcludedTargets = array();
+                       } else {
+                               $transcludedTargets = $title->getTemplateLinksTo( $options );
+                       }
 
                        // Page properties
                        $pageInfo['header-properties'] = array();
@@ -581,7 +585,7 @@ class InfoAction extends FormlessAction {
                                );
                        }
 
-                       if ( $pageCounts['transclusion']['to'] > 0 ) {
+                       if ( !$wgMiserMode && $pageCounts['transclusion']['to'] > 0 ) {
                                if ( $pageCounts['transclusion']['to'] > count( $transcludedTargets ) ) {
                                        $more = Linker::link(
                                                $whatLinksHere,
index b6a7ca8..c1a4cd3 100644 (file)
@@ -801,6 +801,38 @@ abstract class ApiBase extends ContextSource {
                );
        }
 
+       /**
+        * Die if none of a certain set of parameters is set and not false.
+        * @param array $params of parameter names
+        */
+       public function requireAtLeastOneParameter( $params ) {
+               $required = func_get_args();
+               array_shift( $required );
+               $p = $this->getModulePrefix();
+
+               $intersection = array_intersect( array_keys( array_filter( $params,
+                       array( $this, "parameterNotEmpty" ) ) ), $required );
+
+               if ( count( $intersection ) == 0 ) {
+                       $this->dieUsage( "At least one of the parameters {$p}" . implode( ", {$p}", $required ) . ' is required', "{$p}missingparam" );
+               }
+       }
+
+       /**
+        * Generates the possible errors requireAtLeastOneParameter() can die with
+        *
+        * @param $params array
+        * @return array
+        */
+       public function getRequireAtLeastOneParameterErrorMessages( $params ) {
+               $p = $this->getModulePrefix();
+               $params = implode( ", {$p}", $params );
+
+               return array(
+                       array( 'code' => "{$p}missingparam", 'info' => "At least one of the parameters {$p}{$params} is required" ),
+               );
+       }
+
        /**
         * @param $params array
         * @param bool|string $load Whether load the object's state from the database:
@@ -861,17 +893,6 @@ abstract class ApiBase extends ContextSource {
                return !is_null( $x ) && $x !== false;
        }
 
-       /**
-        * @deprecated since 1.17 use MWNamespace::getValidNamespaces()
-        *
-        * @return array
-        */
-       public static function getValidNamespaces() {
-               wfDeprecated( __METHOD__, '1.17' );
-
-               return MWNamespace::getValidNamespaces();
-       }
-
        /**
         * Return true if we're to watch the page, false if not, null if no change.
         * @param string $watchlist Valid values: 'watch', 'unwatch', 'preferences', 'nochange'
index 439f46b..7727b28 100644 (file)
@@ -83,6 +83,7 @@ class ApiCreateAccount extends ApiBase {
 
                $loginForm = new LoginForm();
                $loginForm->setContext( $context );
+               wfRunHooks( 'AddNewAccountApiForm', array( $this, $loginForm ) );
                $loginForm->load();
 
                $status = $loginForm->addNewaccountInternal();
@@ -159,6 +160,9 @@ class ApiCreateAccount extends ApiBase {
                        $result['result'] = 'success';
                }
 
+               // Give extensions a chance to modify the API result data
+               wfRunHooks( 'AddNewAccountApiResult', array( $this, $loginForm, &$result ) );
+
                $apiResult->addValue( null, 'createaccount', $result );
        }
 
index f69d3ff..ea61932 100644 (file)
@@ -292,16 +292,6 @@ class ApiMain extends ApiBase {
                $this->mCacheMode = $mode;
        }
 
-       /**
-        * @deprecated since 1.17 Private caching is now the default, so there is usually no
-        * need to call this function. If there is a need, you can use
-        * $this->setCacheMode('private')
-        */
-       public function setCachePrivate() {
-               wfDeprecated( __METHOD__, '1.17' );
-               $this->setCacheMode( 'private' );
-       }
-
        /**
         * Set directives (key/value pairs) for the Cache-Control header.
         * Boolean values will be formatted as such, by including or omitting
@@ -316,21 +306,6 @@ class ApiMain extends ApiBase {
                $this->mCacheControl = $directives + $this->mCacheControl;
        }
 
-       /**
-        * Make sure Vary: Cookie and friends are set. Use this when the output of a request
-        * may be cached for anons but may not be cached for logged-in users.
-        *
-        * WARNING: This function must be called CONSISTENTLY for a given URL. This means that a
-        * given URL must either always or never call this function; if it sometimes does and
-        * sometimes doesn't, stuff will break.
-        *
-        * @deprecated since 1.17 Use setCacheMode( 'anon-public-user-private' )
-        */
-       public function setVaryCookie() {
-               wfDeprecated( __METHOD__, '1.17' );
-               $this->setCacheMode( 'anon-public-user-private' );
-       }
-
        /**
         * Create an instance of an output formatter by its name
         *
index 0d733a2..4095fe6 100644 (file)
@@ -387,7 +387,7 @@ class ApiPageSet extends ApiBase {
                                'from' => strval( $titleStrFrom ),
                                'to' => $titleTo->getPrefixedText(),
                        );
-                       if ( $titleTo->getFragment() !== '' ) {
+                       if ( $titleTo->hasFragment() ) {
                                $r['tofragment'] = $titleTo->getFragment();
                        }
                        $values[] = $r;
index a323aad..464fde6 100644 (file)
@@ -176,11 +176,14 @@ class ApiParse extends ApiBase {
                        if ( !$titleObj || $titleObj->isExternal() ) {
                                $this->dieUsageMsg( array( 'invalidtitle', $title ) );
                        }
-                       if ( !$titleObj->canExist() ) {
-                               $this->dieUsage( "Namespace doesn't allow actual pages", 'pagecannotexist' );
-                       }
                        $wgTitle = $titleObj;
-                       $pageObj = WikiPage::factory( $titleObj );
+                       if ( $titleObj->canExist() ) {
+                               $pageObj = WikiPage::factory( $titleObj );
+                       } else {
+                               // Do like MediaWiki::initializeArticle()
+                               $article = Article::newFromTitle( $titleObj, $this->getContext() );
+                               $pageObj = $article->getPage();
+                       }
 
                        $popts = $this->makeParserOptions( $pageObj, $params );
 
@@ -805,7 +808,6 @@ class ApiParse extends ApiBase {
                                'code' => 'notwikitext',
                                'info' => 'The requested operation is only supported on wikitext content.'
                        ),
-                       array( 'code' => 'pagecannotexist', 'info' => "Namespace doesn't allow actual pages" ),
                ) );
        }
 
index 32a03f1..eb51095 100644 (file)
@@ -608,6 +608,15 @@ abstract class ApiQueryBase extends ApiBase {
 
                return $errors;
        }
+
+       /**
+        * Check whether the current user has permission to view revision-deleted
+        * fields.
+        * @return bool
+        */
+       public function userCanSeeRevDel() {
+               return $this->getUser()->isAllowedAny( 'deletedhistory', 'deletedtext', 'suppressrevision' );
+       }
 }
 
 /**
index 4e4b2cc..7585ba7 100644 (file)
@@ -66,6 +66,11 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
                        $fld_token = false;
                }
 
+               // If user can't undelete, no tokens
+               if ( !$user->isAllowed( 'undelete' ) ) {
+                       $fld_token = false;
+               }
+
                $result = $this->getResult();
                $pageSet = $this->getPageSet();
                $titles = $pageSet->getTitles();
@@ -101,8 +106,7 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
                }
 
                $this->addTables( 'archive' );
-               $this->addWhere( 'ar_deleted = 0' );
-               $this->addFields( array( 'ar_title', 'ar_namespace', 'ar_timestamp' ) );
+               $this->addFields( array( 'ar_title', 'ar_namespace', 'ar_timestamp', 'ar_deleted' ) );
 
                $this->addFieldsIf( 'ar_parent_id', $fld_parentid );
                $this->addFieldsIf( 'ar_rev_id', $fld_revid );
@@ -131,11 +135,13 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
 
                if ( $fld_content ) {
                        $this->addTables( 'text' );
+                       $this->addJoinConds(
+                               array( 'text' => array( 'INNER JOIN', array( 'ar_text_id=old_id' ) ) )
+                       );
                        $this->addFields( array( 'ar_text', 'ar_text_id', 'old_text', 'old_flags' ) );
-                       $this->addWhere( 'ar_text_id = old_id' );
 
                        // This also means stricter restrictions
-                       if ( !$user->isAllowed( 'undelete' ) ) {
+                       if ( !$user->isAllowedAny( 'undelete', 'deletedtext' ) ) {
                                $this->dieUsage(
                                        'You don\'t have permission to view deleted revision content',
                                        'permissiondenied'
@@ -188,6 +194,22 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
                                $db->addQuotes( $params['excludeuser'] ) );
                }
 
+               if ( !is_null( $params['user'] ) || !is_null( $params['excludeuser'] ) ) {
+                       // Paranoia: avoid brute force searches (bug 17342)
+                       // (shouldn't be able to get here without 'deletedhistory', but
+                       // check it again just in case)
+                       if ( !$user->isAllowed( 'deletedhistory' ) ) {
+                               $bitmask = Revision::DELETED_USER;
+                       } elseif ( !$user->isAllowed( 'suppressrevision' ) ) {
+                               $bitmask = Revision::DELETED_USER | Revision::DELETED_RESTRICTED;
+                       } else {
+                               $bitmask = 0;
+                       }
+                       if ( $bitmask ) {
+                               $this->addWhere( $db->bitAnd( 'ar_deleted', $bitmask ) . " != $bitmask" );
+                       }
+               }
+
                if ( !is_null( $params['continue'] ) && ( $mode == 'all' || $mode == 'revs' ) ) {
                        $cont = explode( '|', $params['continue'] );
                        $this->dieContinueUsageIf( count( $cont ) != 3 );
@@ -243,6 +265,8 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
                        }
 
                        $rev = array();
+                       $anyHidden = false;
+
                        $rev['timestamp'] = wfTimestamp( TS_ISO_8601, $row->ar_timestamp );
                        if ( $fld_revid ) {
                                $rev['revid'] = intval( $row->ar_rev_id );
@@ -250,21 +274,37 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
                        if ( $fld_parentid && !is_null( $row->ar_parent_id ) ) {
                                $rev['parentid'] = intval( $row->ar_parent_id );
                        }
-                       if ( $fld_user ) {
-                               $rev['user'] = $row->ar_user_text;
-                       }
-                       if ( $fld_userid ) {
-                               $rev['userid'] = $row->ar_user;
-                       }
-                       if ( $fld_comment ) {
-                               $rev['comment'] = $row->ar_comment;
+                       if ( $fld_user || $fld_userid ) {
+                               if ( $row->ar_deleted & Revision::DELETED_USER ) {
+                                       $rev['userhidden'] = '';
+                                       $anyHidden = true;
+                               }
+                               if ( Revision::userCanBitfield( $row->ar_deleted, Revision::DELETED_USER, $user ) ) {
+                                       if ( $fld_user ) {
+                                               $rev['user'] = $row->ar_user_text;
+                                       }
+                                       if ( $fld_userid ) {
+                                               $rev['userid'] = $row->ar_user;
+                                       }
+                               }
                        }
 
-                       $title = Title::makeTitle( $row->ar_namespace, $row->ar_title );
-
-                       if ( $fld_parsedcomment ) {
-                               $rev['parsedcomment'] = Linker::formatComment( $row->ar_comment, $title );
+                       if ( $fld_comment || $fld_parsedcomment ) {
+                               if ( $row->ar_deleted & Revision::DELETED_COMMENT ) {
+                                       $rev['commenthidden'] = '';
+                                       $anyHidden = true;
+                               }
+                               if ( Revision::userCanBitfield( $row->ar_deleted, Revision::DELETED_COMMENT, $user ) ) {
+                                       if ( $fld_comment ) {
+                                               $rev['comment'] = $row->ar_comment;
+                                       }
+                                       if ( $fld_parsedcomment ) {
+                                               $title = Title::makeTitle( $row->ar_namespace, $row->ar_title );
+                                               $rev['parsedcomment'] = Linker::formatComment( $row->ar_comment, $title );
+                                       }
+                               }
                        }
+
                        if ( $fld_minor && $row->ar_minor_edit == 1 ) {
                                $rev['minor'] = '';
                        }
@@ -272,14 +312,26 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
                                $rev['len'] = $row->ar_len;
                        }
                        if ( $fld_sha1 ) {
-                               if ( $row->ar_sha1 != '' ) {
-                                       $rev['sha1'] = wfBaseConvert( $row->ar_sha1, 36, 16, 40 );
-                               } else {
-                                       $rev['sha1'] = '';
+                               if ( $row->ar_deleted & Revision::DELETED_TEXT ) {
+                                       $rev['sha1hidden'] = '';
+                                       $anyHidden = true;
+                               }
+                               if ( Revision::userCanBitfield( $row->ar_deleted, Revision::DELETED_TEXT, $user ) ) {
+                                       if ( $row->ar_sha1 != '' ) {
+                                               $rev['sha1'] = wfBaseConvert( $row->ar_sha1, 36, 16, 40 );
+                                       } else {
+                                               $rev['sha1'] = '';
+                                       }
                                }
                        }
                        if ( $fld_content ) {
-                               ApiResult::setContent( $rev, Revision::getRevisionText( $row ) );
+                               if ( $row->ar_deleted & Revision::DELETED_TEXT ) {
+                                       $rev['texthidden'] = '';
+                                       $anyHidden = true;
+                               }
+                               if ( Revision::userCanBitfield( $row->ar_deleted, Revision::DELETED_TEXT, $user ) ) {
+                                       ApiResult::setContent( $rev, Revision::getRevisionText( $row ) );
+                               }
                        }
 
                        if ( $fld_tags ) {
@@ -292,11 +344,16 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
                                }
                        }
 
+                       if ( $anyHidden && ( $row->ar_deleted & Revision::DELETED_RESTRICTED ) ) {
+                               $rev['suppressed'] = '';
+                       }
+
                        if ( !isset( $pageMap[$row->ar_namespace][$row->ar_title] ) ) {
                                $pageID = $newPageID++;
                                $pageMap[$row->ar_namespace][$row->ar_title] = $pageID;
                                $a['revisions'] = array( $rev );
                                $result->setIndexedTagName( $a['revisions'], 'rev' );
+                               $title = Title::makeTitle( $row->ar_namespace, $row->ar_title );
                                ApiQueryBase::addTitleInfo( $a, $title );
                                if ( $fld_token ) {
                                        $a['token'] = $token;
index e2c9964..bcbc642 100644 (file)
@@ -66,6 +66,7 @@ class ApiQueryFilearchive extends ApiQueryBase {
 
                $this->addTables( 'filearchive' );
 
+               $this->addFields( ArchivedFile::selectFields() );
                $this->addFields( array( 'fa_name', 'fa_deleted' ) );
                $this->addFieldsIf( 'fa_sha1', $fld_sha1 );
                $this->addFieldsIf( 'fa_timestamp', $fld_timestamp );
@@ -121,14 +122,16 @@ class ApiQueryFilearchive extends ApiQueryBase {
                        }
                }
 
-               if ( !$user->isAllowed( 'suppressrevision' ) ) {
-                       // Filter out revisions that the user is not allowed to see. There
-                       // is no way to indicate that we have skipped stuff because the
-                       // continuation parameter is fa_name
-
-                       // Note that this field is unindexed. This should however not be
-                       // a big problem as files with fa_deleted are rare
-                       $this->addWhereFld( 'fa_deleted', 0 );
+               // Exclude files this user can't view.
+               if ( !$user->isAllowed( 'deletedtext' ) ) {
+                       $bitmask = File::DELETED_FILE;
+               } elseif ( !$user->isAllowed( 'suppressrevision' ) ) {
+                       $bitmask = File::DELETED_FILE | File::DELETED_RESTRICTED;
+               } else {
+                       $bitmask = 0;
+               }
+               if ( $bitmask ) {
+                       $this->addWhere( $this->getDB()->bitAnd( 'fa_deleted', $bitmask ) . " != $bitmask" );
                }
 
                $limit = $params['limit'];
@@ -153,16 +156,27 @@ class ApiQueryFilearchive extends ApiQueryBase {
                        $title = Title::makeTitle( NS_FILE, $row->fa_name );
                        self::addTitleInfo( $file, $title );
 
+                       if ( $fld_description &&
+                               Revision::userCanBitfield( $row->fa_deleted, File::DELETED_COMMENT, $user )
+                       ) {
+                               $file['description'] = $row->fa_description;
+                               if ( isset( $prop['parseddescription'] ) ) {
+                                       $file['parseddescription'] = Linker::formatComment(
+                                               $row->fa_description, $title );
+                               }
+                       }
+                       if ( $fld_user &&
+                               Revision::userCanBitfield( $row->fa_deleted, File::DELETED_USER, $user )
+                       ) {
+                               $file['userid'] = $row->fa_user;
+                               $file['user'] = $row->fa_user_text;
+                       }
                        if ( $fld_sha1 ) {
                                $file['sha1'] = wfBaseConvert( $row->fa_sha1, 36, 16, 40 );
                        }
                        if ( $fld_timestamp ) {
                                $file['timestamp'] = wfTimestamp( TS_ISO_8601, $row->fa_timestamp );
                        }
-                       if ( $fld_user ) {
-                               $file['userid'] = $row->fa_user;
-                               $file['user'] = $row->fa_user_text;
-                       }
                        if ( $fld_size || $fld_dimensions ) {
                                $file['size'] = $row->fa_size;
 
@@ -174,13 +188,6 @@ class ApiQueryFilearchive extends ApiQueryBase {
                                $file['height'] = $row->fa_height;
                                $file['width'] = $row->fa_width;
                        }
-                       if ( $fld_description ) {
-                               $file['description'] = $row->fa_description;
-                               if ( isset( $prop['parseddescription'] ) ) {
-                                       $file['parseddescription'] = Linker::formatComment(
-                                               $row->fa_description, $title );
-                               }
-                       }
                        if ( $fld_mediatype ) {
                                $file['mediatype'] = $row->fa_media_type;
                        }
index bf11a76..baee9b1 100644 (file)
@@ -50,11 +50,12 @@ class ApiQueryImageInfo extends ApiQueryBase {
 
                $scale = $this->getScale( $params );
 
-               $metadataOpts = array(
+               $opts = array(
                        'version' => $params['metadataversion'],
                        'language' => $params['extmetadatalanguage'],
                        'multilang' => $params['extmetadatamultilang'],
                        'extmetadatafilter' => $params['extmetadatafilter'],
+                       'revdelUser' => $this->getUser(),
                );
 
                $pageIds = $this->getPageSet()->getAllTitlesByNamespace();
@@ -78,13 +79,21 @@ class ApiQueryImageInfo extends ApiQueryBase {
                                }
                        }
 
-                       $result = $this->getResult();
-                       //search only inside the local repo
+                       $user = $this->getUser();
+                       $findTitles = array_map( function ( $title ) use ( $user ) {
+                               return array(
+                                       'title' => $title,
+                                       'private' => $user,
+                               );
+                       }, $titles );
+
                        if ( $params['localonly'] ) {
-                               $images = RepoGroup::singleton()->getLocalRepo()->findFiles( $titles );
+                               $images = RepoGroup::singleton()->getLocalRepo()->findFiles( $findTitles );
                        } else {
-                               $images = RepoGroup::singleton()->findFiles( $titles );
+                               $images = RepoGroup::singleton()->findFiles( $findTitles );
                        }
+
+                       $result = $this->getResult();
                        foreach ( $titles as $title ) {
                                $pageId = $pageIds[NS_FILE][$title];
                                $start = $title === $fromTitle ? $fromTimestamp : $params['start'];
@@ -154,7 +163,7 @@ class ApiQueryImageInfo extends ApiQueryBase {
 
                                        $fit = $this->addPageSubItem( $pageId,
                                                self::getInfo( $img, $prop, $result,
-                                                       $finalThumbParams, $metadataOpts
+                                                       $finalThumbParams, $opts
                                                )
                                        );
                                        if ( !$fit ) {
@@ -189,7 +198,7 @@ class ApiQueryImageInfo extends ApiQueryBase {
                                        $fit = self::getTransformCount() < self::TRANSFORM_LIMIT &&
                                                $this->addPageSubItem( $pageId,
                                                        self::getInfo( $oldie, $prop, $result,
-                                                               $finalThumbParams, $metadataOpts
+                                                               $finalThumbParams, $opts
                                                        )
                                                );
                                        if ( !$fit ) {
@@ -310,25 +319,29 @@ class ApiQueryImageInfo extends ApiQueryBase {
         * @param array $prop of properties to get (in the keys)
         * @param $result ApiResult object
         * @param array $thumbParams containing 'width' and 'height' items, or null
-        * @param array|bool|string $metadataOpts Options for metadata fetching.
+        * @param array|bool|string $opts Options for data fetching.
         *   This is an array consisting of the keys:
         *    'version': The metadata version for the metadata option
         *    'language': The language for extmetadata property
         *    'multilang': Return all translations in extmetadata property
+        *    'revdelUser': User to use when checking whether to show revision-deleted fields.
         * @return Array: result array
         */
-       static function getInfo( $file, $prop, $result, $thumbParams = null, $metadataOpts = false ) {
+       static function getInfo( $file, $prop, $result, $thumbParams = null, $opts = false ) {
                global $wgContLang;
 
-               if ( !$metadataOpts || is_string( $metadataOpts ) ) {
-                       $metadataOpts = array(
-                               'version' => $metadataOpts ?: 'latest',
+               $anyHidden = false;
+
+               if ( !$opts || is_string( $opts ) ) {
+                       $opts = array(
+                               'version' => $opts ?: 'latest',
                                'language' => $wgContLang,
                                'multilang' => false,
                                'extmetadatafilter' => array(),
+                               'revdelUser' => null,
                        );
                }
-               $version = $metadataOpts['version'];
+               $version = $opts['version'];
                $vals = array();
                // Timestamp is shown even if the file is revdelete'd in interface
                // so do same here.
@@ -336,13 +349,27 @@ class ApiQueryImageInfo extends ApiQueryBase {
                        $vals['timestamp'] = wfTimestamp( TS_ISO_8601, $file->getTimestamp() );
                }
 
+               // Handle external callers who don't pass revdelUser
+               if ( isset( $opts['revdelUser'] ) && $opts['revdelUser'] ) {
+                       $revdelUser = $opts['revdelUser'];
+                       $canShowField = function ( $field ) use ( $file, $revdelUser ) {
+                               return $file->userCan( $field, $revdelUser );
+                       };
+               } else {
+                       $canShowField = function ( $field ) use ( $file ) {
+                               return !$file->isDeleted( $field );
+                       };
+               }
+
                $user = isset( $prop['user'] );
                $userid = isset( $prop['userid'] );
 
                if ( $user || $userid ) {
                        if ( $file->isDeleted( File::DELETED_USER ) ) {
                                $vals['userhidden'] = '';
-                       } else {
+                               $anyHidden = true;
+                       }
+                       if ( $canShowField( File::DELETED_USER ) ) {
                                if ( $user ) {
                                        $vals['user'] = $file->getUser();
                                }
@@ -374,13 +401,15 @@ class ApiQueryImageInfo extends ApiQueryBase {
                if ( $pcomment || $comment ) {
                        if ( $file->isDeleted( File::DELETED_COMMENT ) ) {
                                $vals['commenthidden'] = '';
-                       } else {
+                               $anyHidden = true;
+                       }
+                       if ( $canShowField( File::DELETED_COMMENT ) ) {
                                if ( $pcomment ) {
                                        $vals['parsedcomment'] = Linker::formatComment(
-                                               $file->getDescription(), $file->getTitle() );
+                                               $file->getDescription( File::RAW ), $file->getTitle() );
                                }
                                if ( $comment ) {
-                                       $vals['comment'] = $file->getDescription();
+                                       $vals['comment'] = $file->getDescription( File::RAW );
                                }
                        }
                }
@@ -390,17 +419,27 @@ class ApiQueryImageInfo extends ApiQueryBase {
                $sha1 = isset( $prop['sha1'] );
                $meta = isset( $prop['metadata'] );
                $extmetadata = isset( $prop['extmetadata'] );
+               $commonmeta = isset( $prop['commonmetadata'] );
                $mime = isset( $prop['mime'] );
                $mediatype = isset( $prop['mediatype'] );
                $archive = isset( $prop['archivename'] );
                $bitdepth = isset( $prop['bitdepth'] );
                $uploadwarning = isset( $prop['uploadwarning'] );
 
-               if ( ( $canonicaltitle || $url || $sha1 || $meta || $mime || $mediatype || $archive || $bitdepth )
-                       && $file->isDeleted( File::DELETED_FILE )
-               ) {
+               if ( $uploadwarning ) {
+                       $vals['html'] = SpecialUpload::getExistsWarning( UploadBase::getExistsWarning( $file ) );
+               }
+
+               if ( $file->isDeleted( File::DELETED_FILE ) ) {
                        $vals['filehidden'] = '';
+                       $anyHidden = true;
+               }
 
+               if ( $anyHidden && $file->isDeleted( File::DELETED_RESTRICTED ) ) {
+                       $vals['suppressed'] = true;
+               }
+
+               if ( !$canShowField( File::DELETED_FILE ) ) {
                        //Early return, tidier than indenting all following things one level
                        return $vals;
                }
@@ -452,18 +491,22 @@ class ApiQueryImageInfo extends ApiQueryBase {
                        }
                        $vals['metadata'] = $metadata ? self::processMetaData( $metadata, $result ) : null;
                }
+               if ( $commonmeta ) {
+                       $metaArray = $file->getCommonMetaArray();
+                       $vals['commonmetadata'] = $metaArray ? self::processMetaData( $metaArray, $result ) : array();
+               }
 
                if ( $extmetadata ) {
                        // Note, this should return an array where all the keys
                        // start with a letter, and all the values are strings.
                        // Thus there should be no issue with format=xml.
                        $format = new FormatMetadata;
-                       $format->setSingleLanguage( !$metadataOpts['multilang'] );
-                       $format->getContext()->setLanguage( $metadataOpts['language'] );
+                       $format->setSingleLanguage( !$opts['multilang'] );
+                       $format->getContext()->setLanguage( $opts['language'] );
                        $extmetaArray = $format->fetchExtendedMetadata( $file );
-                       if ( $metadataOpts['extmetadatafilter'] ) {
+                       if ( $opts['extmetadatafilter'] ) {
                                $extmetaArray = array_intersect_key(
-                                       $extmetaArray, array_flip( $metadataOpts['extmetadatafilter'] )
+                                       $extmetaArray, array_flip( $opts['extmetadatafilter'] )
                                );
                        }
                        $vals['extmetadata'] = $extmetaArray;
@@ -485,10 +528,6 @@ class ApiQueryImageInfo extends ApiQueryBase {
                        $vals['bitdepth'] = $file->getBitDepth();
                }
 
-               if ( $uploadwarning ) {
-                       $vals['html'] = SpecialUpload::getExistsWarning( UploadBase::getExistsWarning( $file ) );
-               }
-
                return $vals;
        }
 
@@ -528,6 +567,10 @@ class ApiQueryImageInfo extends ApiQueryBase {
        }
 
        public function getCacheMode( $params ) {
+               if ( $this->userCanSeeRevDel() ) {
+                       return 'private';
+               }
+
                return 'public';
        }
 
@@ -634,6 +677,7 @@ class ApiQueryImageInfo extends ApiQueryBase {
                                ' (requires url and param ' . $modulePrefix . 'urlwidth)',
                        'mediatype' =>      ' mediatype     - Adds the media type of the image',
                        'metadata' =>       ' metadata      - Lists Exif metadata for the version of the image',
+                       'commonmetadata' => ' commonmetadata - Lists file format generic metadata for the version of the image',
                        'extmetadata' =>    ' extmetadata   - Lists formatted metadata combined ' .
                                'from multiple sources. Results are HTML formatted.',
                        'archivename' =>    ' archivename   - Adds the file name of the archive ' .
index 356fa3e..1578775 100644 (file)
@@ -158,11 +158,23 @@ class ApiQueryLogEvents extends ApiQueryBase {
                }
 
                // Paranoia: avoid brute force searches (bug 17342)
-               if ( !is_null( $title ) ) {
-                       $this->addWhere( $db->bitAnd( 'log_deleted', LogPage::DELETED_ACTION ) . ' = 0' );
-               }
-               if ( !is_null( $user ) ) {
-                       $this->addWhere( $db->bitAnd( 'log_deleted', LogPage::DELETED_USER ) . ' = 0' );
+               if ( !is_null( $title ) || !is_null( $user ) ) {
+                       if ( !$this->getUser()->isAllowed( 'deletedhistory' ) ) {
+                               $titleBits = LogPage::DELETED_ACTION;
+                               $userBits = LogPage::DELETED_USER;
+                       } elseif ( !$this->getUser()->isAllowed( 'suppressrevision' ) ) {
+                               $titleBits = LogPage::DELETED_ACTION | LogPage::DELETED_RESTRICTED;
+                               $userBits = LogPage::DELETED_USER | LogPage::DELETED_RESTRICTED;
+                       } else {
+                               $titleBits = 0;
+                               $userBits = 0;
+                       }
+                       if ( !is_null( $title ) && $titleBits ) {
+                               $this->addWhere( $db->bitAnd( 'log_deleted', $titleBits ) . " != $titleBits" );
+                       }
+                       if ( !is_null( $user ) && $userBits ) {
+                               $this->addWhere( $db->bitAnd( 'log_deleted', $userBits ) . " != $userBits" );
+                       }
                }
 
                $count = 0;
@@ -296,21 +308,40 @@ class ApiQueryLogEvents extends ApiQueryBase {
        private function extractRowInfo( $row ) {
                $logEntry = DatabaseLogEntry::newFromRow( $row );
                $vals = array();
+               $anyHidden = false;
+               $user = $this->getUser();
 
                if ( $this->fld_ids ) {
                        $vals['logid'] = intval( $row->log_id );
-                       $vals['pageid'] = intval( $row->page_id );
                }
 
                if ( $this->fld_title || $this->fld_parsedcomment ) {
                        $title = Title::makeTitle( $row->log_namespace, $row->log_title );
                }
 
-               if ( $this->fld_title ) {
+               if ( $this->fld_title || $this->fld_ids || $this->fld_details && $row->log_params !== '' ) {
                        if ( LogEventsList::isDeleted( $row, LogPage::DELETED_ACTION ) ) {
                                $vals['actionhidden'] = '';
-                       } else {
-                               ApiQueryBase::addTitleInfo( $vals, $title );
+                               $anyHidden = true;
+                       }
+                       if ( LogEventsList::userCan( $row, LogPage::DELETED_ACTION, $user ) ) {
+                               if ( $this->fld_title ) {
+                                       ApiQueryBase::addTitleInfo( $vals, $title );
+                               }
+                               if ( $this->fld_ids ) {
+                                       $vals['pageid'] = intval( $row->page_id );
+                               }
+                               if ( $this->fld_details && $row->log_params !== '' ) {
+                                       self::addLogParams(
+                                               $this->getResult(),
+                                               $vals,
+                                               $logEntry->getParameters(),
+                                               $logEntry->getType(),
+                                               $logEntry->getSubtype(),
+                                               $logEntry->getTimestamp(),
+                                               $logEntry->isLegacy()
+                                       );
+                               }
                        }
                }
 
@@ -319,26 +350,12 @@ class ApiQueryLogEvents extends ApiQueryBase {
                        $vals['action'] = $row->log_action;
                }
 
-               if ( $this->fld_details && $row->log_params !== '' ) {
-                       if ( LogEventsList::isDeleted( $row, LogPage::DELETED_ACTION ) ) {
-                               $vals['actionhidden'] = '';
-                       } else {
-                               self::addLogParams(
-                                       $this->getResult(),
-                                       $vals,
-                                       $logEntry->getParameters(),
-                                       $logEntry->getType(),
-                                       $logEntry->getSubtype(),
-                                       $logEntry->getTimestamp(),
-                                       $logEntry->isLegacy()
-                               );
-                       }
-               }
-
                if ( $this->fld_user || $this->fld_userid ) {
                        if ( LogEventsList::isDeleted( $row, LogPage::DELETED_USER ) ) {
                                $vals['userhidden'] = '';
-                       } else {
+                               $anyHidden = true;
+                       }
+                       if ( LogEventsList::userCan( $row, LogPage::DELETED_USER, $user ) ) {
                                if ( $this->fld_user ) {
                                        $vals['user'] = $row->user_name === null ? $row->log_user_text : $row->user_name;
                                }
@@ -358,7 +375,9 @@ class ApiQueryLogEvents extends ApiQueryBase {
                if ( ( $this->fld_comment || $this->fld_parsedcomment ) && isset( $row->log_comment ) ) {
                        if ( LogEventsList::isDeleted( $row, LogPage::DELETED_COMMENT ) ) {
                                $vals['commenthidden'] = '';
-                       } else {
+                               $anyHidden = true;
+                       }
+                       if ( LogEventsList::userCan( $row, LogPage::DELETED_COMMENT, $user ) ) {
                                if ( $this->fld_comment ) {
                                        $vals['comment'] = $row->log_comment;
                                }
@@ -379,10 +398,17 @@ class ApiQueryLogEvents extends ApiQueryBase {
                        }
                }
 
+               if ( $anyHidden && LogEventsList::isDeleted( $row, LogPage::DELETED_RESTRICTED ) ) {
+                       $vals['suppressed'] = '';
+               }
+
                return $vals;
        }
 
        public function getCacheMode( $params ) {
+               if ( $this->userCanSeeRevDel() ) {
+                       return 'private';
+               }
                if ( !is_null( $params['prop'] ) && in_array( 'parsedcomment', $params['prop'] ) ) {
                        // formatComment() calls wfMessage() among other things
                        return 'anon-public-user-private';
index 02a05e8..6ccc288 100644 (file)
@@ -145,7 +145,6 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
                /* Build our basic query. Namely, something along the lines of:
                 * SELECT * FROM recentchanges WHERE rc_timestamp > $start
                 *              AND rc_timestamp < $end AND rc_namespace = $namespace
-                *              AND rc_deleted = 0
                 */
                $this->addTables( 'recentchanges' );
                $index = array( 'recentchanges' => 'rc_timestamp' ); // May change
@@ -176,7 +175,6 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
                ) );
 
                $this->addWhereFld( 'rc_namespace', $params['namespace'] );
-               $this->addWhereFld( 'rc_deleted', 0 );
 
                if ( !is_null( $params['type'] ) ) {
                        $this->addWhereFld( 'rc_type', $this->parseRCType( $params['type'] ) );
@@ -326,6 +324,36 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
                        $this->addWhereFld( 'ct_tag', $params['tag'] );
                }
 
+               // Paranoia: avoid brute force searches (bug 17342)
+               if ( !is_null( $params['user'] ) || !is_null( $params['excludeuser'] ) ) {
+                       if ( !$user->isAllowed( 'deletedhistory' ) ) {
+                               $bitmask = Revision::DELETED_USER;
+                       } elseif ( !$user->isAllowed( 'suppressrevision' ) ) {
+                               $bitmask = Revision::DELETED_USER | Revision::DELETED_RESTRICTED;
+                       } else {
+                               $bitmask = 0;
+                       }
+                       if ( $bitmask ) {
+                               $this->addWhere( $this->getDB()->bitAnd( 'rc_deleted', $bitmask ) . " != $bitmask" );
+                       }
+               }
+               if ( $this->getRequest()->getCheck( 'namespace' ) ) {
+                       // LogPage::DELETED_ACTION hides the affected page, too.
+                       if ( !$user->isAllowed( 'deletedhistory' ) ) {
+                               $bitmask = LogPage::DELETED_ACTION;
+                       } elseif ( !$user->isAllowed( 'suppressrevision' ) ) {
+                               $bitmask = LogPage::DELETED_ACTION | LogPage::DELETED_RESTRICTED;
+                       } else {
+                               $bitmask = 0;
+                       }
+                       if ( $bitmask ) {
+                               $this->addWhere( $this->getDB()->makeList( array(
+                                       'rc_type != ' . RC_LOG,
+                                       $this->getDB()->bitAnd( 'rc_deleted', $bitmask ) . " != $bitmask",
+                               ), LIST_OR ) );
+                       }
+               }
+
                $this->token = $params['token'];
                $this->addOption( 'LIMIT', $params['limit'] + 1 );
                $this->addOption( 'USE INDEX', $index );
@@ -389,6 +417,7 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
        public function extractRowInfo( $row ) {
                /* Determine the title of the page that has been changed. */
                $title = Title::makeTitle( $row->rc_namespace, $row->rc_title );
+               $user = $this->getUser();
 
                /* Our output data. */
                $vals = array();
@@ -419,32 +448,50 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
                                $vals['type'] = $type;
                }
 
+               $anyHidden = false;
+
                /* Create a new entry in the result for the title. */
-               if ( $this->fld_title ) {
-                       ApiQueryBase::addTitleInfo( $vals, $title );
+               if ( $this->fld_title || $this->fld_ids ) {
+                       if ( $type === RC_LOG && ( $row->rc_deleted & LogPage::DELETED_ACTION ) ) {
+                               $vals['actionhidden'] = '';
+                               $anyHidden = true;
+                       }
+                       if ( $type !== RC_LOG ||
+                               LogEventsList::userCanBitfield( $row->rc_deleted, LogPage::DELETED_ACTION, $user )
+                       ) {
+                               if ( $this->fld_title ) {
+                                       ApiQueryBase::addTitleInfo( $vals, $title );
+                               }
+                               if ( $this->fld_ids ) {
+                                       $vals['pageid'] = intval( $row->rc_cur_id );
+                                       $vals['revid'] = intval( $row->rc_this_oldid );
+                                       $vals['old_revid'] = intval( $row->rc_last_oldid );
+                               }
+                       }
                }
 
-               /* Add ids, such as rcid, pageid, revid, and oldid to the change's info. */
                if ( $this->fld_ids ) {
                        $vals['rcid'] = intval( $row->rc_id );
-                       $vals['pageid'] = intval( $row->rc_cur_id );
-                       $vals['revid'] = intval( $row->rc_this_oldid );
-                       $vals['old_revid'] = intval( $row->rc_last_oldid );
                }
 
-               /* Add user data and 'anon' flag, if use is anonymous. */
+               /* Add user data and 'anon' flag, if user is anonymous. */
                if ( $this->fld_user || $this->fld_userid ) {
-
-                       if ( $this->fld_user ) {
-                               $vals['user'] = $row->rc_user_text;
+                       if ( $row->rc_deleted & Revision::DELETED_USER ) {
+                               $vals['userhidden'] = '';
+                               $anyHidden = true;
                        }
+                       if ( Revision::userCanBitfield( $row->rc_deleted, Revision::DELETED_USER, $user ) ) {
+                               if ( $this->fld_user ) {
+                                       $vals['user'] = $row->rc_user_text;
+                               }
 
-                       if ( $this->fld_userid ) {
-                               $vals['userid'] = $row->rc_user;
-                       }
+                               if ( $this->fld_userid ) {
+                                       $vals['userid'] = $row->rc_user;
+                               }
 
-                       if ( !$row->rc_user ) {
-                               $vals['anon'] = '';
+                               if ( !$row->rc_user ) {
+                                       $vals['anon'] = '';
+                               }
                        }
                }
 
@@ -473,12 +520,20 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
                }
 
                /* Add edit summary / log summary. */
-               if ( $this->fld_comment && isset( $row->rc_comment ) ) {
-                       $vals['comment'] = $row->rc_comment;
-               }
+               if ( $this->fld_comment || $this->fld_parsedcomment ) {
+                       if ( $row->rc_deleted & Revision::DELETED_COMMENT ) {
+                               $vals['commenthidden'] = '';
+                               $anyHidden = true;
+                       }
+                       if ( Revision::userCanBitfield( $row->rc_deleted, Revision::DELETED_COMMENT, $user ) ) {
+                               if ( $this->fld_comment && isset( $row->rc_comment ) ) {
+                                       $vals['comment'] = $row->rc_comment;
+                               }
 
-               if ( $this->fld_parsedcomment && isset( $row->rc_comment ) ) {
-                       $vals['parsedcomment'] = Linker::formatComment( $row->rc_comment, $title );
+                               if ( $this->fld_parsedcomment && isset( $row->rc_comment ) ) {
+                                       $vals['parsedcomment'] = Linker::formatComment( $row->rc_comment, $title );
+                               }
+                       }
                }
 
                if ( $this->fld_redirect ) {
@@ -492,23 +547,29 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
                        $vals['patrolled'] = '';
                }
 
-               if ( $this->fld_patrolled && ChangesList::isUnpatrolled( $row, $this->getUser() ) ) {
+               if ( $this->fld_patrolled && ChangesList::isUnpatrolled( $row, $user ) ) {
                        $vals['unpatrolled'] = '';
                }
 
                if ( $this->fld_loginfo && $row->rc_type == RC_LOG ) {
-                       $vals['logid'] = intval( $row->rc_logid );
-                       $vals['logtype'] = $row->rc_log_type;
-                       $vals['logaction'] = $row->rc_log_action;
-                       $logEntry = DatabaseLogEntry::newFromRow( (array)$row );
-                       ApiQueryLogEvents::addLogParams(
-                               $this->getResult(),
-                               $vals,
-                               $logEntry->getParameters(),
-                               $logEntry->getType(),
-                               $logEntry->getSubtype(),
-                               $logEntry->getTimestamp()
-                       );
+                       if ( $row->rc_deleted & LogPage::DELETED_ACTION ) {
+                               $vals['actionhidden'] = '';
+                               $anyHidden = true;
+                       }
+                       if ( LogEventsList::userCanBitfield( $row->rc_deleted, LogPage::DELETED_ACTION, $user ) ) {
+                               $vals['logid'] = intval( $row->rc_logid );
+                               $vals['logtype'] = $row->rc_log_type;
+                               $vals['logaction'] = $row->rc_log_action;
+                               $logEntry = DatabaseLogEntry::newFromRow( (array)$row );
+                               ApiQueryLogEvents::addLogParams(
+                                       $this->getResult(),
+                                       $vals,
+                                       $logEntry->getParameters(),
+                                       $logEntry->getType(),
+                                       $logEntry->getSubtype(),
+                                       $logEntry->getTimestamp()
+                               );
+                       }
                }
 
                if ( $this->fld_tags ) {
@@ -522,15 +583,16 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
                }
 
                if ( $this->fld_sha1 && $row->rev_sha1 !== null ) {
-                       // The RevDel check should currently never pass due to the
-                       // rc_deleted = 0 condition in the WHERE clause, but in case that
-                       // ever changes we check it here too.
                        if ( $row->rev_deleted & Revision::DELETED_TEXT ) {
                                $vals['sha1hidden'] = '';
-                       } elseif ( $row->rev_sha1 !== '' ) {
-                               $vals['sha1'] = wfBaseConvert( $row->rev_sha1, 36, 16, 40 );
-                       } else {
-                               $vals['sha1'] = '';
+                               $anyHidden = true;
+                       }
+                       if ( Revision::userCanBitfield( $row->rev_deleted, Revision::DELETED_TEXT, $user ) ) {
+                               if ( $row->rev_sha1 !== '' ) {
+                                       $vals['sha1'] = wfBaseConvert( $row->rev_sha1, 36, 16, 40 );
+                               } else {
+                                       $vals['sha1'] = '';
+                               }
                        }
                }
 
@@ -547,6 +609,10 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
                        }
                }
 
+               if ( $anyHidden && ( $row->rc_deleted & Revision::DELETED_RESTRICTED ) ) {
+                       $vals['suppressed'] = '';
+               }
+
                return $vals;
        }
 
@@ -559,6 +625,7 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
 
                        return $retval;
                }
+
                switch ( $type ) {
                        case 'edit':
                                return RC_EDIT;
@@ -568,6 +635,8 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
                                return RC_LOG;
                        case 'external':
                                return RC_EXTERNAL;
+                       default:
+                               ApiBase::dieDebug( __METHOD__, "Unknown type '$type'" );
                }
        }
 
@@ -582,6 +651,9 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
                if ( isset( $params['token'] ) ) {
                        return 'private';
                }
+               if ( $this->userCanSeeRevDel() ) {
+                       return 'private';
+               }
                if ( !is_null( $params['prop'] ) && in_array( 'parsedcomment', $params['prop'] ) ) {
                        // formatComment() calls wfMessage() among other things
                        return 'anon-public-user-private';
index ea992b3..bd5c512 100644 (file)
@@ -147,7 +147,7 @@ class ApiQueryRevisions extends ApiQueryBase {
                                if ( !$difftoRev ) {
                                        $this->dieUsageMsg( array( 'nosuchrevid', $params['diffto'] ) );
                                }
-                               if ( $difftoRev->isDeleted( Revision::DELETED_TEXT ) ) {
+                               if ( !$diffToRev->userCan( Revision::DELETED_TEXT, $this->getUser() ) ) {
                                        $this->setWarning( "Couldn't diff to r{$difftoRev->getID()}: content is hidden" );
                                        $params['diffto'] = null;
                                }
@@ -316,7 +316,16 @@ class ApiQueryRevisions extends ApiQueryBase {
                        }
                        if ( !is_null( $params['user'] ) || !is_null( $params['excludeuser'] ) ) {
                                // Paranoia: avoid brute force searches (bug 17342)
-                               $this->addWhere( $db->bitAnd( 'rev_deleted', Revision::DELETED_USER ) . ' = 0' );
+                               if ( !$this->getUser()->isAllowed( 'deletedhistory' ) ) {
+                                       $bitmask = Revision::DELETED_USER;
+                               } elseif ( !$this->getUser()->isAllowed( 'suppressrevision' ) ) {
+                                       $bitmask = Revision::DELETED_USER | Revision::DELETED_RESTRICTED;
+                               } else {
+                                       $bitmask = 0;
+                               }
+                               if ( $bitmask ) {
+                                       $this->addWhere( $db->bitAnd( 'rev_deleted', $bitmask ) . " != $bitmask" );
+                               }
                        }
                } elseif ( $revCount > 0 ) {
                        $max = $this->getMain()->canApiHighLimits() ? $botMax : $userMax;
@@ -408,7 +417,9 @@ class ApiQueryRevisions extends ApiQueryBase {
        private function extractRowInfo( $row ) {
                $revision = new Revision( $row );
                $title = $revision->getTitle();
+               $user = $this->getUser();
                $vals = array();
+               $anyHidden = false;
 
                if ( $this->fld_ids ) {
                        $vals['revid'] = intval( $revision->getId() );
@@ -425,11 +436,13 @@ class ApiQueryRevisions extends ApiQueryBase {
                if ( $this->fld_user || $this->fld_userid ) {
                        if ( $revision->isDeleted( Revision::DELETED_USER ) ) {
                                $vals['userhidden'] = '';
-                       } else {
+                               $anyHidden = true;
+                       }
+                       if ( $revision->userCan( Revision::DELETED_USER, $user ) ) {
                                if ( $this->fld_user ) {
-                                       $vals['user'] = $revision->getUserText();
+                                       $vals['user'] = $revision->getRawUserText();
                                }
-                               $userid = $revision->getUser();
+                               $userid = $revision->getRawUser();
                                if ( !$userid ) {
                                        $vals['anon'] = '';
                                }
@@ -452,14 +465,18 @@ class ApiQueryRevisions extends ApiQueryBase {
                        }
                }
 
-               if ( $this->fld_sha1 && !$revision->isDeleted( Revision::DELETED_TEXT ) ) {
-                       if ( $revision->getSha1() != '' ) {
-                               $vals['sha1'] = wfBaseConvert( $revision->getSha1(), 36, 16, 40 );
-                       } else {
-                               $vals['sha1'] = '';
+               if ( $this->fld_sha1 ) {
+                       if ( $revision->isDeleted( Revision::DELETED_TEXT ) ) {
+                               $vals['sha1hidden'] = '';
+                               $anyHidden = true;
+                       }
+                       if ( $revision->userCan( Revision::DELETED_TEXT, $user ) ) {
+                               if ( $revision->getSha1() != '' ) {
+                                       $vals['sha1'] = wfBaseConvert( $revision->getSha1(), 36, 16, 40 );
+                               } else {
+                                       $vals['sha1'] = '';
+                               }
                        }
-               } elseif ( $this->fld_sha1 ) {
-                       $vals['sha1hidden'] = '';
                }
 
                if ( $this->fld_contentmodel ) {
@@ -469,8 +486,10 @@ class ApiQueryRevisions extends ApiQueryBase {
                if ( $this->fld_comment || $this->fld_parsedcomment ) {
                        if ( $revision->isDeleted( Revision::DELETED_COMMENT ) ) {
                                $vals['commenthidden'] = '';
-                       } else {
-                               $comment = $revision->getComment();
+                               $anyHidden = true;
+                       }
+                       if ( $revision->userCan( Revision::DELETED_COMMENT, $user ) ) {
+                               $comment = $revision->getRawComment();
 
                                if ( $this->fld_comment ) {
                                        $vals['comment'] = $comment;
@@ -507,7 +526,7 @@ class ApiQueryRevisions extends ApiQueryBase {
                $content = null;
                global $wgParser;
                if ( $this->fld_content || !is_null( $this->diffto ) || !is_null( $this->difftotext ) ) {
-                       $content = $revision->getContent();
+                       $content = $revision->getContent( Revision::FOR_THIS_USER, $this->getUser() );
                        // Expand templates after getting section content because
                        // template-added sections don't count and Parser::preprocess()
                        // will have less input
@@ -520,8 +539,14 @@ class ApiQueryRevisions extends ApiQueryBase {
                                        );
                                }
                        }
+                       if ( $revision->isDeleted( Revision::DELETED_TEXT ) ) {
+                               $vals['texthidden'] = '';
+                               $anyHidden = true;
+                       } elseif ( !$content ) {
+                               $vals['textmissing'] = '';
+                       }
                }
-               if ( $this->fld_content && $content && !$revision->isDeleted( Revision::DELETED_TEXT ) ) {
+               if ( $this->fld_content && $content ) {
                        $text = null;
 
                        if ( $this->generateXML ) {
@@ -596,21 +621,13 @@ class ApiQueryRevisions extends ApiQueryBase {
                        if ( $text !== false ) {
                                ApiResult::setContent( $vals, $text );
                        }
-               } elseif ( $this->fld_content ) {
-                       if ( $revision->isDeleted( Revision::DELETED_TEXT ) ) {
-                               $vals['texthidden'] = '';
-                       } else {
-                               $vals['textmissing'] = '';
-                       }
                }
 
-               if ( !is_null( $this->diffto ) || !is_null( $this->difftotext ) ) {
+               if ( $content && ( !is_null( $this->diffto ) || !is_null( $this->difftotext ) ) ) {
                        global $wgAPIMaxUncachedDiffs;
                        static $n = 0; // Number of uncached diffs we've had
 
-                       if ( is_null( $content ) ) {
-                               $vals['textmissing'] = '';
-                       } elseif ( $n < $wgAPIMaxUncachedDiffs ) {
+                       if ( $n < $wgAPIMaxUncachedDiffs ) {
                                $vals['diff'] = array();
                                $context = new DerivativeContext( $this->getContext() );
                                $context->setTitle( $title );
@@ -653,6 +670,10 @@ class ApiQueryRevisions extends ApiQueryBase {
                        }
                }
 
+               if ( $anyHidden && $revision->isDeleted( Revision::DELETED_RESTRICTED ) ) {
+                       $vals['suppressed'] = '';
+               }
+
                return $vals;
        }
 
@@ -660,6 +681,9 @@ class ApiQueryRevisions extends ApiQueryBase {
                if ( isset( $params['token'] ) ) {
                        return 'private';
                }
+               if ( $this->userCanSeeRevDel() ) {
+                       return 'private';
+               }
                if ( !is_null( $params['prop'] ) && in_array( 'parsedcomment', $params['prop'] ) ) {
                        // formatComment() calls wfMessage() among other things
                        return 'anon-public-user-private';
index 0a74d98..a81a520 100644 (file)
@@ -183,10 +183,6 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                // 'case-insensitive' option is reserved for future
                $data['case'] = $GLOBALS['wgCapitalLinks'] ? 'first-letter' : 'case-sensitive';
 
-               if ( isset( $GLOBALS['wgRightsCode'] ) ) {
-                       $data['rightscode'] = $GLOBALS['wgRightsCode'];
-               }
-               $data['rights'] = $GLOBALS['wgRightsText'];
                $data['lang'] = $GLOBALS['wgLanguageCode'];
 
                $fallbacks = array();
@@ -253,6 +249,10 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                        $data['imagelimits'][$k] = array( 'width' => $limit[0], 'height' => $limit[1] );
                }
 
+               if ( !empty( $GLOBALS['wgFavicon'] ) ) {
+                       $data['favicon'] = $GLOBALS['wgFavicon'];
+               }
+
                wfRunHooks( 'APIQuerySiteInfoGeneralInfo', array( $this, &$data ) );
 
                return $this->getResult()->addValue( 'query', $property, $data );
index 1c9a93c..7896a2c 100644 (file)
@@ -176,9 +176,19 @@ class ApiQueryContributions extends ApiQueryBase {
                        );
                }
 
-               if ( !$user->isAllowed( 'hideuser' ) ) {
-                       $this->addWhere( $this->getDB()->bitAnd( 'rev_deleted', Revision::DELETED_USER ) . ' = 0' );
+               // Don't include any revisions where we're not supposed to be able to
+               // see the username.
+               if ( !$user->isAllowed( 'deletedhistory' ) ) {
+                       $bitmask = Revision::DELETED_USER;
+               } elseif ( !$user->isAllowed( 'suppressrevision' ) ) {
+                       $bitmask = Revision::DELETED_USER | Revision::DELETED_RESTRICTED;
+               } else {
+                       $bitmask = 0;
+               }
+               if ( $bitmask ) {
+                       $this->addWhere( $this->getDB()->bitAnd( 'rev_deleted', $bitmask ) . " != $bitmask" );
                }
+
                // We only want pages by the specified users.
                if ( $this->prefixMode ) {
                        $this->addWhere( 'rev_user_text' .
@@ -299,11 +309,19 @@ class ApiQueryContributions extends ApiQueryBase {
         */
        private function extractRowInfo( $row ) {
                $vals = array();
+               $anyHidden = false;
+
+               if ( $row->rev_deleted & Revision::DELETED_TEXT ) {
+                       $vals['texthidden'] = '';
+                       $anyHidden = true;
+               }
 
+               // Any rows where we can't view the user were filtered out in the query.
                $vals['userid'] = $row->rev_user;
                $vals['user'] = $row->rev_user_text;
                if ( $row->rev_deleted & Revision::DELETED_USER ) {
                        $vals['userhidden'] = '';
+                       $anyHidden = true;
                }
                if ( $this->fld_ids ) {
                        $vals['pageid'] = intval( $row->rev_page );
@@ -340,7 +358,9 @@ class ApiQueryContributions extends ApiQueryBase {
                if ( ( $this->fld_comment || $this->fld_parsedcomment ) && isset( $row->rev_comment ) ) {
                        if ( $row->rev_deleted & Revision::DELETED_COMMENT ) {
                                $vals['commenthidden'] = '';
-                       } else {
+                               $anyHidden = true;
+                       }
+                       if ( Revision::userCanBitfield( $row->rev_deleted, Revision::DELETED_COMMENT, $this->getUser() ) ) {
                                if ( $this->fld_comment ) {
                                        $vals['comment'] = $row->rev_comment;
                                }
@@ -379,6 +399,10 @@ class ApiQueryContributions extends ApiQueryBase {
                        }
                }
 
+               if ( $anyHidden && $row->rev_deleted & Revision::DELETED_RESTRICTED ) {
+                       $vals['suppressed'] = '';
+               }
+
                return $vals;
        }
 
index f8e521f..b7dc865 100644 (file)
@@ -59,7 +59,8 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
 
                $params = $this->extractRequestParams();
 
-               $user = $this->getWatchlistUser( $params );
+               $user = $this->getUser();
+               $wlowner = $this->getWatchlistUser( $params );
 
                if ( !is_null( $params['prop'] ) && is_null( $resultPageSet ) ) {
                        $prop = array_flip( $params['prop'] );
@@ -89,6 +90,7 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
                        'rc_title',
                        'rc_timestamp',
                        'rc_type',
+                       'rc_deleted',
                ) );
 
                if ( is_null( $resultPageSet ) ) {
@@ -120,7 +122,7 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
                        'watchlist',
                ) );
 
-               $userId = $user->getId();
+               $userId = $wlowner->getId();
                $this->addJoinConds( array( 'watchlist' => array( 'INNER JOIN',
                        array(
                                'wl_user' => $userId,
@@ -129,10 +131,6 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
                        )
                ) ) );
 
-               $this->addWhere( array(
-                       'rc_deleted' => 0,
-               ) );
-
                $db = $this->getDB();
 
                $this->addTimestampWhereRange( 'rc_timestamp', $params['dir'],
@@ -159,7 +157,6 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
 
                        // Check permissions.
                        if ( isset( $show['patrolled'] ) || isset( $show['!patrolled'] ) ) {
-                               $user = $this->getUser();
                                if ( !$user->useRCPatrol() && !$user->useNPPatrol() ) {
                                        $this->dieUsage(
                                                'You need the patrol right to request the patrolled flag',
@@ -199,6 +196,36 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
                        !isset( $params['start'] ) && !isset( $params['end'] ) && $db->getType() == 'mysql'
                );
 
+               // Paranoia: avoid brute force searches (bug 17342)
+               if ( !is_null( $params['user'] ) || !is_null( $params['excludeuser'] ) ) {
+                       if ( !$user->isAllowed( 'deletedhistory' ) ) {
+                               $bitmask = Revision::DELETED_USER;
+                       } elseif ( !$user->isAllowed( 'suppressrevision' ) ) {
+                               $bitmask = Revision::DELETED_USER | Revision::DELETED_RESTRICTED;
+                       } else {
+                               $bitmask = 0;
+                       }
+                       if ( $bitmask ) {
+                               $this->addWhere( $this->getDB()->bitAnd( 'rc_deleted', $bitmask ) . " != $bitmask" );
+                       }
+               }
+
+               // LogPage::DELETED_ACTION hides the affected page, too. So hide those
+               // entirely from the watchlist, or someone could guess the title.
+               if ( !$user->isAllowed( 'deletedhistory' ) ) {
+                       $bitmask = LogPage::DELETED_ACTION;
+               } elseif ( !$user->isAllowed( 'suppressrevision' ) ) {
+                       $bitmask = LogPage::DELETED_ACTION | LogPage::DELETED_RESTRICTED;
+               } else {
+                       $bitmask = 0;
+               }
+               if ( $bitmask ) {
+                       $this->addWhere( $this->getDB()->makeList( array(
+                               'rc_type != ' . RC_LOG,
+                               $this->getDB()->bitAnd( 'rc_deleted', $bitmask ) . " != $bitmask",
+                       ), LIST_OR ) );
+               }
+
                $this->addOption( 'LIMIT', $params['limit'] + 1 );
 
                $ids = array();
@@ -246,6 +273,11 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
        }
 
        private function extractRowInfo( $row ) {
+               /* Determine the title of the page that has been changed. */
+               $title = Title::makeTitle( $row->rc_namespace, $row->rc_title );
+               $user = $this->getUser();
+
+               /* Our output data. */
                $vals = array();
 
                $type = intval( $row->rc_type );
@@ -274,87 +306,131 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
                                $vals['type'] = $type;
                }
 
-               if ( $this->fld_ids ) {
-                       $vals['pageid'] = intval( $row->rc_cur_id );
-                       $vals['revid'] = intval( $row->rc_this_oldid );
-                       $vals['old_revid'] = intval( $row->rc_last_oldid );
-               }
-
-               $title = Title::makeTitle( $row->rc_namespace, $row->rc_title );
+               $anyHidden = false;
 
-               if ( $this->fld_title ) {
-                       ApiQueryBase::addTitleInfo( $vals, $title );
+               /* Create a new entry in the result for the title. */
+               if ( $this->fld_title || $this->fld_ids ) {
+                       // These should already have been filtered out of the query, but just in case.
+                       if ( $type === RC_LOG && ( $row->rc_deleted & LogPage::DELETED_ACTION ) ) {
+                               $vals['actionhidden'] = '';
+                               $anyHidden = true;
+                       }
+                       if ( $type !== RC_LOG ||
+                               LogEventsList::userCanBitfield( $row->rc_deleted, LogPage::DELETED_ACTION, $user )
+                       ) {
+                               if ( $this->fld_title ) {
+                                       ApiQueryBase::addTitleInfo( $vals, $title );
+                               }
+                               if ( $this->fld_ids ) {
+                                       $vals['pageid'] = intval( $row->rc_cur_id );
+                                       $vals['revid'] = intval( $row->rc_this_oldid );
+                                       $vals['old_revid'] = intval( $row->rc_last_oldid );
+                               }
+                       }
                }
 
+               /* Add user data and 'anon' flag, if user is anonymous. */
                if ( $this->fld_user || $this->fld_userid ) {
-
-                       if ( $this->fld_userid ) {
-                               $vals['userid'] = $row->rc_user;
-                               // for backwards compatibility
-                               $vals['user'] = $row->rc_user;
+                       if ( $row->rc_deleted & Revision::DELETED_USER ) {
+                               $vals['userhidden'] = '';
+                               $anyHidden = true;
                        }
+                       if ( Revision::userCanBitfield( $row->rc_deleted, Revision::DELETED_USER, $user ) ) {
+                               if ( $this->fld_userid ) {
+                                       $vals['userid'] = $row->rc_user;
+                                       // for backwards compatibility
+                                       $vals['user'] = $row->rc_user;
+                               }
 
-                       if ( $this->fld_user ) {
-                               $vals['user'] = $row->rc_user_text;
-                       }
+                               if ( $this->fld_user ) {
+                                       $vals['user'] = $row->rc_user_text;
+                               }
 
-                       if ( !$row->rc_user ) {
-                               $vals['anon'] = '';
+                               if ( !$row->rc_user ) {
+                                       $vals['anon'] = '';
+                               }
                        }
                }
 
+               /* Add flags, such as new, minor, bot. */
                if ( $this->fld_flags ) {
+                       if ( $row->rc_bot ) {
+                               $vals['bot'] = '';
+                       }
                        if ( $row->rc_type == RC_NEW ) {
                                $vals['new'] = '';
                        }
                        if ( $row->rc_minor ) {
                                $vals['minor'] = '';
                        }
-                       if ( $row->rc_bot ) {
-                               $vals['bot'] = '';
-                       }
                }
 
-               if ( $this->fld_patrol && isset( $row->rc_patrolled ) ) {
-                       $vals['patrolled'] = '';
+               /* Add sizes of each revision. (Only available on 1.10+) */
+               if ( $this->fld_sizes ) {
+                       $vals['oldlen'] = intval( $row->rc_old_len );
+                       $vals['newlen'] = intval( $row->rc_new_len );
                }
 
+               /* Add the timestamp. */
                if ( $this->fld_timestamp ) {
                        $vals['timestamp'] = wfTimestamp( TS_ISO_8601, $row->rc_timestamp );
                }
 
-               if ( $this->fld_sizes ) {
-                       $vals['oldlen'] = intval( $row->rc_old_len );
-                       $vals['newlen'] = intval( $row->rc_new_len );
-               }
-
                if ( $this->fld_notificationtimestamp ) {
                        $vals['notificationtimestamp'] = ( $row->wl_notificationtimestamp == null )
                                ? ''
                                : wfTimestamp( TS_ISO_8601, $row->wl_notificationtimestamp );
                }
 
-               if ( $this->fld_comment && isset( $row->rc_comment ) ) {
-                       $vals['comment'] = $row->rc_comment;
+               /* Add edit summary / log summary. */
+               if ( $this->fld_comment || $this->fld_parsedcomment ) {
+                       if ( $row->rc_deleted & Revision::DELETED_COMMENT ) {
+                               $vals['commenthidden'] = '';
+                               $anyHidden = true;
+                       }
+                       if ( Revision::userCanBitfield( $row->rc_deleted, Revision::DELETED_COMMENT, $user ) ) {
+                               if ( $this->fld_comment && isset( $row->rc_comment ) ) {
+                                       $vals['comment'] = $row->rc_comment;
+                               }
+
+                               if ( $this->fld_parsedcomment && isset( $row->rc_comment ) ) {
+                                       $vals['parsedcomment'] = Linker::formatComment( $row->rc_comment, $title );
+                               }
+                       }
+               }
+
+               /* Add the patrolled flag */
+               if ( $this->fld_patrol && $row->rc_patrolled == 1 ) {
+                       $vals['patrolled'] = '';
                }
 
-               if ( $this->fld_parsedcomment && isset( $row->rc_comment ) ) {
-                       $vals['parsedcomment'] = Linker::formatComment( $row->rc_comment, $title );
+               if ( $this->fld_patrol && ChangesList::isUnpatrolled( $row, $user ) ) {
+                       $vals['unpatrolled'] = '';
                }
 
                if ( $this->fld_loginfo && $row->rc_type == RC_LOG ) {
-                       $vals['logid'] = intval( $row->rc_logid );
-                       $vals['logtype'] = $row->rc_log_type;
-                       $vals['logaction'] = $row->rc_log_action;
-                       $logEntry = DatabaseLogEntry::newFromRow( (array)$row );
-                       ApiQueryLogEvents::addLogParams(
-                               $this->getResult(),
-                               $vals,
-                               $logEntry->getParameters(),
-                               $logEntry->getType(),
-                               $logEntry->getSubtype(),
-                               $logEntry->getTimestamp()
-                       );
+                       if ( $row->rc_deleted & LogPage::DELETED_ACTION ) {
+                               $vals['actionhidden'] = '';
+                               $anyHidden = true;
+                       }
+                       if ( LogEventsList::userCanBitfield( $row->rc_deleted, LogPage::DELETED_ACTION, $user ) ) {
+                               $vals['logid'] = intval( $row->rc_logid );
+                               $vals['logtype'] = $row->rc_log_type;
+                               $vals['logaction'] = $row->rc_log_action;
+                               $logEntry = DatabaseLogEntry::newFromRow( (array)$row );
+                               ApiQueryLogEvents::addLogParams(
+                                       $this->getResult(),
+                                       $vals,
+                                       $logEntry->getParameters(),
+                                       $logEntry->getType(),
+                                       $logEntry->getSubtype(),
+                                       $logEntry->getTimestamp()
+                               );
+                       }
+               }
+
+               if ( $anyHidden && ( $row->rc_deleted & Revision::DELETED_RESTRICTED ) ) {
+                       $vals['suppressed'] = '';
                }
 
                return $vals;
@@ -374,6 +450,7 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
 
                        return $retval;
                }
+
                switch ( $type ) {
                        case 'edit':
                                return RC_EDIT;
@@ -383,6 +460,8 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
                                return RC_LOG;
                        case 'external':
                                return RC_EXTERNAL;
+                       default:
+                               ApiBase::dieDebug( __METHOD__, "Unknown type '$type'" );
                }
        }
 
@@ -464,7 +543,7 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
                        ),
                        'token' => array(
                                ApiBase::PARAM_TYPE => 'string'
-                       )
+                       ),
                );
        }
 
@@ -508,7 +587,7 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
                        ),
                        'owner' => 'The name of the user whose watchlist you\'d like to access',
                        'token' => 'Give a security token (settable in preferences) to ' .
-                               'allow access to another user\'s watchlist'
+                               'allow access to another user\'s watchlist',
                );
        }
 
index 107e2c4..470b150 100644 (file)
@@ -161,7 +161,6 @@ class ChangesList extends ContextSource {
                $this->lastdate = '';
                $this->rclistOpen = false;
                $this->getOutput()->addModuleStyles( 'mediawiki.special.changeslist' );
-               $this->getOutput()->addModules( 'mediawiki.special.changeslist.js' );
 
                return '<div class="mw-changeslist">';
        }
index 42b112c..df60f02 100644 (file)
@@ -41,7 +41,6 @@ class EnhancedChangesList extends ChangesList {
                $this->getOutput()->addModules( array(
                        'jquery.makeCollapsible',
                        'mediawiki.icon',
-                       'mediawiki.special.changeslist.js',
                ) );
 
                return '<div class="mw-changeslist">';
@@ -223,7 +222,7 @@ class EnhancedChangesList extends ChangesList {
                if ( $block[0]->mAttribs['rc_log_type'] ) {
                        # Log entry
                        $classes[] = Sanitizer::escapeClass( 'mw-changeslist-log-'
-                               . $block[0]->mAttribs['rc_log_type'] . '-' . $block[0]->mAttribs['rc_title'] );
+                               . $block[0]->mAttribs['rc_log_type'] );
                } else {
                        $classes[] = Sanitizer::escapeClass( 'mw-changeslist-ns'
                                . $block[0]->mAttribs['rc_namespace'] . '-' . $block[0]->mAttribs['rc_title'] );
@@ -589,8 +588,7 @@ class EnhancedChangesList extends ChangesList {
                $classes = array( 'mw-enhanced-rc' );
                if ( $logType ) {
                        # Log entry
-                       $classes[] = Sanitizer::escapeClass( 'mw-changeslist-log-'
-                               . $logType . '-' . $rcObj->mAttribs['rc_title'] );
+                       $classes[] = Sanitizer::escapeClass( 'mw-changeslist-log-' . $logType );
                } else {
                        $classes[] = Sanitizer::escapeClass( 'mw-changeslist-ns' .
                                $rcObj->mAttribs['rc_namespace'] . '-' . $rcObj->mAttribs['rc_title'] );
index f1f2578..e71a2d5 100644 (file)
@@ -336,14 +336,6 @@ class RecentChange {
                global $wgRCFeeds;
 
                foreach ( $wgRCFeeds as $feed ) {
-                       $engine = self::getEngine( $feed['uri'] );
-
-                       if ( isset( $this->mExtra['actionCommentIRC'] ) ) {
-                               $actionComment = $this->mExtra['actionCommentIRC'];
-                       } else {
-                               $actionComment = null;
-                       }
-
                        $omitBots = isset( $feed['omit_bots'] ) ? $feed['omit_bots'] : false;
 
                        if (
@@ -353,6 +345,14 @@ class RecentChange {
                                continue;
                        }
 
+                       $engine = self::getEngine( $feed['uri'] );
+
+                       if ( isset( $this->mExtra['actionCommentIRC'] ) ) {
+                               $actionComment = $this->mExtra['actionCommentIRC'];
+                       } else {
+                               $actionComment = null;
+                       }
+
                        /** @var $formatter RCFeedFormatter */
                        $formatter = new $feed['formatter']();
                        $line = $formatter->getLine( $feed, $this, $actionComment );
@@ -366,9 +366,9 @@ class RecentChange {
         *
         * @param string $uri URI to get the engine object for
         * @throws MWException
-        * @return object The engine object
+        * @return RCFeedEngine The engine object
         */
-       private static function getEngine( $uri ) {
+       public static function getEngine( $uri ) {
                global $wgRCEngines;
 
                $scheme = parse_url( $uri, PHP_URL_SCHEME );
index 3d1f453..0c7b612 100644 (file)
  * Kind of like Hawking's [[Chronology Protection Agency]].
  */
 class ChronologyProtector {
-       /** @var Array (DB master name => position) */
+       /** @var array (DB master name => position) */
        protected $startupPositions = array();
-       /** @var Array (DB master name => position) */
+
+       /** @var array (DB master name => position) */
        protected $shutdownPositions = array();
 
-       protected $initialized = false; // bool; whether the session data was loaded
+       /** @var bool Whether the session data was loaded */
+       protected $initialized = false;
 
        /**
         * Initialise a LoadBalancer to give it appropriate chronology protection.
@@ -41,7 +43,7 @@ class ChronologyProtector {
         * to that position by delaying execution. The delay may timeout and allow stale
         * data if no non-lagged slaves are available.
         *
-        * @param $lb LoadBalancer
+        * @param LoadBalancer $lb
         * @return void
         */
        public function initLB( LoadBalancer $lb ) {
@@ -67,7 +69,7 @@ class ChronologyProtector {
         * Notify the ChronologyProtector that the LoadBalancer is about to shut
         * down. Saves replication positions.
         *
-        * @param $lb LoadBalancer
+        * @param LoadBalancer $lb
         * @return void
         */
        public function shutdownLB( LoadBalancer $lb ) {
index 1e01d29..c5dc882 100644 (file)
  */
 
 class CloneDatabase {
-       /**
-        * Table prefix for cloning
-        * @var String
-        */
+       /** @var string Table prefix for cloning */
        private $newTablePrefix = '';
 
-       /**
-        * Current table prefix
-        * @var String
-        */
+       /** @var string Current table prefix */
        private $oldTablePrefix = '';
 
-       /**
-        * List of tables to be cloned
-        * @var Array
-        */
+       /** @var array List of tables to be cloned */
        private $tablesToClone = array();
 
-       /**
-        * Should we DROP tables containing the new names?
-        * @var Bool
-        */
+       /** @var bool Should we DROP tables containing the new names? */
        private $dropCurrentTables = true;
 
-       /**
-        * Whether to use temporary tables or not
-        * @var Bool
-        */
+       /** @var bool Whether to use temporary tables or not */
        private $useTemporaryTables = true;
 
        /**
         * Constructor
         *
-        * @param $db DatabaseBase A database subclass
+        * @param DatabaseBase $db A database subclass
         * @param array $tablesToClone An array of tables to clone, unprefixed
         * @param string $newTablePrefix Prefix to assign to the tables
         * @param string $oldTablePrefix Prefix on current tables, if not $wgDBprefix
-        * @param $dropCurrentTables bool
+        * @param bool $dropCurrentTables
         */
        public function __construct( DatabaseBase $db, array $tablesToClone,
                $newTablePrefix, $oldTablePrefix = '', $dropCurrentTables = true
@@ -128,7 +113,7 @@ class CloneDatabase {
        /**
         * Change the table prefix on all open DB connections/
         *
-        * @param $prefix
+        * @param string $prefix
         * @return void
         */
        public static function changePrefix( $prefix ) {
@@ -138,8 +123,8 @@ class CloneDatabase {
        }
 
        /**
-        * @param $lb LoadBalancer
-        * @param $prefix
+        * @param LoadBalancer $lb
+        * @param string $prefix
         * @return void
         */
        public static function changeLBPrefix( $lb, $prefix ) {
@@ -147,8 +132,8 @@ class CloneDatabase {
        }
 
        /**
-        * @param $db DatabaseBase
-        * @param $prefix
+        * @param DatabaseBase $db
+        * @param string $prefix
         * @return void
         */
        public static function changeDBPrefix( $db, $prefix ) {
index 2e19f6a..90e658f 100644 (file)
@@ -57,18 +57,18 @@ interface DatabaseType {
         * member variables.
         * If no more rows are available, false is returned.
         *
-        * @param $res ResultWrapper|object as returned from DatabaseBase::query(), etc.
-        * @return object|bool
+        * @param ResultWrapper|stdClass $res Object as returned from DatabaseBase::query(), etc.
+        * @return stdClass|bool
         * @throws DBUnexpectedError Thrown if the database returns an error
         */
        function fetchObject( $res );
 
        /**
         * Fetch the next row from the given result object, in associative array
-        * form.  Fields are retrieved with $row['fieldname'].
+        * form. Fields are retrieved with $row['fieldname'].
         * If no more rows are available, false is returned.
         *
-        * @param $res ResultWrapper result object as returned from DatabaseBase::query(), etc.
+        * @param ResultWrapper $res Result object as returned from DatabaseBase::query(), etc.
         * @return array|bool
         * @throws DBUnexpectedError Thrown if the database returns an error
         */
@@ -77,7 +77,7 @@ interface DatabaseType {
        /**
         * Get the number of rows in a result object
         *
-        * @param $res Mixed: A SQL result
+        * @param mixed $res A SQL result
         * @return int
         */
        function numRows( $res );
@@ -86,7 +86,7 @@ interface DatabaseType {
         * Get the number of fields in a result object
         * @see http://www.php.net/mysql_num_fields
         *
-        * @param $res Mixed: A SQL result
+        * @param mixed $res A SQL result
         * @return int
         */
        function numFields( $res );
@@ -95,8 +95,8 @@ interface DatabaseType {
         * Get a field name in a result object
         * @see http://www.php.net/mysql_field_name
         *
-        * @param $res Mixed: A SQL result
-        * @param $n Integer
+        * @param mixed $res A SQL result
+        * @param int $n
         * @return string
         */
        function fieldName( $res, $n );
@@ -119,8 +119,8 @@ interface DatabaseType {
         * Change the position of the cursor in a result object
         * @see http://www.php.net/mysql_data_seek
         *
-        * @param $res Mixed: A SQL result
-        * @param $row Mixed: Either MySQL row or ResultWrapper
+        * @param mixed $res A SQL result
+        * @param int $row
         */
        function dataSeek( $res, $row );
 
@@ -144,8 +144,8 @@ interface DatabaseType {
         * mysql_fetch_field() wrapper
         * Returns false if the field doesn't exist
         *
-        * @param string $table table name
-        * @param string $field field name
+        * @param string $table Table name
+        * @param string $field Field name
         *
         * @return Field
         */
@@ -156,7 +156,7 @@ interface DatabaseType {
         * @param string $table Table name
         * @param string $index Index name
         * @param string $fname Calling function name
-        * @return Mixed: Database-specific index description class or false if the index does not exist
+        * @return mixed Database-specific index description class or false if the index does not exist
         */
        function indexInfo( $table, $index, $fname = __METHOD__ );
 
@@ -171,18 +171,18 @@ interface DatabaseType {
        /**
         * Wrapper for addslashes()
         *
-        * @param string $s to be slashed.
-        * @return string: slashed string.
+        * @param string $s String to be slashed.
+        * @return string Slashed string.
         */
        function strencode( $s );
 
        /**
         * Returns a wikitext link to the DB's website, e.g.,
-        *     return "[http://www.mysql.com/ MySQL]";
+        *   return "[http://www.mysql.com/ MySQL]";
         * Should at least contain plain text, if for some reason
         * your database has no website.
         *
-        * @return string: wikitext of a link to the server software's web site
+        * @return string Wikitext of a link to the server software's web site
         */
        function getSoftwareLink();
 
@@ -190,16 +190,16 @@ interface DatabaseType {
         * A string describing the current software version, like from
         * mysql_get_server_info().
         *
-        * @return string: Version information from the database server.
+        * @return string Version information from the database server.
         */
        function getServerVersion();
 
        /**
         * A string describing the current software version, and possibly
-        * other details in a user-friendly way.  Will be listed on Special:Version, etc.
+        * other details in a user-friendly way. Will be listed on Special:Version, etc.
         * Use getServerVersion() to get machine-friendly information.
         *
-        * @return string: Version information from the database server
+        * @return string Version information from the database server
         */
        function getServerInfo();
 }
@@ -218,8 +218,10 @@ interface IDatabase {
 abstract class DatabaseBase implements IDatabase, DatabaseType {
        /** Number of times to re-try an operation in case of deadlock */
        const DEADLOCK_TRIES = 4;
+
        /** Minimum time to wait before retry, in microseconds */
        const DEADLOCK_DELAY_MIN = 500000;
+
        /** Maximum time to wait before retry */
        const DEADLOCK_DELAY_MAX = 1500000;
 
@@ -233,6 +235,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
 
        protected $mServer, $mUser, $mPassword, $mDBname;
 
+       /** @var resource Database connection */
        protected $mConn = null;
        protected $mOpened = false;
 
@@ -246,7 +249,6 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        protected $mForeign;
        protected $mErrorCount = 0;
        protected $mLBInfo = array();
-       protected $mFakeSlaveLag = null, $mFakeMaster = false;
        protected $mDefaultBigSelects = null;
        protected $mSchemaVars = false;
 
@@ -268,7 +270,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * Remembers the function name given for starting the most recent transaction via begin().
         * Used to provide additional context for error reporting.
         *
-        * @var String
+        * @var string
         * @see DatabaseBase::mTrxLevel
         */
        private $mTrxFname = null;
@@ -276,7 +278,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        /**
         * Record if possible write queries were done in the last transaction started
         *
-        * @var Bool
+        * @var bool
         * @see DatabaseBase::mTrxLevel
         */
        private $mTrxDoneWrites = false;
@@ -284,7 +286,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        /**
         * Record if the current transaction was started implicitly due to DBO_TRX being set.
         *
-        * @var Bool
+        * @var bool
         * @see DatabaseBase::mTrxLevel
         */
        private $mTrxAutomatic = false;
@@ -299,19 +301,19 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        /**
         * Record if the current transaction was started implicitly by DatabaseBase::startAtomic
         *
-        * @var Bool
+        * @var bool
         */
        private $mTrxAutomaticAtomic = false;
 
        /**
         * @since 1.21
-        * @var file handle for upgrade
+        * @var resource File handle for upgrade
         */
        protected $fileHandle = null;
 
        /**
         * @since 1.22
-        * @var Process cache of VIEWs names in the database
+        * @var string[] Process cache of VIEWs names in the database
         */
        protected $allViews = null;
 
@@ -322,17 +324,17 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
 
        /**
         * A string describing the current software version, and possibly
-        * other details in a user-friendly way.  Will be listed on Special:Version, etc.
+        * other details in a user-friendly way. Will be listed on Special:Version, etc.
         * Use getServerVersion() to get machine-friendly information.
         *
-        * @return string: Version information from the database server
+        * @return string Version information from the database server
         */
        public function getServerInfo() {
                return $this->getServerVersion();
        }
 
        /**
-        * @return string: command delimiter used by this database engine
+        * @return string command delimiter used by this database engine
         */
        public function getDelimiter() {
                return $this->delimiter;
@@ -340,7 +342,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
 
        /**
         * Boolean, controls output of large amounts of debug information.
-        * @param $debug bool|null
+        * @param bool|null $debug
         *   - true to enable debugging
         *   - false to disable debugging
         *   - omitted or null to do nothing
@@ -369,8 +371,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * split up queries into batches using a LIMIT clause than to switch off
         * buffering.
         *
-        * @param $buffer null|bool
-        *
+        * @param null|bool $buffer
         * @return null|bool The previous value of the flag
         */
        public function bufferResults( $buffer = null ) {
@@ -390,8 +391,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         *
         * Do not use this function outside of the Database classes.
         *
-        * @param $ignoreErrors bool|null
-        *
+        * @param null|bool $ignoreErrors
         * @return bool The previous value of the flag.
         */
        public function ignoreErrors( $ignoreErrors = null ) {
@@ -431,7 +431,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        /**
         * Set the filehandle to copy write statements to.
         *
-        * @param $fh filehandle
+        * @param resource $fh File handle
         */
        public function setFileHandle( $fh ) {
                $this->fileHandle = $fh;
@@ -444,7 +444,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * @param string $name The entry of the info array to get, or null to get the
         *   whole array
         *
-        * @return LoadBalancer|null
+        * @return array|mixed|null
         */
        public function getLBInfo( $name = null ) {
                if ( is_null( $name ) ) {
@@ -463,7 +463,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * the LB info array is set to that parameter. If it is called with two
         * parameters, the member with the given name is set to the given value.
         *
-        * @param $name
+        * @param string $name
         * @param $value
         */
        public function setLBInfo( $name, $value = null ) {
@@ -477,19 +477,19 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        /**
         * Set lag time in seconds for a fake slave
         *
-        * @param $lag int
+        * @param mixed $lag Valid values for this parameter are determined by the
+        *   subclass, but should be a PHP scalar or array that would be sensible
+        *   as part of $wgLBFactoryConf.
         */
        public function setFakeSlaveLag( $lag ) {
-               $this->mFakeSlaveLag = $lag;
        }
 
        /**
         * Make this connection a fake master
         *
-        * @param $enabled bool
+        * @param bool $enabled
         */
        public function setFakeMaster( $enabled = true ) {
-               $this->mFakeMaster = $enabled;
        }
 
        /**
@@ -569,7 +569,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
 
        /**
         * Return the last query that went through DatabaseBase::query()
-        * @return String
+        * @return string
         */
        public function lastQuery() {
                return $this->mLastQuery;
@@ -599,7 +599,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
 
        /**
         * Is a connection to the database open?
-        * @return Boolean
+        * @return bool
         */
        public function isOpen() {
                return $this->mOpened;
@@ -608,7 +608,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        /**
         * Set a flag for this connection
         *
-        * @param $flag Integer: DBO_* constants from Defines.php:
+        * @param int $flag DBO_* constants from Defines.php:
         *   - DBO_DEBUG: output some debug info (same as debug())
         *   - DBO_NOBUFFER: don't buffer results (inverse of bufferResults())
         *   - DBO_TRX: automatically start transactions
@@ -620,14 +620,20 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
                global $wgDebugDBTransactions;
                $this->mFlags |= $flag;
                if ( ( $flag & DBO_TRX ) & $wgDebugDBTransactions ) {
-                       wfDebug( "Implicit transactions are now  disabled.\n" );
+                       wfDebug( "Implicit transactions are now disabled.\n" );
                }
        }
 
        /**
         * Clear a flag for this connection
         *
-        * @param $flag : same as setFlag()'s $flag param
+        * @param int $flag DBO_* constants from Defines.php:
+        *   - DBO_DEBUG: output some debug info (same as debug())
+        *   - DBO_NOBUFFER: don't buffer results (inverse of bufferResults())
+        *   - DBO_TRX: automatically start transactions
+        *   - DBO_DEFAULT: automatically sets DBO_TRX if not in command line mode
+        *       and removes it in command line mode
+        *   - DBO_PERSISTENT: use persistant database connection
         */
        public function clearFlag( $flag ) {
                global $wgDebugDBTransactions;
@@ -640,8 +646,14 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        /**
         * Returns a boolean whether the flag $flag is set for this connection
         *
-        * @param $flag : same as setFlag()'s $flag param
-        * @return Boolean
+        * @param int $flag DBO_* constants from Defines.php:
+        *   - DBO_DEBUG: output some debug info (same as debug())
+        *   - DBO_NOBUFFER: don't buffer results (inverse of bufferResults())
+        *   - DBO_TRX: automatically start transactions
+        *   - DBO_DEFAULT: automatically sets DBO_TRX if not in command line mode
+        *       and removes it in command line mode
+        *   - DBO_PERSISTENT: use persistant database connection
+        * @return bool
         */
        public function getFlag( $flag ) {
                return !!( $this->mFlags & $flag );
@@ -650,8 +662,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        /**
         * General read-only accessor
         *
-        * @param $name string
-        *
+        * @param string $name
         * @return string
         */
        public function getProperty( $name ) {
@@ -697,7 +708,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * DatabaseBase subclasses should not be constructed directly in external
         * code. DatabaseBase::factory() should be used instead.
         *
-        * @param array Parameters passed from DatabaseBase::factory()
+        * @param array $params Parameters passed from DatabaseBase::factory()
         */
        function __construct( $params = null ) {
                global $wgDBprefix, $wgCommandLineMode, $wgDebugDBTransactions;
@@ -782,7 +793,8 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * @param string $dbType A possible DB type
         * @param array $p An array of options to pass to the constructor.
         *    Valid options are: host, user, password, dbname, flags, tablePrefix, driver
-        * @return DatabaseBase subclass or null
+        * @throws MWException If the database driver or extension cannot be found
+        * @return DatabaseBase|null DatabaseBase subclass or null
         */
        final public static function factory( $dbType, $p = array() ) {
                $canonicalDBTypes = array(
@@ -864,8 +876,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
 
        /**
         * @param $errno
-        * @param $errstr
-        * @access private
+        * @param string $errstr
         */
        public function connectionErrorHandler( $errno, $errstr ) {
                $this->mPHPError = $errstr;
@@ -876,7 +887,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * if it is open : commits any open transactions
         *
         * @throws MWException
-        * @return Bool operation success. true if already closed.
+        * @return bool Operation success. true if already closed.
         */
        public function close() {
                if ( count( $this->mTrxIdleCallbacks ) ) { // sanity
@@ -905,12 +916,12 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        /**
         * Closes underlying database connection
         * @since 1.20
-        * @return bool: Whether connection was closed successfully
+        * @return bool Whether connection was closed successfully
         */
        abstract protected function closeConnection();
 
        /**
-        * @param string $error fallback error message, used if none is given by DB
+        * @param string $error Fallback error message, used if none is given by DB
         * @throws DBConnectionError
         */
        function reportConnectionError( $error = 'Unknown error' ) {
@@ -926,8 +937,9 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        /**
         * The DBMS-dependent part of query()
         *
-        * @param  $sql String: SQL query.
-        * @return ResultWrapper Result object to feed to fetchObject, fetchRow, ...; or false on failure
+        * @param string $sql SQL query.
+        * @return ResultWrapper|bool Result object to feed to fetchObject,
+        *   fetchRow, ...; or false on failure
         */
        abstract protected function doQuery( $sql );
 
@@ -935,8 +947,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * Determine whether a query writes to the DB.
         * Should return true if unsure.
         *
-        * @param $sql string
-        *
+        * @param string $sql
         * @return bool
         */
        public function isWriteQuery( $sql ) {
@@ -956,13 +967,13 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         *
         * However, the query wrappers themselves should call this function.
         *
-        * @param  $sql        String: SQL query
-        * @param  $fname      String: Name of the calling function, for profiling/SHOW PROCESSLIST
+        * @param string $sql SQL query
+        * @param string $fname Name of the calling function, for profiling/SHOW PROCESSLIST
         *     comment (you can use __METHOD__ or add some extra info)
-        * @param  $tempIgnore Boolean:   Whether to avoid throwing an exception on errors...
+        * @param bool $tempIgnore Whether to avoid throwing an exception on errors...
         *     maybe best to catch the exception instead?
         * @throws MWException
-        * @return boolean|ResultWrapper. true for a successful write query, ResultWrapper object
+        * @return bool|ResultWrapper True for a successful write query, ResultWrapper object
         *     for a successful read query, or false on failure if $tempIgnore set
         */
        public function query( $sql, $fname = __METHOD__, $tempIgnore = false ) {
@@ -1013,7 +1024,10 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
                        Profiler::instance()->transactionWritingIn( $this->mServer, $this->mDBname );
                }
 
+               $queryProf = '';
+               $totalProf = '';
                $isMaster = !is_null( $this->getLBInfo( 'master' ) );
+
                if ( !Profiler::instance()->isStub() ) {
                        # generalizeSQL will probably cut down the query to reasonable
                        # logging size most of the time. The substr is really just a sanity check.
@@ -1089,11 +1103,11 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * Report a query error. Log the error, and if neither the object ignore
         * flag nor the $tempIgnore flag is set, throw a DBQueryError.
         *
-        * @param $error String
-        * @param $errno Integer
-        * @param $sql String
-        * @param $fname String
-        * @param $tempIgnore Boolean
+        * @param string $error
+        * @param int $errno
+        * @param string $sql
+        * @param string $fname
+        * @param bool $tempIgnore
         * @throws DBQueryError
         */
        public function reportQueryError( $error, $errno, $sql, $fname, $tempIgnore = false ) {
@@ -1121,21 +1135,22 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * & = filename; reads the file and inserts as a blob
         *     (we don't use this though...)
         *
-        * @param $sql string
-        * @param $func string
+        * @param string $sql
+        * @param string $func
         *
         * @return array
         */
        protected function prepare( $sql, $func = 'DatabaseBase::prepare' ) {
                /* MySQL doesn't support prepared statements (yet), so just
-                  pack up the query for reference. We'll manually replace
-                  the bits later. */
+                * pack up the query for reference. We'll manually replace
+                * the bits later.
+                */
                return array( 'query' => $sql, 'func' => $func );
        }
 
        /**
         * Free a prepared query, generated by prepare().
-        * @param $prepared
+        * @param string $prepared
         */
        protected function freePrepared( $prepared ) {
                /* No-op by default */
@@ -1144,7 +1159,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        /**
         * Execute a prepared query with the various arguments
         * @param string $prepared the prepared sql
-        * @param $args Mixed: Either an array here, or put scalars as varargs
+        * @param mixed $args Either an array here, or put scalars as varargs
         *
         * @return ResultWrapper
         */
@@ -1163,9 +1178,9 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        /**
         * For faking prepared SQL statements on DBs that don't support it directly.
         *
-        * @param string $preparedQuery a 'preparable' SQL statement
-        * @param array $args of arguments to fill it with
-        * @return string executable SQL
+        * @param string $preparedQuery A 'preparable' SQL statement
+        * @param array $args of Arguments to fill it with
+        * @return string Executable SQL
         */
        public function fillPrepared( $preparedQuery, $args ) {
                reset( $args );
@@ -1180,9 +1195,9 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * The arguments should be in $this->preparedArgs and must not be touched
         * while we're doing this.
         *
-        * @param $matches Array
+        * @param array $matches
         * @throws DBUnexpectedError
-        * @return String
+        * @return string
         */
        protected function fillPreparedArg( $matches ) {
                switch ( $matches[1] ) {
@@ -1220,7 +1235,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * necessary to call this, just use unset() or let the variable holding
         * the result object go out of scope.
         *
-        * @param $res Mixed: A SQL result
+        * @param mixed $res A SQL result
         */
        public function freeResult( $res ) {
        }
@@ -1270,9 +1285,9 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * Returns an optional USE INDEX clause to go after the table, and a
         * string to go at the end of the query.
         *
-        * @param array $options associative array of options to be turned into
-        *              an SQL query, valid keys are listed in the function.
-        * @return Array
+        * @param array $options Associative array of options to be turned into
+        *   an SQL query, valid keys are listed in the function.
+        * @return array
         * @see DatabaseBase::select()
         */
        public function makeSelectOptions( $options ) {
@@ -1354,7 +1369,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        /**
         * Returns an optional GROUP BY with an optional HAVING
         *
-        * @param array $options associative array of options
+        * @param array $options Associative array of options
         * @return string
         * @see DatabaseBase::select()
         * @since 1.21
@@ -1380,7 +1395,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        /**
         * Returns an optional ORDER BY
         *
-        * @param array $options associative array of options
+        * @param array $options Associative array of options
         * @return string
         * @see DatabaseBase::select()
         * @since 1.21
@@ -1406,9 +1421,9 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * @param string|array $conds Conditions
         * @param string $fname Caller function name
         * @param array $options Query options
-        * @param $join_conds Array Join conditions
+        * @param array $join_conds Join conditions
         *
-        * @param $table string|array
+        * @param string|array $table
         *
         * May be either an array of table names, or a single string holding a table
         * name. If an array is given, table aliases can be specified, for example:
@@ -1423,7 +1438,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * added, and various other table name mappings to be performed.
         *
         *
-        * @param $vars string|array
+        * @param string|array $vars
         *
         * May be either a field name or an array of field names. The field names
         * can be complete fragments of SQL, for direct inclusion into the SELECT
@@ -1437,7 +1452,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * DBMS-independent.
         *
         *
-        * @param $conds string|array
+        * @param string|array $conds
         *
         * May be either a string containing a single condition, or an array of
         * conditions. If an array is given, the conditions constructed from each
@@ -1462,7 +1477,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         *    - DatabaseBase::conditional()
         *
         *
-        * @param $options string|array
+        * @param string|array $options
         *
         * Optional: Array of query options. Boolean options are specified by
         * including them in the array as a string value with a numeric key, for
@@ -1518,7 +1533,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         *    - SQL_NO_CACHE
         *
         *
-        * @param $join_conds string|array
+        * @param string|array $join_conds
         *
         * Optional associative array of table-specific join conditions. In the
         * most common case, this is unnecessary, since the join condition can be
@@ -1531,7 +1546,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         *
         *    array( 'page' => array( 'LEFT JOIN', 'page_latest=rev_id' ) )
         *
-        * @return ResultWrapper. If the query returned no rows, a ResultWrapper
+        * @return ResultWrapper|bool If the query returned no rows, a ResultWrapper
         *   with no rows in it will be returned. If there was a query error, a
         *   DBQueryError exception will be thrown, except if the "ignore errors"
         *   option was set, in which case false will be returned.
@@ -1554,7 +1569,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * @param string|array $conds Conditions
         * @param string $fname Caller function name
         * @param string|array $options Query options
-        * @param $join_conds string|array Join conditions
+        * @param string|array $join_conds Join conditions
         *
         * @return string SQL query string.
         * @see DatabaseBase::select()
@@ -1620,7 +1635,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * @param array $conds Conditions
         * @param string $fname Caller function name
         * @param string|array $options Query options
-        * @param $join_conds array|string Join conditions
+        * @param array|string $join_conds Join conditions
         *
         * @return stdClass|bool
         */
@@ -1657,12 +1672,12 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         *
         * Takes the same arguments as DatabaseBase::select().
         *
-        * @param string $table table name
-        * @param array|string $vars : unused
-        * @param array|string $conds : filters on the table
-        * @param string $fname function name for profiling
-        * @param array $options options for select
-        * @return Integer: row count
+        * @param string $table Table name
+        * @param string $vars Unused
+        * @param array|string $conds Filters on the table
+        * @param string $fname Function name for profiling
+        * @param array $options Options for select
+        * @return int Row count
         */
        public function estimateRowCount( $table, $vars = '*', $conds = '',
                $fname = __METHOD__, $options = array()
@@ -1710,10 +1725,10 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        /**
         * Determines whether a field exists in a table
         *
-        * @param string $table table name
-        * @param string $field filed to check on that table
-        * @param string $fname calling function name (optional)
-        * @return Boolean: whether $table has filed $field
+        * @param string $table Table name
+        * @param string $field Filed to check on that table
+        * @param string $fname Calling function name (optional)
+        * @return bool Whether $table has filed $field
         */
        public function fieldExists( $table, $field, $fname = __METHOD__ ) {
                $info = $this->fieldInfo( $table, $field );
@@ -1726,10 +1741,9 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * Usually throws a DBQueryError on failure
         * If errors are explicitly ignored, returns NULL on failure
         *
-        * @param $table
-        * @param $index
-        * @param $fname string
-        *
+        * @param string $table
+        * @param string $index
+        * @param string $fname
         * @return bool|null
         */
        public function indexExists( $table, $index, $fname = __METHOD__ ) {
@@ -1748,9 +1762,8 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        /**
         * Query whether a given table exists
         *
-        * @param $table string
-        * @param $fname string
-        *
+        * @param string $table
+        * @param string $fname
         * @return bool
         */
        public function tableExists( $table, $fname = __METHOD__ ) {
@@ -1765,8 +1778,8 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        /**
         * Determines if a given index is unique
         *
-        * @param $table string
-        * @param $index string
+        * @param string $table
+        * @param string $index
         *
         * @return bool
         */
@@ -1783,7 +1796,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        /**
         * Helper for DatabaseBase::insert().
         *
-        * @param $options array
+        * @param array $options
         * @return string
         */
        protected function makeInsertOptions( $options ) {
@@ -1815,10 +1828,10 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         *     possible to determine how many rows were successfully inserted using
         *     DatabaseBase::affectedRows().
         *
-        * @param $table   String Table name. This will be passed through
-        *                 DatabaseBase::tableName().
-        * @param $a       Array of rows to insert
-        * @param $fname   String Calling function name (use __METHOD__) for logs/profiling
+        * @param string $table Table name. This will be passed through
+        *   DatabaseBase::tableName().
+        * @param array $a Array of rows to insert
+        * @param string $fname Calling function name (use __METHOD__) for logs/profiling
         * @param array $options of options
         *
         * @return bool
@@ -1902,25 +1915,20 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        /**
         * UPDATE wrapper. Takes a condition array and a SET array.
         *
-        * @param $table  String name of the table to UPDATE. This will be passed through
-        *                DatabaseBase::tableName().
-        *
+        * @param string $table Name of the table to UPDATE. This will be passed through
+        *   DatabaseBase::tableName().
         * @param array $values An array of values to SET. For each array element,
-        *                the key gives the field name, and the value gives the data
-        *                to set that field to. The data will be quoted by
-        *                DatabaseBase::addQuotes().
-        *
-        * @param $conds  Array:  An array of conditions (WHERE). See
-        *                DatabaseBase::select() for the details of the format of
-        *                condition arrays. Use '*' to update all rows.
-        *
-        * @param $fname  String: The function name of the caller (from __METHOD__),
-        *                for logging and profiling.
-        *
+        *   the key gives the field name, and the value gives the data to set
+        *   that field to. The data will be quoted by DatabaseBase::addQuotes().
+        * @param array $conds An array of conditions (WHERE). See
+        *   DatabaseBase::select() for the details of the format of condition
+        *   arrays. Use '*' to update all rows.
+        * @param string $fname The function name of the caller (from __METHOD__),
+        *   for logging and profiling.
         * @param array $options An array of UPDATE options, can be:
-        *                   - IGNORE: Ignore unique key conflicts
-        *                   - LOW_PRIORITY: MySQL-specific, see MySQL manual.
-        * @return Boolean
+        *   - IGNORE: Ignore unique key conflicts
+        *   - LOW_PRIORITY: MySQL-specific, see MySQL manual.
+        * @return bool
         */
        function update( $table, $values, $conds, $fname = __METHOD__, $options = array() ) {
                $table = $this->tableName( $table );
@@ -1936,15 +1944,15 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
 
        /**
         * Makes an encoded list of strings from an array
-        * @param array $a containing the data
-        * @param int $mode Constant
-        *      - LIST_COMMA:          comma separated, no field names
-        *      - LIST_AND:            ANDed WHERE clause (without the WHERE). See
-        *        the documentation for $conds in DatabaseBase::select().
-        *      - LIST_OR:             ORed WHERE clause (without the WHERE)
-        *      - LIST_SET:            comma separated with field names, like a SET clause
-        *      - LIST_NAMES:          comma separated field names
         *
+        * @param array $a Containing the data
+        * @param int $mode Constant
+        *    - LIST_COMMA: Comma separated, no field names
+        *    - LIST_AND:   ANDed WHERE clause (without the WHERE). See the
+        *      documentation for $conds in DatabaseBase::select().
+        *    - LIST_OR:    ORed WHERE clause (without the WHERE)
+        *    - LIST_SET:   Comma separated with field names, like a SET clause
+        *    - LIST_NAMES: Comma separated field names
         * @throws MWException|DBUnexpectedError
         * @return string
         */
@@ -2008,9 +2016,9 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * The keys on each level may be either integers or strings.
         *
         * @param array $data organized as 2-d
-        *              array(baseKeyVal => array(subKeyVal => [ignored], ...), ...)
-        * @param string $baseKey field name to match the base-level keys to (eg 'pl_namespace')
-        * @param string $subKey field name to match the sub-level keys to (eg 'pl_title')
+        *    array(baseKeyVal => array(subKeyVal => [ignored], ...), ...)
+        * @param string $baseKey Field name to match the base-level keys to (eg 'pl_namespace')
+        * @param string $subKey Field name to match the sub-level keys to (eg 'pl_title')
         * @return Mixed: string SQL fragment, or false if no items in array.
         */
        public function makeWhereFrom2d( $data, $baseKey, $subKey ) {
@@ -2036,7 +2044,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * Return aggregated value alias
         *
         * @param $valuedata
-        * @param $valuename string
+        * @param string $valuename
         *
         * @return string
         */
@@ -2045,7 +2053,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        }
 
        /**
-        * @param $field
+        * @param string $field
         * @return string
         */
        public function bitNot( $field ) {
@@ -2053,8 +2061,8 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        }
 
        /**
-        * @param $fieldLeft
-        * @param $fieldRight
+        * @param string $fieldLeft
+        * @param string $fieldRight
         * @return string
         */
        public function bitAnd( $fieldLeft, $fieldRight ) {
@@ -2062,8 +2070,8 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        }
 
        /**
-        * @param  $fieldLeft
-        * @param  $fieldRight
+        * @param string $fieldLeft
+        * @param string $fieldRight
         * @return string
         */
        public function bitOr( $fieldLeft, $fieldRight ) {
@@ -2072,8 +2080,9 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
 
        /**
         * Build a concatenation list to feed into a SQL query
-        * @param array $stringList list of raw SQL expressions; caller is responsible for any quoting
-        * @return String
+        * @param array $stringList List of raw SQL expressions; caller is
+        *   responsible for any quoting
+        * @return string
         */
        public function buildConcat( $stringList ) {
                return 'CONCAT(' . implode( ',', $stringList ) . ')';
@@ -2092,7 +2101,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * @param string $field Field name
         * @param string|array $conds Conditions
         * @param string|array $join_conds Join conditions
-        * @return String SQL text
+        * @return string SQL text
         * @since 1.23
         */
        public function buildGroupConcatField(
@@ -2113,7 +2122,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * @return bool Success or failure
         */
        public function selectDB( $db ) {
-               # Stub.  Shouldn't cause serious problems if it's not overridden, but
+               # Stub. Shouldn't cause serious problems if it's not overridden, but
                # if your database engine supports a concept similar to MySQL's
                # databases you may as well.
                $this->mDBname = $db;
@@ -2145,12 +2154,12 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * themselves. Pass the canonical name to such functions. This is only needed
         * when calling query() directly.
         *
-        * @param string $name database table name
+        * @param string $name Database table name
         * @param string $format One of:
         *   quoted - Automatically pass the table name through addIdentifierQuotes()
         *            so that it can be used in a query.
         *   raw - Do not add identifier quotes to the table name
-        * @return String: full database name
+        * @return string Full database name
         */
        public function tableName( $name, $format = 'quoted' ) {
                global $wgSharedDB, $wgSharedPrefix, $wgSharedTables;
@@ -2276,8 +2285,8 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        /**
         * Gets an array of aliased table names
         *
-        * @param $tables array( [alias] => table )
-        * @return array of strings, see tableNameWithAlias()
+        * @param array $tables array( [alias] => table )
+        * @return string[] See tableNameWithAlias()
         */
        public function tableNamesWithAlias( $tables ) {
                $retval = array();
@@ -2310,8 +2319,8 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        /**
         * Gets an array of aliased field names
         *
-        * @param $fields array( [alias] => field )
-        * @return array of strings, see fieldNameWithAlias()
+        * @param array $fields array( [alias] => field )
+        * @return string[] See fieldNameWithAlias()
         */
        public function fieldNamesWithAlias( $fields ) {
                $retval = array();
@@ -2330,8 +2339,8 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * which might have a JOIN and/or USE INDEX clause
         *
         * @param array $tables ( [alias] => table )
-        * @param $use_index array Same as for select()
-        * @param $join_conds array Same as for select()
+        * @param array $use_index Same as for select()
+        * @param array $join_conds Same as for select()
         * @return string
         */
        protected function tableNamesWithUseIndexOrJOIN(
@@ -2389,8 +2398,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        /**
         * Get the name of an index in a given table
         *
-        * @param $index
-        *
+        * @param string $index
         * @return string
         */
        protected function indexName( $index ) {
@@ -2411,8 +2419,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        /**
         * Adds quotes and backslashes.
         *
-        * @param $s string
-        *
+        * @param string $s
         * @return string
         */
        public function addQuotes( $s ) {
@@ -2433,8 +2440,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * Since MySQL is the odd one out here the double quotes are our generic
         * and we implement backticks in DatabaseMysql.
         *
-        * @param $s string
-        *
+        * @param string $s
         * @return string
         */
        public function addIdentifierQuotes( $s ) {
@@ -2445,16 +2451,15 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * Returns if the given identifier looks quoted or not according to
         * the database convention for quoting identifiers .
         *
-        * @param $name string
-        *
-        * @return boolean
+        * @param string $name
+        * @return bool
         */
        public function isQuotedIdentifier( $name ) {
                return $name[0] == '"' && substr( $name, -1, 1 ) == '"';
        }
 
        /**
-        * @param $s string
+        * @param string $s
         * @return string
         */
        protected function escapeLikeInternal( $s ) {
@@ -2479,7 +2484,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         *   $query .= $dbr->buildLike( $pattern );
         *
         * @since 1.16
-        * @return String: fully built LIKE statement
+        * @return string Fully built LIKE statement
         */
        public function buildLike() {
                $params = func_get_args();
@@ -2527,21 +2532,21 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * Any implementation of this function should *not* involve reusing
         * sequence numbers created for rolled-back transactions.
         * See http://bugs.mysql.com/bug.php?id=30767 for details.
-        * @param $seqName string
-        * @return null
+        * @param string $seqName
+        * @return null|int
         */
        public function nextSequenceValue( $seqName ) {
                return null;
        }
 
        /**
-        * USE INDEX clause.  Unlikely to be useful for anything but MySQL.  This
+        * USE INDEX clause. Unlikely to be useful for anything but MySQL. This
         * is only needed because a) MySQL must be as efficient as possible due to
         * its use on Wikipedia, and b) MySQL 4.0 is kind of dumb sometimes about
-        * which index to pick.  Anyway, other databases might have different
-        * indexes on a given table.  So don't bother overriding this unless you're
+        * which index to pick. Anyway, other databases might have different
+        * indexes on a given table. So don't bother overriding this unless you're
         * MySQL.
-        * @param $index
+        * @param string $index
         * @return string
         */
        public function useIndexClause( $index ) {
@@ -2564,10 +2569,10 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * errors which wouldn't have occurred in MySQL.
         *
         * @param string $table The table to replace the row(s) in.
+        * @param array $uniqueIndexes Is an array of indexes. Each element may be either
+        *    a field name or an array of field names
         * @param array $rows Can be either a single row to insert, or multiple rows,
         *    in the same format as for DatabaseBase::insert()
-        * @param array $uniqueIndexes is an array of indexes. Each element may be either
-        *    a field name or an array of field names
         * @param string $fname Calling function name (use __METHOD__) for logs/profiling
         */
        public function replace( $table, $uniqueIndexes, $rows, $fname = __METHOD__ ) {
@@ -2622,7 +2627,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * statement.
         *
         * @param string $table Table name
-        * @param array $rows Rows to insert
+        * @param array|string $rows Row(s) to insert
         * @param string $fname Caller function name
         *
         * @return ResultWrapper
@@ -2673,20 +2678,20 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * Usually throws a DBQueryError on failure. If errors are explicitly ignored,
         * returns success.
         *
+        * @since 1.22
+        *
         * @param string $table Table name. This will be passed through DatabaseBase::tableName().
         * @param array $rows A single row or list of rows to insert
         * @param array $uniqueIndexes List of single field names or field name tuples
-        * @param array $set An array of values to SET. For each array element,
-        *                the key gives the field name, and the value gives the data
-        *                to set that field to. The data will be quoted by
-        *                DatabaseBase::addQuotes().
+        * @param array $set An array of values to SET. For each array element, the
+        *   key gives the field name, and the value gives the data to set that
+        *   field to. The data will be quoted by DatabaseBase::addQuotes().
         * @param string $fname Calling function name (use __METHOD__) for logs/profiling
-        *
+        * @throws Exception
         * @return bool
-        * @since 1.22
         */
-       public function upsert(
-               $table, array $rows, array $uniqueIndexes, array $set, $fname = __METHOD__
+       public function upsert( $table, array $rows, array $uniqueIndexes, array $set,
+               $fname = __METHOD__
        ) {
                if ( !count( $rows ) ) {
                        return true; // nothing to do
@@ -2747,14 +2752,13 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         *
         * DO NOT put the join condition in $conds.
         *
-        * @param $delTable   String: The table to delete from.
-        * @param $joinTable  String: The other table.
-        * @param $delVar     String: The variable to join on, in the first table.
-        * @param $joinVar    String: The variable to join on, in the second table.
-        * @param $conds      Array: Condition array of field names mapped to variables,
-        *                    ANDed together in the WHERE clause
-        * @param $fname      String: Calling function name (use __METHOD__) for
-        *                    logs/profiling
+        * @param string $delTable The table to delete from.
+        * @param string $joinTable The other table.
+        * @param string $delVar The variable to join on, in the first table.
+        * @param string$joinVar The variable to join on, in the second table.
+        * @param array $conds Condition array of field names mapped to variables,
+        *   ANDed together in the WHERE clause
+        * @param string $fname Calling function name (use __METHOD__) for logs/profiling
         * @throws DBUnexpectedError
         */
        public function deleteJoin( $delTable, $joinTable, $delVar, $joinVar, $conds,
@@ -2779,9 +2783,8 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        /**
         * Returns the size of a text field, or -1 for "unlimited"
         *
-        * @param $table string
-        * @param $field string
-        *
+        * @param string $table
+        * @param string $field
         * @return int
         */
        public function textFieldSize( $table, $field ) {
@@ -2803,7 +2806,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
 
        /**
         * A string to insert into queries to show that they're low-priority, like
-        * MySQL's LOW_PRIORITY.  If no such feature exists, return an empty
+        * MySQL's LOW_PRIORITY. If no such feature exists, return an empty
         * string and nothing bad should happen.
         *
         * @return string Returns the text of the low priority option if it is
@@ -2817,10 +2820,9 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * DELETE query wrapper.
         *
         * @param array $table Table name
-        * @param string|array $conds of conditions. See $conds in DatabaseBase::select() for
-        *               the format. Use $conds == "*" to delete all rows
+        * @param string|array $conds of conditions. See $conds in DatabaseBase::select()
+        *   for the format. Use $conds == "*" to delete all rows
         * @param string $fname name of the calling function
-        *
         * @throws DBUnexpectedError
         * @return bool|ResultWrapper
         */
@@ -2850,7 +2852,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * @param string|array $srcTable May be either a table name, or an array of table names
         *    to include in a join.
         *
-        * @param array $varMap must be an associative array of the form
+        * @param array $varMap Must be an associative array of the form
         *    array( 'dest1' => 'source1', ...). Source items may be literals
         *    rather than field names, but strings should be quoted with
         *    DatabaseBase::addQuotes()
@@ -2909,22 +2911,21 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        }
 
        /**
-        * Construct a LIMIT query with optional offset.  This is used for query
-        * pages.  The SQL should be adjusted so that only the first $limit rows
-        * are returned.  If $offset is provided as well, then the first $offset
+        * Construct a LIMIT query with optional offset. This is used for query
+        * pages. The SQL should be adjusted so that only the first $limit rows
+        * are returned. If $offset is provided as well, then the first $offset
         * rows should be discarded, and the next $limit rows should be returned.
         * If the result of the query is not ordered, then the rows to be returned
         * are theoretically arbitrary.
         *
         * $sql is expected to be a SELECT, if that makes a difference.
         *
-        * The version provided by default works in MySQL and SQLite.  It will very
+        * The version provided by default works in MySQL and SQLite. It will very
         * likely need to be overridden for most other DBMSes.
         *
         * @param string $sql SQL query we will append the limit too
-        * @param $limit Integer the SQL limit
-        * @param $offset Integer|bool the SQL offset (default false)
-        *
+        * @param int $limit The SQL limit
+        * @param int|bool $offset The SQL offset (default false)
         * @throws DBUnexpectedError
         * @return string
         */
@@ -2952,8 +2953,8 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * This is used for providing overload point for other DB abstractions
         * not compatible with the MySQL syntax.
         * @param array $sqls SQL statements to combine
-        * @param $all Boolean: use UNION ALL
-        * @return String: SQL fragment
+        * @param bool $all Use UNION ALL
+        * @return string SQL fragment
         */
        public function unionQueries( $sqls, $all ) {
                $glue = $all ? ') UNION ALL (' : ') UNION (';
@@ -2962,13 +2963,13 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        }
 
        /**
-        * Returns an SQL expression for a simple conditional.  This doesn't need
+        * Returns an SQL expression for a simple conditional. This doesn't need
         * to be overridden unless CASE isn't supported in your DBMS.
         *
         * @param string|array $cond SQL expression which will result in a boolean value
         * @param string $trueVal SQL expression to return if true
         * @param string $falseVal SQL expression to return if false
-        * @return String: SQL fragment
+        * @return string SQL fragment
         */
        public function conditional( $cond, $trueVal, $falseVal ) {
                if ( is_array( $cond ) ) {
@@ -2982,9 +2983,9 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * Returns a comand for str_replace function in SQL query.
         * Uses REPLACE() in MySQL
         *
-        * @param string $orig column to modify
-        * @param string $old column to seek
-        * @param string $new column to replace with
+        * @param string $orig Column to modify
+        * @param string $old Column to seek
+        * @param string $new Column to replace with
         *
         * @return string
         */
@@ -3107,41 +3108,14 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        /**
         * Wait for the slave to catch up to a given master position.
         *
-        * @param $pos DBMasterPos object
-        * @param $timeout Integer: the maximum number of seconds to wait for
+        * @param DBMasterPos $pos
+        * @param int $timeout The maximum number of seconds to wait for
         *   synchronisation
-        *
-        * @return integer: zero if the slave was past that position already,
+        * @return int Zzero if the slave was past that position already,
         *   greater than zero if we waited for some period of time, less than
         *   zero if we timed out.
         */
        public function masterPosWait( DBMasterPos $pos, $timeout ) {
-               wfProfileIn( __METHOD__ );
-
-               if ( !is_null( $this->mFakeSlaveLag ) ) {
-                       $wait = intval( ( $pos->pos - microtime( true ) + $this->mFakeSlaveLag ) * 1e6 );
-
-                       if ( $wait > $timeout * 1e6 ) {
-                               wfDebug( "Fake slave timed out waiting for $pos ($wait us)\n" );
-                               wfProfileOut( __METHOD__ );
-
-                               return -1;
-                       } elseif ( $wait > 0 ) {
-                               wfDebug( "Fake slave waiting $wait us\n" );
-                               usleep( $wait );
-                               wfProfileOut( __METHOD__ );
-
-                               return 1;
-                       } else {
-                               wfDebug( "Fake slave up to date ($wait us)\n" );
-                               wfProfileOut( __METHOD__ );
-
-                               return 0;
-                       }
-               }
-
-               wfProfileOut( __METHOD__ );
-
                # Real waits are implemented in the subclass.
                return 0;
        }
@@ -3149,31 +3123,21 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        /**
         * Get the replication position of this slave
         *
-        * @return DBMasterPos, or false if this is not a slave.
+        * @return DBMasterPos|bool False if this is not a slave.
         */
        public function getSlavePos() {
-               if ( !is_null( $this->mFakeSlaveLag ) ) {
-                       $pos = new MySQLMasterPos( 'fake', microtime( true ) - $this->mFakeSlaveLag );
-                       wfDebug( __METHOD__ . ": fake slave pos = $pos\n" );
-
-                       return $pos;
-               } else {
-                       # Stub
-                       return false;
-               }
+               # Stub
+               return false;
        }
 
        /**
         * Get the position of this master
         *
-        * @return DBMasterPos, or false if this is not a master
+        * @return DBMasterPos|bool False if this is not a master
         */
        public function getMasterPos() {
-               if ( $this->mFakeMaster ) {
-                       return new MySQLMasterPos( 'fake', microtime( true ) );
-               } else {
-                       return false;
-               }
+               # Stub
+               return false;
        }
 
        /**
@@ -3340,7 +3304,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * will cause a warning, unless the current transaction was started
         * automatically because of the DBO_TRX flag.
         *
-        * @param $fname string
+        * @param string $fname
         * @throws DBError
         */
        final public function begin( $fname = __METHOD__ ) {
@@ -3392,7 +3356,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * Issues the BEGIN command to the database server.
         *
         * @see DatabaseBase::begin()
-        * @param type $fname
+        * @param string $fname
         */
        protected function doBegin( $fname ) {
                $this->query( 'BEGIN', $fname );
@@ -3405,12 +3369,13 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         *
         * Nesting of transactions is not supported.
         *
-        * @param $fname string
+        * @param string $fname
         * @param string $flush Flush flag, set to 'flush' to disable warnings about
         *   explicitly committing implicit transactions, or calling commit when no
         *   transaction is in progress. This will silently break any ongoing
         *   explicit transaction. Only set the flush flag if you are sure that it
         *   is safe to ignore these warnings in your context.
+        * @throws DBUnexpectedError
         */
        final public function commit( $fname = __METHOD__, $flush = '' ) {
                if ( !$this->mTrxAtomicLevels->isEmpty() ) {
@@ -3447,7 +3412,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * Issues the COMMIT command to the database server.
         *
         * @see DatabaseBase::commit()
-        * @param type $fname
+        * @param string $fname
         */
        protected function doCommit( $fname ) {
                if ( $this->mTrxLevel ) {
@@ -3462,7 +3427,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         *
         * No-op on non-transactional databases.
         *
-        * @param $fname string
+        * @param string $fname
         */
        final public function rollback( $fname = __METHOD__ ) {
                if ( !$this->mTrxLevel ) {
@@ -3481,7 +3446,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * Issues the ROLLBACK command to the database server.
         *
         * @see DatabaseBase::rollback()
-        * @param type $fname
+        * @param string $fname
         */
        protected function doRollback( $fname ) {
                if ( $this->mTrxLevel ) {
@@ -3498,12 +3463,12 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * The table names passed to this function shall not be quoted (this
         * function calls addIdentifierQuotes when needed).
         *
-        * @param string $oldName name of table whose structure should be copied
-        * @param string $newName name of table to be created
-        * @param $temporary Boolean: whether the new table should be temporary
-        * @param string $fname calling function name
+        * @param string $oldName Name of table whose structure should be copied
+        * @param string $newName Name of table to be created
+        * @param bool $temporary Whether the new table should be temporary
+        * @param string $fname Calling function name
         * @throws MWException
-        * @return Boolean: true if operation was successful
+        * @return bool True if operation was successful
         */
        public function duplicateTableStructure( $oldName, $newName, $temporary = false,
                $fname = __METHOD__
@@ -3516,7 +3481,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * List all tables on the database
         *
         * @param string $prefix Only show tables with this prefix, e.g. mw_
-        * @param string $fname calling function name
+        * @param string $fname Calling function name
         * @throws MWException
         */
        function listTables( $prefix = null, $fname = __METHOD__ ) {
@@ -3549,7 +3514,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        /**
         * Differentiates between a TABLE and a VIEW
         *
-        * @param $name string: Name of the database-structure to test.
+        * @param string $name Name of the database-structure to test.
         * @throws MWException
         * @since 1.22
         */
@@ -3564,7 +3529,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * The result is unquoted, and needs to be passed through addQuotes()
         * before it can be included in raw SQL.
         *
-        * @param $ts string|int
+        * @param string|int $ts
         *
         * @return string
         */
@@ -3581,7 +3546,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * The result is unquoted, and needs to be passed through addQuotes()
         * before it can be included in raw SQL.
         *
-        * @param $ts string|int
+        * @param string|int $ts
         *
         * @return string
         */
@@ -3604,8 +3569,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * callers, so this is unnecessary in external code. For compatibility with
         * old code, ResultWrapper objects are passed through unaltered.
         *
-        * @param $result bool|ResultWrapper
-        *
+        * @param bool|ResultWrapper|resource $result
         * @return bool|ResultWrapper
         */
        public function resultObject( $result ) {
@@ -3627,7 +3591,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * @return bool Success or failure
         */
        public function ping() {
-               # Stub.  Not essential to override.
+               # Stub. Not essential to override.
                return true;
        }
 
@@ -3641,7 +3605,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * @return int Database replication lag in seconds
         */
        public function getLag() {
-               return intval( $this->mFakeSlaveLag );
+               return 0;
        }
 
        /**
@@ -3658,7 +3622,8 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * don't allow simple quoted strings to be inserted. To insert into such
         * a field, pass the data through this function before passing it to
         * DatabaseBase::insert().
-        * @param $b string
+        *
+        * @param string $b
         * @return string
         */
        public function encodeBlob( $b ) {
@@ -3669,7 +3634,8 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * Some DBMSs return a special placeholder object representing blob fields
         * in result objects. Pass the object through this function to return the
         * original string.
-        * @param $b string
+        *
+        * @param string $b
         * @return string
         */
        public function decodeBlob( $b ) {
@@ -3683,7 +3649,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         *                     full-wiki dumps, where a single query reads out over
         *                     hours or days.
         *
-        * @param $options Array
+        * @param array $options
         * @return void
         */
        public function setSessionOptions( array $options ) {
@@ -3700,9 +3666,8 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * @param bool|callable $resultCallback Optional function called for each MySQL result
         * @param bool|string $fname Calling function name or false if name should be
         *   generated dynamically using $filename
-        * @param bool|callable $inputCallback Callback: Optional function called
-        *   for each complete line sent
-        * @throws MWException
+        * @param bool|callable $inputCallback Optional function called for each
+        *   complete line sent
         * @throws Exception|MWException
         * @return bool|string
         */
@@ -3739,7 +3704,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * it fails back to MySQL if no DB-specific patch can be found
         *
         * @param string $patch The name of the patch, like patch-something.sql
-        * @return String Full path to patch file
+        * @return string Full path to patch file
         */
        public function patchPath( $patch ) {
                global $IP;
@@ -3757,7 +3722,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * ones in $GLOBALS. If an array is set here, $GLOBALS will not be used at
         * all. If it's set to false, $GLOBALS will be used.
         *
-        * @param bool|array $vars mapping variable name to value.
+        * @param bool|array $vars Mapping variable name to value.
         */
        public function setSchemaVars( $vars ) {
                $this->mSchemaVars = $vars;
@@ -3769,11 +3734,11 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * Returns true on success, error string or exception on failure (depending
         * on object's error ignore settings).
         *
-        * @param $fp Resource: File handle
-        * @param $lineCallback Callback: Optional function called before reading each query
-        * @param $resultCallback Callback: Optional function called for each MySQL result
+        * @param resource $fp File handle
+        * @param bool|callable $lineCallback Optional function called before reading each query
+        * @param bool|callable $resultCallback Optional function called for each MySQL result
         * @param string $fname Calling function name
-        * @param $inputCallback Callback: Optional function called for each complete query sent
+        * @param bool|callable $inputCallback Optional function called for each complete query sent
         * @return bool|string
         */
        public function sourceStream( $fp, $lineCallback = false, $resultCallback = false,
@@ -3832,7 +3797,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         *
         * @param string $sql SQL assembled so far
         * @param string $newLine New line about to be added to $sql
-        * @return Bool Whether $newLine contains end of the statement
+        * @return bool Whether $newLine contains end of the statement
         */
        public function streamStatementEnd( &$sql, &$newLine ) {
                if ( $this->delimiter ) {
@@ -3861,7 +3826,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         *   table options its use should be avoided.
         *
         * @param string $ins SQL statement to replace variables in
-        * @return String The new SQL statement with variables replaced
+        * @return string The new SQL statement with variables replaced
         */
        protected function replaceSchemaVars( $ins ) {
                $vars = $this->getSchemaVars();
@@ -3880,8 +3845,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        /**
         * Replace variables in sourced SQL
         *
-        * @param $ins string
-        *
+        * @param string $ins
         * @return string
         */
        protected function replaceVars( $ins ) {
@@ -3927,8 +3891,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        /**
         * Table name callback
         *
-        * @param $matches array
-        *
+        * @param array $matches
         * @return string
         */
        protected function tableNameCallback( $matches ) {
@@ -3938,8 +3901,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        /**
         * Index name callback
         *
-        * @param $matches array
-        *
+        * @param array $matches
         * @return string
         */
        protected function indexNameCallback( $matches ) {
@@ -3949,9 +3911,9 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        /**
         * Check to see if a named lock is available. This is non-blocking.
         *
-        * @param string $lockName name of lock to poll
-        * @param string $method name of method calling us
-        * @return Boolean
+        * @param string $lockName Name of lock to poll
+        * @param string $method Name of method calling us
+        * @return bool
         * @since 1.20
         */
        public function lockIsFree( $lockName, $method ) {
@@ -3964,10 +3926,10 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * Abstracted from Filestore::lock() so child classes can implement for
         * their own needs.
         *
-        * @param string $lockName name of lock to aquire
-        * @param string $method name of method calling us
-        * @param $timeout Integer: timeout
-        * @return Boolean
+        * @param string $lockName Name of lock to aquire
+        * @param string $method Name of method calling us
+        * @param int $timeout
+        * @return bool
         */
        public function lock( $lockName, $method, $timeout = 5 ) {
                return true;
@@ -3990,11 +3952,10 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        /**
         * Lock specific tables
         *
-        * @param array $read of tables to lock for read access
-        * @param array $write of tables to lock for write access
-        * @param string $method name of caller
+        * @param array $read Array of tables to lock for read access
+        * @param array $write Array of tables to lock for write access
+        * @param string $method Name of caller
         * @param bool $lowPriority Whether to indicate writes to be LOW PRIORITY
-        *
         * @return bool
         */
        public function lockTables( $read, $write, $method, $lowPriority = true ) {
@@ -4004,8 +3965,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        /**
         * Unlock specific tables
         *
-        * @param string $method the caller
-        *
+        * @param string $method The caller
         * @return bool
         */
        public function unlockTables( $method ) {
@@ -4014,8 +3974,8 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
 
        /**
         * Delete a table
-        * @param $tableName string
-        * @param $fName string
+        * @param string $tableName
+        * @param string $fName
         * @return bool|ResultWrapper
         * @since 1.18
         */
@@ -4035,7 +3995,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * Get search engine class. All subclasses of this need to implement this
         * if they wish to use searching.
         *
-        * @return String
+        * @return string
         */
        public function getSearchEngine() {
                return 'SearchEngineDummy';
@@ -4046,7 +4006,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * keyword for timestamps in PostgreSQL, and works with CHAR(14) as well
         * because "i" sorts after all numbers.
         *
-        * @return String
+        * @return string
         */
        public function getInfinity() {
                return 'infinity';
@@ -4056,7 +4016,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * Encode an expiry time into the DBMS dependent format
         *
         * @param string $expiry timestamp for expiry, or the 'infinity' string
-        * @return String
+        * @return string
         */
        public function encodeExpiry( $expiry ) {
                return ( $expiry == '' || $expiry == 'infinity' || $expiry == $this->getInfinity() )
@@ -4068,8 +4028,8 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * Decode an expiry time into a DBMS independent format
         *
         * @param string $expiry DB timestamp field value for expiry
-        * @param $format integer: TS_* constant, defaults to TS_MW
-        * @return String
+        * @param int $format TS_* constant, defaults to TS_MW
+        * @return string
         */
        public function decodeExpiry( $expiry, $format = TS_MW ) {
                return ( $expiry == '' || $expiry == $this->getInfinity() )
@@ -4083,7 +4043,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         *
         * This is a MySQL-specific feature.
         *
-        * @param $value Mixed: true for allow, false for deny, or "default" to
+        * @param bool|string $value True for allow, false for deny, or "default" to
         *   restore the initial value
         */
        public function setBigSelects( $value = true ) {
index a314605..b4c7365 100644 (file)
  * @ingroup Database
  */
 class DBError extends MWException {
-       /**
-        * @var DatabaseBase
-        */
+       /** @var DatabaseBase */
        public $db;
 
        /**
         * Construct a database error
-        * @param $db DatabaseBase object which threw the error
+        * @param DatabaseBase $db Object which threw the error
         * @param string $error A simple error message to be used for debugging
         */
        function __construct( DatabaseBase $db = null, $error ) {
@@ -90,8 +88,13 @@ class DBError extends MWException {
  * @ingroup Database
  */
 class DBConnectionError extends DBError {
+       /** @var string Error text */
        public $error;
 
+       /**
+        * @param DatabaseBase $db Object throwing the error
+        * @param string $error Error text
+        */
        function __construct( DatabaseBase $db = null, $error = 'unknown error' ) {
                $msg = 'DB connection error';
 
@@ -114,9 +117,11 @@ class DBConnectionError extends DBError {
        }
 
        /**
-        * @param $key
-        * @param $fallback
-        * @return string
+        * @param string $key
+        * @param string $fallback Unescaped alternative error text in case the
+        *   message cache cannot be used. Can contain parameters as in regular
+        *   messages, that should be passed as additional parameters.
+        * @return string Unprocessed plain error text with parameters replaced
         */
        function msg( $key, $fallback /*[, params...] */ ) {
                global $wgLang;
@@ -141,7 +146,7 @@ class DBConnectionError extends DBError {
        }
 
        /**
-        * @return string
+        * @return string Safe HTML
         */
        function getHTML() {
                global $wgShowDBErrorBacktrace, $wgShowHostnames, $wgShowSQLErrors;
@@ -192,6 +197,11 @@ class DBConnectionError extends DBError {
                }
        }
 
+       /**
+        * Output the exception report using HTML.
+        *
+        * @return void
+        */
        public function reportHTML() {
                global $wgUseFileCache;
 
@@ -307,11 +317,11 @@ class DBQueryError extends DBError {
        public $error, $errno, $sql, $fname;
 
        /**
-        * @param $db DatabaseBase
-        * @param $error string
-        * @param $errno int|string
-        * @param $sql string
-        * @param $fname string
+        * @param DatabaseBase $db
+        * @param string $error
+        * @param int|string $errno
+        * @param string $sql
+        * @param string $fname
         */
        function __construct( DatabaseBase $db, $error, $errno, $sql, $fname ) {
                $message = "A database error has occurred. Did you forget to run " .
@@ -329,7 +339,7 @@ class DBQueryError extends DBError {
        }
 
        /**
-        * @return boolean
+        * @return bool
         */
        function isLoggable() {
                // Don't send to the exception log, already in dberror log
@@ -391,7 +401,7 @@ class DBQueryError extends DBError {
         * sites using this option probably don't care much about "security by obscurity". Of course,
         * if $wgShowSQLErrors is true, the SQL query *is* shown.
         *
-        * @return array: Keys are message keys; values are arrays of arguments for Html::element().
+        * @return array Keys are message keys; values are arrays of arguments for Html::element().
         *   Array will be empty if users are not allowed to see any of these details at all.
         */
        protected function getTechnicalDetails() {
@@ -416,7 +426,7 @@ class DBQueryError extends DBError {
 
        /**
         * @param string $key Message key
-        * @return string: English message text
+        * @return string English message text
         */
        private function getFallbackMessage( $key ) {
                $messages = array(
index 3a89cd5..9636da5 100644 (file)
@@ -159,9 +159,13 @@ class DatabaseMssql extends DatabaseBase {
                return sqlsrv_close( $this->mConn );
        }
 
+       /**
+        * @param string $sql
+        * @return bool|MssqlResult
+        * @throws DBUnexpectedError
+        */
        protected function doQuery( $sql ) {
                wfDebug( "SQL: [$sql]\n" );
-               $this->offset = 0;
 
                // several extensions seem to think that all databases support limits
                // via LIMIT N after the WHERE clause well, MSSQL uses SELECT TOP N,
@@ -213,6 +217,9 @@ class DatabaseMssql extends DatabaseBase {
                return $res;
        }
 
+       /**
+        * @param mixed|ResultWrapper $res
+        */
        function freeResult( $res ) {
                if ( $res instanceof ResultWrapper ) {
                        $res = $res->result;
@@ -220,6 +227,10 @@ class DatabaseMssql extends DatabaseBase {
                $res->free();
        }
 
+       /**
+        * @param ResultWrapper|stdClass $res
+        * @return stdClass
+        */
        function fetchObject( $res ) {
                if ( $res instanceof ResultWrapper ) {
                        $res = $res->result;
@@ -229,6 +240,9 @@ class DatabaseMssql extends DatabaseBase {
                return $row;
        }
 
+       /**
+        * @return string
+        */
        function getErrors() {
                $strRet = '';
                $retErrors = sqlsrv_errors( SQLSRV_ERR_ALL );
@@ -245,6 +259,10 @@ class DatabaseMssql extends DatabaseBase {
                return $strRet;
        }
 
+       /**
+        * @param resource $res
+        * @return Blob
+        */
        function fetchRow( $res ) {
                if ( $res instanceof ResultWrapper ) {
                        $res = $res->result;
@@ -254,6 +272,10 @@ class DatabaseMssql extends DatabaseBase {
                return $row;
        }
 
+       /**
+        * @param mixed $res
+        * @return int
+        */
        function numRows( $res ) {
                if ( $res instanceof ResultWrapper ) {
                        $res = $res->result;
@@ -286,6 +308,11 @@ class DatabaseMssql extends DatabaseBase {
                return $this->mInsertId;
        }
 
+       /**
+        * @param mixed $res
+        * @param int $row
+        * @return bool
+        */
        function dataSeek( $res, $row ) {
                if ( $res instanceof ResultWrapper ) {
                        $res = $res->result;
@@ -318,16 +345,16 @@ class DatabaseMssql extends DatabaseBase {
        /**
         * SELECT wrapper
         *
-        * @param $table   Mixed: array or string, table name(s) (prefix auto-added)
-        * @param $vars    Mixed: array or string, field name(s) to be retrieved
-        * @param $conds   Mixed: array or string, condition(s) for WHERE
-        * @param $fname   String: calling function name (use __METHOD__) for logs/profiling
-        * @param array $options associative array of options (e.g.
+        * @param mixed $table Array or string, table name(s) (prefix auto-added)
+        * @param mixed $vars Array or string, field name(s) to be retrieved
+        * @param mixed $conds Array or string, condition(s) for WHERE
+        * @param string $fname Calling function name (use __METHOD__) for logs/profiling
+        * @param array $options Associative array of options (e.g.
         *   array('GROUP BY' => 'page_title')), see Database::makeSelectOptions
         *   code for list of supported stuff
-        * @param $join_conds Array: Associative array of table join conditions
+        * @param array $join_conds Associative array of table join conditions
         *   (optional) (e.g. array( 'page' => array('LEFT JOIN','page_latest=rev_id') )
-        * @return Mixed: database result resource (feed to Database::fetchObject
+        * @return mixed Database result resource (feed to Database::fetchObject
         *   or whatever), or false on failure
         */
        function select( $table, $vars, $conds = '', $fname = __METHOD__,
@@ -348,15 +375,15 @@ class DatabaseMssql extends DatabaseBase {
        /**
         * SELECT wrapper
         *
-        * @param $table   Mixed:  Array or string, table name(s) (prefix auto-added)
-        * @param $vars    Mixed:  Array or string, field name(s) to be retrieved
-        * @param $conds   Mixed:  Array or string, condition(s) for WHERE
-        * @param $fname   String: Calling function name (use __METHOD__) for logs/profiling
+        * @param mixed $table Array or string, table name(s) (prefix auto-added)
+        * @param mixed $vars Array or string, field name(s) to be retrieved
+        * @param mixed $conds Array or string, condition(s) for WHERE
+        * @param string $fname Calling function name (use __METHOD__) for logs/profiling
         * @param array $options Associative array of options (e.g. array('GROUP BY' => 'page_title')),
-        *                 see Database::makeSelectOptions code for list of supported stuff
-        * @param $join_conds Array: Associative array of table join conditions (optional)
-        *                    (e.g. array( 'page' => array('LEFT JOIN','page_latest=rev_id') )
-        * @return string, the SQL text
+        *   see Database::makeSelectOptions code for list of supported stuff
+        * @param array $join_conds Associative array of table join conditions (optional)
+        *    (e.g. array( 'page' => array('LEFT JOIN','page_latest=rev_id') )
+        * @return string The SQL text
         */
        function selectSQLText( $table, $vars, $conds = '', $fname = __METHOD__,
                $options = array(), $join_conds = array()
@@ -374,6 +401,11 @@ class DatabaseMssql extends DatabaseBase {
         * This is not necessarily an accurate estimate, so use sparingly
         * Returns -1 if count cannot be found
         * Takes same arguments as Database::select()
+        * @param string $table
+        * @param string $vars
+        * @param string $conds
+        * @param string $fname
+        * @param array $options
         * @return int
         */
        function estimateRowCount( $table, $vars = '*', $conds = '',
@@ -397,6 +429,9 @@ class DatabaseMssql extends DatabaseBase {
        /**
         * Returns information about an index
         * If errors are explicitly ignored, returns NULL on failure
+        * @param string $table
+        * @param string $index
+        * @param string $fname
         * @return array|bool|null
         */
        function indexInfo( $table, $index, $fname = __METHOD__ ) {
@@ -607,6 +642,7 @@ class DatabaseMssql extends DatabaseBase {
                        throw new DBQueryError( $this, $this->getErrors(), $this->lastErrno(), /*$sql*/ '', $fname );
                } elseif ( $ret != null ) {
                        // remember number of rows affected
+                       // @todo FIXME: $ret type does not appear to be a resource
                        $this->mAffectedRows = sqlsrv_rows_affected( $ret );
 
                        return $ret;
@@ -617,7 +653,8 @@ class DatabaseMssql extends DatabaseBase {
 
        /**
         * Return the next in a sequence, save the value for retrieval via insertId()
-        * @return
+        * @param string $seqName
+        * @return int|null
         */
        function nextSequenceValue( $seqName ) {
                if ( !$this->tableExists( 'sequence_' . $seqName ) ) {
@@ -639,7 +676,8 @@ class DatabaseMssql extends DatabaseBase {
 
        /**
         * Return the current value of a sequence. Assumes it has ben nextval'ed in this session.
-        * @return
+        * @param string $seqName
+        * @return int|null
         */
        function currentSequenceValue( $seqName ) {
                $ret = sqlsrv_query( $this->mConn, "SELECT TOP 1 id FROM [sequence_$seqName] ORDER BY id DESC" );
@@ -653,7 +691,11 @@ class DatabaseMssql extends DatabaseBase {
                }
        }
 
-       # Returns the size of a text field, or -1 for "unlimited"
+       /**
+        * @param string $table
+        * @param string $field
+        * @return int Returns the size of a text field, or -1 for "unlimited"
+        */
        function textFieldSize( $table, $field ) {
                $table = $this->tableName( $table );
                $sql = "SELECT CHARACTER_MAXIMUM_LENGTH,DATA_TYPE FROM INFORMATION_SCHEMA.Columns
@@ -671,10 +713,11 @@ class DatabaseMssql extends DatabaseBase {
        /**
         * Construct a LIMIT query with optional offset
         * This is used for query pages
-        * $sql string SQL query we will append the limit too
-        * $limit integer the SQL limit
-        * $offset integer the SQL offset (default false)
-        * @return mixed|string
+        *
+        * @param string $sql SQL query we will append the limit too
+        * @param int $limit The SQL limit
+        * @param bool|int $offset The SQL offset (default false)
+        * @return array|string
         */
        function limitResult( $sql, $limit, $offset = false ) {
                if ( $offset === false || $offset == 0 ) {
@@ -696,11 +739,16 @@ class DatabaseMssql extends DatabaseBase {
                }
        }
 
-       // If there is a limit clause, parse it, strip it, and pass the remaining
-       // SQL through limitResult() with the appropriate parameters. Not the
-       // prettiest solution, but better than building a whole new parser. This
-       // exists becase there are still too many extensions that don't use dynamic
-       // sql generation.
+       /**
+        * If there is a limit clause, parse it, strip it, and pass the remaining
+        * SQL through limitResult() with the appropriate parameters. Not the
+        * prettiest solution, but better than building a whole new parser. This
+        * exists becase there are still too many extensions that don't use dynamic
+        * sql generation.
+        *
+        * @param string $sql
+        * @return array|mixed|string
+        */
        function LimitToTopN( $sql ) {
                // Matches: LIMIT {[offset,] row_count | row_count OFFSET offset}
                $pattern = '/\bLIMIT\s+((([0-9]+)\s*,\s*)?([0-9]+)(\s+OFFSET\s+([0-9]+))?)/i';
@@ -721,15 +769,21 @@ class DatabaseMssql extends DatabaseBase {
                return $sql;
        }
 
+       /**
+        * Timestamp in ISO 8601 format with no timezone: 1986-02-09T20:00:00Z
+        *
+        * @param int $ts Timestamp
+        * @return bool|string The same date in ISO 8601 format with no timezone or false
+        */
        function timestamp( $ts = 0 ) {
                return wfTimestamp( TS_ISO_8601, $ts );
        }
 
        /**
-        * @return string wikitext of a link to the server software's web site
+        * @return string Wikitext of a link to the server software's web site
         */
        public function getSoftwareLink() {
-               return "[http://www.microsoft.com/sql/ MS SQL Server]";
+               return "[{{int:version-db-mssql-url}} MS SQL Server]";
        }
 
        /**
@@ -745,6 +799,12 @@ class DatabaseMssql extends DatabaseBase {
                return $version;
        }
 
+       /**
+        * @param string $table
+        * @param string $fname
+        * @param bool $schema
+        * @return bool
+        */
        function tableExists( $table, $fname = __METHOD__, $schema = false ) {
                $res = sqlsrv_query( $this->mConn, "SELECT * FROM information_schema.tables
                        WHERE table_type='BASE TABLE' AND table_name = '$table'" );
@@ -762,6 +822,9 @@ class DatabaseMssql extends DatabaseBase {
 
        /**
         * Query whether a given column exists in the mediawiki schema
+        * @param string $table
+        * @param string $field
+        * @param string $fname
         * @return bool
         */
        function fieldExists( $table, $field, $fname = __METHOD__ ) {
@@ -826,7 +889,7 @@ class DatabaseMssql extends DatabaseBase {
         * Escapes a identifier for use inm SQL.
         * Throws an exception if it is invalid.
         * Reference: http://msdn.microsoft.com/en-us/library/aa224033%28v=SQL.80%29.aspx
-        * @param $identifier
+        * @param string $identifier
         * @throws MWException
         * @return string
         */
@@ -916,10 +979,12 @@ class DatabaseMssql extends DatabaseBase {
        }
 
        /**
-        * @private
+        * @param array $tables
+        * @param array $use_index
+        * @param array $join_conds
         * @return string
         */
-       function tableNamesWithUseIndexOrJOIN( $tables, $use_index = array(), $join_conds = array() ) {
+       protected function tableNamesWithUseIndexOrJOIN( $tables, $use_index = array(), $join_conds = array() ) {
                $ret = array();
                $retJOIN = array();
                $use_index_safe = is_array( $use_index ) ? $use_index : array();
@@ -980,11 +1045,9 @@ class DatabaseMssql extends DatabaseBase {
        }
 
        /**
-        * @private
-        *
         * @param array $options an associative array of options to be turned into
-        *                 an SQL query, valid keys are listed in the function.
-        * @return Array
+        *   an SQL query, valid keys are listed in the function.
+        * @return array
         */
        function makeSelectOptions( $options ) {
                $tailOpts = '';
@@ -1041,11 +1104,11 @@ class DatabaseMssql extends DatabaseBase {
  * @ingroup Database
  */
 class MssqlField implements Field {
-       private $name, $tablename, $default, $max_length, $nullable, $type;
+       private $name, $tableName, $default, $max_length, $nullable, $type;
 
        function __construct( $info ) {
                $this->name = $info['COLUMN_NAME'];
-               $this->tablename = $info['TABLE_NAME'];
+               $this->tableName = $info['TABLE_NAME'];
                $this->default = $info['COLUMN_DEFAULT'];
                $this->max_length = $info['CHARACTER_MAXIMUM_LENGTH'];
                $this->nullable = !( strtolower( $info['IS_NULLABLE'] ) == 'no' );
@@ -1085,7 +1148,21 @@ class MssqlField implements Field {
  * @ingroup Database
  */
 class MssqlResult {
+       /** @var int */
+       private $mCursor;
+
+       /** @var array */
+       private $mRows;
 
+       /** @var bool|int */
+       private $mNumFields;
+
+       /** @var array|bool */
+       private $mFieldMeta;
+
+       /**
+        * @param bool|resource $queryresult
+        */
        public function __construct( $queryresult = false ) {
                $this->mCursor = 0;
                $this->mRows = array();
@@ -1108,6 +1185,11 @@ class MssqlResult {
                sqlsrv_free_stmt( $queryresult );
        }
 
+       /**
+        * @param array $array
+        * @param stdClass $obj
+        * @return stdClass
+        */
        private function array_to_obj( $array, &$obj ) {
                foreach ( $array as $key => $value ) {
                        if ( is_array( $value ) ) {
index b600d94..dc4a67d 100644 (file)
@@ -29,8 +29,8 @@
  */
 class DatabaseMysql extends DatabaseMysqlBase {
        /**
-        * @param $sql string
-        * @return resource
+        * @param string $sql
+        * @return resource False on error
         */
        protected function doQuery( $sql ) {
                if ( $this->bufferResults() ) {
@@ -42,6 +42,11 @@ class DatabaseMysql extends DatabaseMysqlBase {
                return $ret;
        }
 
+       /**
+        * @param string $realServer
+        * @return bool|resource MySQL Database connection or false on failure to connect
+        * @throws DBConnectionError
+        */
        protected function mysqlConnect( $realServer ) {
                # Fail now
                # Otherwise we get a suppressed fatal error, which is very hard to track down
@@ -84,6 +89,7 @@ class DatabaseMysql extends DatabaseMysqlBase {
        }
 
        /**
+        * @param string $charset
         * @return bool
         */
        protected function mysqlSetCharset( $charset ) {
@@ -127,7 +133,7 @@ class DatabaseMysql extends DatabaseMysqlBase {
        }
 
        /**
-        * @param $db
+        * @param string $db
         * @return bool
         */
        function selectDB( $db ) {
index 12fee94..647a42a 100644 (file)
@@ -33,6 +33,11 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
        /** @var MysqlMasterPos */
        protected $lastKnownSlavePos;
 
+       /** @var null|int */
+       protected $mFakeSlaveLag = null;
+
+       protected $mFakeMaster = false;
+
        /**
         * @return string
         */
@@ -41,12 +46,12 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
        }
 
        /**
-        * @param $server string
-        * @param $user string
-        * @param $password string
-        * @param $dbName string
+        * @param string $server
+        * @param string $user
+        * @param string $password
+        * @param string $dbName
+        * @throws Exception|DBConnectionError
         * @return bool
-        * @throws DBConnectionError
         */
        function open( $server, $user, $password, $dbName ) {
                global $wgAllDBsAreLocalhost, $wgSQLMode;
@@ -155,7 +160,7 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
        /**
         * Open a connection to a MySQL server
         *
-        * @param $realServer string
+        * @param string $realServer
         * @return mixed Raw connection
         * @throws DBConnectionError
         */
@@ -170,7 +175,7 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
        abstract protected function mysqlSetCharset( $charset );
 
        /**
-        * @param $res ResultWrapper
+        * @param ResultWrapper|resource $res
         * @throws DBUnexpectedError
         */
        function freeResult( $res ) {
@@ -188,14 +193,14 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
        /**
         * Free result memory
         *
-        * @param $res Raw result
+        * @param resource $res Raw result
         * @return bool
         */
        abstract protected function mysqlFreeResult( $res );
 
        /**
-        * @param $res ResultWrapper
-        * @return object|bool
+        * @param ResultWrapper|resource $res
+        * @return stdClass|bool
         * @throws DBUnexpectedError
         */
        function fetchObject( $res ) {
@@ -224,13 +229,13 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
        /**
         * Fetch a result row as an object
         *
-        * @param $res Raw result
+        * @param resource $res Raw result
         * @return stdClass
         */
        abstract protected function mysqlFetchObject( $res );
 
        /**
-        * @param $res ResultWrapper
+        * @param ResultWrapper|resource $res
         * @return array|bool
         * @throws DBUnexpectedError
         */
@@ -260,14 +265,14 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
        /**
         * Fetch a result row as an associative and numeric array
         *
-        * @param $res Raw result
+        * @param resource $res Raw result
         * @return array
         */
        abstract protected function mysqlFetchArray( $res );
 
        /**
         * @throws DBUnexpectedError
-        * @param $res ResultWrapper
+        * @param ResultWrapper|resource $res
         * @return int
         */
        function numRows( $res ) {
@@ -289,13 +294,13 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
        /**
         * Get number of rows in result
         *
-        * @param $res Raw result
+        * @param resource $res Raw result
         * @return int
         */
        abstract protected function mysqlNumRows( $res );
 
        /**
-        * @param $res ResultWrapper
+        * @param ResultWrapper|resource $res
         * @return int
         */
        function numFields( $res ) {
@@ -309,13 +314,13 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
        /**
         * Get number of fields in result
         *
-        * @param $res Raw result
+        * @param resource $res Raw result
         * @return int
         */
        abstract protected function mysqlNumFields( $res );
 
        /**
-        * @param $res ResultWrapper
+        * @param ResultWrapper|resource $res
         * @param $n int
         * @return string
         */
@@ -330,7 +335,7 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
        /**
         * Get the name of the specified field in a result
         *
-        * @param $res Raw result
+        * @param ResultWrapper|resource $res
         * @param $n int
         * @return string
         */
@@ -338,7 +343,7 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
 
        /**
         * mysql_field_type() wrapper
-        * @param $res
+        * @param ResultWrapper|resource $res
         * @param $n int
         * @return string
         */
@@ -353,15 +358,15 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
        /**
         * Get the type of the specified field in a result
         *
-        * @param $res Raw result
-        * @param $n int
+        * @param ResultWrapper|resource $res
+        * @param int $n
         * @return string
         */
        abstract protected function mysqlFieldType( $res, $n );
 
        /**
-        * @param $res ResultWrapper
-        * @param $row
+        * @param ResultWrapper|resource $res
+        * @param int $row
         * @return bool
         */
        function dataSeek( $res, $row ) {
@@ -375,8 +380,8 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
        /**
         * Move internal result pointer
         *
-        * @param $res Raw result
-        * @param $row int
+        * @param ResultWrapper|resource $res
+        * @param int $row
         * @return bool
         */
        abstract protected function mysqlDataSeek( $res, $row );
@@ -406,16 +411,16 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
        /**
         * Returns the text of the error message from previous MySQL operation
         *
-        * @param $conn Raw connection
+        * @param resource $conn Raw connection
         * @return string
         */
        abstract protected function mysqlError( $conn = null );
 
        /**
-        * @param $table string
-        * @param $uniqueIndexes
-        * @param $rows array
-        * @param $fname string
+        * @param string $table
+        * @param array $uniqueIndexes
+        * @param array $rows
+        * @param string $fname
         * @return ResultWrapper
         */
        function replace( $table, $uniqueIndexes, $rows, $fname = __METHOD__ ) {
@@ -427,12 +432,12 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
         * Returns estimated count, based on EXPLAIN output
         * Takes same arguments as Database::select()
         *
-        * @param $table string|array
-        * @param $vars string|array
-        * @param $conds string|array
-        * @param $fname string
-        * @param $options string|array
-        * @return int
+        * @param string|array $table
+        * @param string|array $vars
+        * @param string|array $conds
+        * @param string $fname
+        * @param string|array $options
+        * @return bool|int
         */
        public function estimateRowCount( $table, $vars = '*', $conds = '',
                $fname = __METHOD__, $options = array()
@@ -455,8 +460,8 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
        }
 
        /**
-        * @param $table string
-        * @param $field string
+        * @param string $table
+        * @param string $field
         * @return bool|MySQLField
         */
        function fieldInfo( $table, $field ) {
@@ -479,8 +484,8 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
        /**
         * Get column information from a result
         *
-        * @param $res Raw result
-        * @param $n int
+        * @param resource $res Raw result
+        * @param int $n
         * @return stdClass
         */
        abstract protected function mysqlFetchField( $res, $n );
@@ -489,9 +494,9 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
         * Get information about an index into an object
         * Returns false if the index does not exist
         *
-        * @param $table string
-        * @param $index string
-        * @param $fname string
+        * @param string $table
+        * @param string $index
+        * @param string $fname
         * @return bool|array|null False or null on failure
         */
        function indexInfo( $table, $index, $fname = __METHOD__ ) {
@@ -520,8 +525,7 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
        }
 
        /**
-        * @param $s string
-        *
+        * @param string $s
         * @return string
         */
        function strencode( $s ) {
@@ -538,8 +542,7 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
        /**
         * MySQL uses `backticks` for identifier quoting instead of the sql standard "double quotes".
         *
-        * @param $s string
-        *
+        * @param string $s
         * @return string
         */
        public function addIdentifierQuotes( $s ) {
@@ -549,7 +552,7 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
        }
 
        /**
-        * @param $name string
+        * @param string $name
         * @return bool
         */
        public function isQuotedIdentifier( $name ) {
@@ -580,6 +583,24 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
         */
        abstract protected function mysqlPing();
 
+       /**
+        * Set lag time in seconds for a fake slave
+        *
+        * @param int $lag
+        */
+       public function setFakeSlaveLag( $lag ) {
+               $this->mFakeSlaveLag = $lag;
+       }
+
+       /**
+        * Make this connection a fake master
+        *
+        * @param bool $enabled
+        */
+       public function setFakeMaster( $enabled = true ) {
+               $this->mFakeMaster = $enabled;
+       }
+
        /**
         * Returns slave lag.
         *
@@ -659,11 +680,13 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
 
        /**
         * Wait for the slave to catch up to a given master position.
-        * @TODO: return values for this and base class are rubbish
+        * @todo Return values for this and base class are rubbish
         *
-        * @param $pos DBMasterPos object
-        * @param $timeout Integer: the maximum number of seconds to wait for synchronisation
-        * @return bool|string
+        * @param DBMasterPos|MySQLMasterPos $pos
+        * @param int $timeout The maximum number of seconds to wait for synchronisation
+        * @return int Zero if the slave was past that position already,
+        *   greater than zero if we waited for some period of time, less than
+        *   zero if we timed out.
         */
        function masterPosWait( DBMasterPos $pos, $timeout ) {
                if ( $this->lastKnownSlavePos && $this->lastKnownSlavePos->hasReached( $pos ) ) {
@@ -675,10 +698,25 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
                $this->commit( __METHOD__, 'flush' );
 
                if ( !is_null( $this->mFakeSlaveLag ) ) {
-                       $status = parent::masterPosWait( $pos, $timeout );
-                       wfProfileOut( __METHOD__ );
+                       $wait = intval( ( $pos->pos - microtime( true ) + $this->mFakeSlaveLag ) * 1e6 );
+
+                       if ( $wait > $timeout * 1e6 ) {
+                               wfDebug( "Fake slave timed out waiting for $pos ($wait us)\n" );
+                               wfProfileOut( __METHOD__ );
 
-                       return $status;
+                               return -1;
+                       } elseif ( $wait > 0 ) {
+                               wfDebug( "Fake slave waiting $wait us\n" );
+                               usleep( $wait );
+                               wfProfileOut( __METHOD__ );
+
+                               return 1;
+                       } else {
+                               wfDebug( "Fake slave up to date ($wait us)\n" );
+                               wfProfileOut( __METHOD__ );
+
+                               return 0;
+                       }
                }
 
                # Call doQuery() directly, to avoid opening a transaction if DBO_TRX is set
@@ -707,7 +745,10 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
         */
        function getSlavePos() {
                if ( !is_null( $this->mFakeSlaveLag ) ) {
-                       return parent::getSlavePos();
+                       $pos = new MySQLMasterPos( 'fake', microtime( true ) - $this->mFakeSlaveLag );
+                       wfDebug( __METHOD__ . ": fake slave pos = $pos\n" );
+
+                       return $pos;
                }
 
                $res = $this->query( 'SHOW SLAVE STATUS', 'DatabaseBase::getSlavePos' );
@@ -731,7 +772,7 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
         */
        function getMasterPos() {
                if ( $this->mFakeMaster ) {
-                       return parent::getMasterPos();
+                       return new MySQLMasterPos( 'fake', microtime( true ) );
                }
 
                $res = $this->query( 'SHOW MASTER STATUS', 'DatabaseBase::getMasterPos' );
@@ -745,7 +786,7 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
        }
 
        /**
-        * @param $index
+        * @param string $index
         * @return string
         */
        function useIndexClause( $index ) {
@@ -763,11 +804,18 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
         * @return string
         */
        public function getSoftwareLink() {
-               return '[http://www.mysql.com/ MySQL]';
+               $version = $this->getServerVersion();
+               if ( strpos( $version, 'MariaDB' ) !== false ) {
+                       return '[{{int:version-db-mariadb-url}} MariaDB]';
+               } elseif ( strpos( $version, 'percona' ) !== false ) {
+                       return '[{{int:version-db-percona-url}} Percona Server]';
+               } else {
+                       return '[{{int:version-db-mysql-url}} MySQL]';
+               }
        }
 
        /**
-        * @param $options array
+        * @param array $options
         */
        public function setSessionOptions( array $options ) {
                if ( isset( $options['connTimeout'] ) ) {
@@ -777,6 +825,11 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
                }
        }
 
+       /**
+        * @param string $sql
+        * @param string $newLine
+        * @return bool
+        */
        public function streamStatementEnd( &$sql, &$newLine ) {
                if ( strtoupper( substr( $newLine, 0, 9 ) ) == 'DELIMITER' ) {
                        preg_match( '/^DELIMITER\s+(\S+)/', $newLine, $m );
@@ -792,7 +845,7 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
         *
         * @param string $lockName name of lock to poll
         * @param string $method name of method calling us
-        * @return Boolean
+        * @return bool
         * @since 1.20
         */
        public function lockIsFree( $lockName, $method ) {
@@ -804,9 +857,9 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
        }
 
        /**
-        * @param $lockName string
-        * @param $method string
-        * @param $timeout int
+        * @param string $lockName
+        * @param string $method
+        * @param int $timeout
         * @return bool
         */
        public function lock( $lockName, $method, $timeout = 5 ) {
@@ -826,8 +879,8 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
        /**
         * FROM MYSQL DOCS:
         * http://dev.mysql.com/doc/refman/5.0/en/miscellaneous-functions.html#function_release-lock
-        * @param $lockName string
-        * @param $method string
+        * @param string $lockName
+        * @param string $method
         * @return bool
         */
        public function unlock( $lockName, $method ) {
@@ -839,10 +892,10 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
        }
 
        /**
-        * @param $read array
-        * @param $write array
-        * @param $method string
-        * @param $lowPriority bool
+        * @param array $read
+        * @param array $write
+        * @param string $method
+        * @param bool $lowPriority
         * @return bool
         */
        public function lockTables( $read, $write, $method, $lowPriority = true ) {
@@ -864,7 +917,7 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
        }
 
        /**
-        * @param $method string
+        * @param string $method
         * @return bool
         */
        public function unlockTables( $method ) {
@@ -877,7 +930,7 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
         * Get search engine class. All subclasses of this
         * need to implement this if they wish to use searching.
         *
-        * @return String
+        * @return string
         */
        public function getSearchEngine() {
                return 'SearchMySQL';
@@ -885,7 +938,7 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
 
        /**
         * @param bool $value
-        * @return mixed
+        * @return mixed null|bool|ResultWrapper
         */
        public function setBigSelects( $value = true ) {
                if ( $value === 'default' ) {
@@ -937,8 +990,8 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
         * @param string $fname
         * @return bool
         */
-       public function upsert(
-               $table, array $rows, array $uniqueIndexes, array $set, $fname = __METHOD__
+       public function upsert( $table, array $rows, array $uniqueIndexes,
+               array $set, $fname = __METHOD__
        ) {
                if ( !count( $rows ) ) {
                        return true; // nothing to do
@@ -1009,24 +1062,26 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
        }
 
        /**
-        * @param $oldName
-        * @param $newName
-        * @param $temporary bool
-        * @param $fname string
+        * @param string $oldName
+        * @param string $newName
+        * @param bool $temporary
+        * @param string $fname
+        * @return bool
         */
        function duplicateTableStructure( $oldName, $newName, $temporary = false, $fname = __METHOD__ ) {
                $tmp = $temporary ? 'TEMPORARY ' : '';
                $newName = $this->addIdentifierQuotes( $newName );
                $oldName = $this->addIdentifierQuotes( $oldName );
                $query = "CREATE $tmp TABLE $newName (LIKE $oldName)";
-               $this->query( $query, $fname );
+
+               return $this->query( $query, $fname );
        }
 
        /**
         * List all tables on the database
         *
         * @param string $prefix Only show tables with this prefix, e.g. mw_
-        * @param string $fname calling function name
+        * @param string $fname Calling function name
         * @return array
         */
        function listTables( $prefix = null, $fname = __METHOD__ ) {
@@ -1077,7 +1132,7 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
        /**
         * Get status information from SHOW STATUS in an associative array
         *
-        * @param $which string
+        * @param string $which
         * @return array
         */
        function getMysqlStatus( $which = "%" ) {
@@ -1133,7 +1188,8 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
        /**
         * Differentiates between a TABLE and a VIEW.
         *
-        * @param $name string: Name of the TABLE/VIEW to test
+        * @param string $name Name of the TABLE/VIEW to test
+        * @param string $prefix
         * @return bool
         * @since 1.22
         */
@@ -1216,7 +1272,11 @@ class MySQLField implements Field {
 }
 
 class MySQLMasterPos implements DBMasterPos {
-       var $file, $pos;
+       /** @var string */
+       public $file;
+
+       /** @var int timestamp */
+       public $pos;
 
        function __construct( $file, $pos ) {
                $this->file = $file;
index d0c19fa..d41f3e4 100644 (file)
@@ -30,7 +30,7 @@
  */
 class DatabaseMysqli extends DatabaseMysqlBase {
        /**
-        * @param $sql string
+        * @param string $sql
         * @return resource
         */
        protected function doQuery( $sql ) {
@@ -43,6 +43,11 @@ class DatabaseMysqli extends DatabaseMysqlBase {
                return $ret;
        }
 
+       /**
+        * @param string $realServer
+        * @return bool|mysqli
+        * @throws DBConnectionError
+        */
        protected function mysqlConnect( $realServer ) {
                global $wgDBmysql5;
                # Fail now
@@ -93,6 +98,7 @@ class DatabaseMysqli extends DatabaseMysqlBase {
        }
 
        /**
+        * @param string $charset
         * @return bool
         */
        protected function mysqlSetCharset( $charset ) {
@@ -136,7 +142,7 @@ class DatabaseMysqli extends DatabaseMysqlBase {
        }
 
        /**
-        * @param $db
+        * @param string $db
         * @return bool
         */
        function selectDB( $db ) {
@@ -152,12 +158,20 @@ class DatabaseMysqli extends DatabaseMysqlBase {
                return $this->mConn->server_info;
        }
 
+       /**
+        * @param mysqli $res
+        * @return bool
+        */
        protected function mysqlFreeResult( $res ) {
                $res->free_result();
 
                return true;
        }
 
+       /**
+        * @param mysqli $res
+        * @return bool
+        */
        protected function mysqlFetchObject( $res ) {
                $object = $res->fetch_object();
                if ( $object === null ) {
@@ -167,6 +181,10 @@ class DatabaseMysqli extends DatabaseMysqlBase {
                return $object;
        }
 
+       /**
+        * @param mysqli $res
+        * @return bool
+        */
        protected function mysqlFetchArray( $res ) {
                $array = $res->fetch_array();
                if ( $array === null ) {
@@ -176,14 +194,27 @@ class DatabaseMysqli extends DatabaseMysqlBase {
                return $array;
        }
 
+       /**
+        * @param mysqli $res
+        * @return mixed
+        */
        protected function mysqlNumRows( $res ) {
                return $res->num_rows;
        }
 
+       /**
+        * @param mysqli $res
+        * @return mixed
+        */
        protected function mysqlNumFields( $res ) {
                return $res->field_count;
        }
 
+       /**
+        * @param mysqli $res
+        * @param int $n
+        * @return mixed
+        */
        protected function mysqlFetchField( $res, $n ) {
                $field = $res->fetch_field_direct( $n );
                $field->not_null = $field->flags & MYSQLI_NOT_NULL_FLAG;
@@ -195,21 +226,40 @@ class DatabaseMysqli extends DatabaseMysqlBase {
                return $field;
        }
 
+       /**
+        * @param resource|ResultWrapper $res
+        * @param int $n
+        * @return mixed
+        */
        protected function mysqlFieldName( $res, $n ) {
                $field = $res->fetch_field_direct( $n );
 
                return $field->name;
        }
 
+       /**
+        * @param resource|ResultWrapper $res
+        * @param int $n
+        * @return mixed
+        */
        protected function mysqlFieldType( $res, $n ) {
                $field = $res->fetch_field_direct( $n );
                return $field->type;
        }
 
+       /**
+        * @param resource|ResultWrapper $res
+        * @param int $row
+        * @return mixed
+        */
        protected function mysqlDataSeek( $res, $row ) {
                return $res->data_seek( $row );
        }
 
+       /**
+        * @param mysqli $conn Optional connection object
+        * @return string
+        */
        protected function mysqlError( $conn = null ) {
                if ( $conn === null ) {
                        return mysqli_connect_error();
@@ -218,6 +268,11 @@ class DatabaseMysqli extends DatabaseMysqlBase {
                }
        }
 
+       /**
+        * Escapes special characters in a string for use in an SQL statement
+        * @param string $s
+        * @return string
+        */
        protected function mysqlRealEscapeString( $s ) {
                return $this->mConn->real_escape_string( $s );
        }
index 3336d1e..d304444 100644 (file)
@@ -50,8 +50,8 @@ class ORAResult {
        }
 
        /**
-        * @param $db DatabaseBase
-        * @param $stmt
+        * @param DatabaseBase $db
+        * @param resource $stmt A valid OCI statement identifier
         * @param bool $unique
         */
        function __construct( &$db, $stmt, $unique = false ) {
@@ -442,6 +442,10 @@ class DatabaseOracle extends DatabaseBase {
                return $this->query( $sql, $fname, true );
        }
 
+       /**
+        * Frees resources associated with the LOB descriptor
+        * @param ResultWrapper|resource $res
+        */
        function freeResult( $res ) {
                if ( $res instanceof ResultWrapper ) {
                        $res = $res->result;
@@ -450,6 +454,10 @@ class DatabaseOracle extends DatabaseBase {
                $res->free();
        }
 
+       /**
+        * @param ResultWrapper|stdClass $res
+        * @return mixed
+        */
        function fetchObject( $res ) {
                if ( $res instanceof ResultWrapper ) {
                        $res = $res->result;
@@ -494,6 +502,10 @@ class DatabaseOracle extends DatabaseBase {
                return $this->mInsertId;
        }
 
+       /**
+        * @param mixed $res
+        * @param int $row
+        */
        function dataSeek( $res, $row ) {
                if ( $res instanceof ORAResult ) {
                        $res->seek( $row );
@@ -529,6 +541,9 @@ class DatabaseOracle extends DatabaseBase {
        /**
         * Returns information about an index
         * If errors are explicitly ignored, returns NULL on failure
+        * @param string $table
+        * @param string $index
+        * @param string $fname
         * @return bool
         */
        function indexInfo( $table, $index, $fname = __METHOD__ ) {
@@ -603,6 +618,13 @@ class DatabaseOracle extends DatabaseBase {
                return $bind;
        }
 
+       /**
+        * @param string $table
+        * @param $row
+        * @param string $fname
+        * @return bool
+        * @throws DBUnexpectedError
+        */
        private function insertOneRow( $table, $row, $fname ) {
                global $wgContLang;
 
@@ -654,6 +676,7 @@ class DatabaseOracle extends DatabaseBase {
                                        return false;
                                }
                        } else {
+                               /** @var OCI_Lob[] $lob */
                                if ( ( $lob[$col] = oci_new_descriptor( $this->mConn, OCI_D_LOB ) ) === false ) {
                                        $e = oci_error( $stmt );
                                        throw new DBUnexpectedError( $this, "Cannot create LOB descriptor: " . $e['message'] );
@@ -700,7 +723,7 @@ class DatabaseOracle extends DatabaseBase {
                        oci_commit( $this->mConn );
                }
 
-               oci_free_statement( $stmt );
+               return oci_free_statement( $stmt );
        }
 
        function insertSelect( $destTable, $srcTable, $varMap, $conds, $fname = __METHOD__,
@@ -822,7 +845,13 @@ class DatabaseOracle extends DatabaseBase {
                return ( isset( $this->sequenceData[$table] ) ) ? $this->sequenceData[$table] : false;
        }
 
-       # Returns the size of a text field, or -1 for "unlimited"
+       /**
+        * Returns the size of a text field, or -1 for "unlimited"
+        *
+        * @param string $table
+        * @param string $field
+        * @return mixed
+        */
        function textFieldSize( $table, $field ) {
                $fieldInfoData = $this->fieldInfo( $table, $field );
 
@@ -916,6 +945,10 @@ class DatabaseOracle extends DatabaseBase {
 
        /**
         * Return aggregated value function call
+        *
+        * @param $valuedata
+        * @param string $valuename
+        * @return mixed
         */
        public function aggregateValue( $valuedata, $valuename = 'value' ) {
                return $valuedata;
@@ -939,7 +972,7 @@ class DatabaseOracle extends DatabaseBase {
         * @return string wikitext of a link to the server software's web site
         */
        public function getSoftwareLink() {
-               return '[http://www.oracle.com/ Oracle]';
+               return '[{{int:version-db-oracle-url}} Oracle]';
        }
 
        /**
@@ -960,6 +993,9 @@ class DatabaseOracle extends DatabaseBase {
 
        /**
         * Query whether a given index exists
+        * @param string $table
+        * @param string $index
+        * @param string $fname
         * @return bool
         */
        function indexExists( $table, $index, $fname = __METHOD__ ) {
@@ -981,6 +1017,8 @@ class DatabaseOracle extends DatabaseBase {
 
        /**
         * Query whether a given table exists (in the given schema, or the default mw one if not given)
+        * @param string $table
+        * @param string $fname
         * @return bool
         */
        function tableExists( $table, $fname = __METHOD__ ) {
@@ -1006,8 +1044,8 @@ class DatabaseOracle extends DatabaseBase {
         * For internal calls. Use fieldInfo for normal usage.
         * Returns false if the field doesn't exist
         *
-        * @param $table Array
-        * @param $field String
+        * @param array|string $table
+        * @param string $field
         * @return ORAField|ORAResult
         */
        private function fieldInfoMulti( $table, $field ) {
@@ -1064,8 +1102,8 @@ class DatabaseOracle extends DatabaseBase {
 
        /**
         * @throws DBUnexpectedError
-        * @param  $table
-        * @param  $field
+        * @param  string $table
+        * @param  string $field
         * @return ORAField
         */
        function fieldInfo( $table, $field ) {
@@ -1100,7 +1138,16 @@ class DatabaseOracle extends DatabaseBase {
                }
        }
 
-       /* defines must comply with ^define\s*([^\s=]*)\s*=\s?'\{\$([^\}]*)\}'; */
+       /**
+        * defines must comply with ^define\s*([^\s=]*)\s*=\s?'\{\$([^\}]*)\}';
+        *
+        * @param resource $fp
+        * @param bool|string $lineCallback
+        * @param bool|callable $resultCallback
+        * @param string $fname
+        * @param bool|callable $inputCallback
+        * @return bool|string
+        */
        function sourceStream( $fp, $lineCallback = false, $resultCallback = false,
                $fname = __METHOD__, $inputCallback = false ) {
                $cmd = '';
@@ -1275,10 +1322,8 @@ class DatabaseOracle extends DatabaseBase {
         * Returns an optional USE INDEX clause to go after the table, and a
         * string to go at the end of the query
         *
-        * @private
-        *
-        * @param array $options an associative array of options to be turned into
-        *              an SQL query, valid keys are listed in the function.
+        * @param array $options An associative array of options to be turned into
+        *   an SQL query, valid keys are listed in the function.
         * @return array
         */
        function makeSelectOptions( $options ) {
@@ -1347,6 +1392,15 @@ class DatabaseOracle extends DatabaseBase {
                return parent::delete( $table, $conds, $fname );
        }
 
+       /**
+        * @param string $table
+        * @param array $values
+        * @param array $conds
+        * @param string $fname
+        * @param array $options
+        * @return bool
+        * @throws DBUnexpectedError
+        */
        function update( $table, $values, $conds, $fname = __METHOD__, $options = array() ) {
                global $wgContLang;
 
@@ -1443,7 +1497,7 @@ class DatabaseOracle extends DatabaseBase {
                        oci_commit( $this->mConn );
                }
 
-               oci_free_statement( $stmt );
+               return oci_free_statement( $stmt );
        }
 
        function bitNot( $field ) {
@@ -1459,9 +1513,6 @@ class DatabaseOracle extends DatabaseBase {
                return 'BITOR(' . $fieldLeft . ', ' . $fieldRight . ')';
        }
 
-       function setFakeMaster( $enabled = true ) {
-       }
-
        function getDBname() {
                return $this->mDBname;
        }
@@ -1485,4 +1536,4 @@ class DatabaseOracle extends DatabaseBase {
        public function getInfinity() {
                return '31-12-2030 12:00:00.000000';
        }
-} // end DatabaseOracle class
+}
index 21a7bcf..83d8cae 100644 (file)
@@ -26,9 +26,9 @@ class PostgresField implements Field {
                $has_default, $default;
 
        /**
-        * @param $db DatabaseBase
-        * @param  $table
-        * @param  $field
+        * @param DatabaseBase $db
+        * @param string $table
+        * @param string $field
         * @return null|PostgresField
         */
        static function fromText( $db, $table, $field ) {
@@ -216,13 +216,15 @@ class PostgresTransactionState {
  * @since 1.19
  */
 class SavepointPostgres {
-       /**
-        * Establish a savepoint within a transaction
-        */
+       /** @var DatabaseBase Establish a savepoint within a transaction */
        protected $dbw;
        protected $id;
        protected $didbegin;
 
+       /**
+        * @param DatabaseBase $dbw
+        * @param $id
+        */
        public function __construct( $dbw, $id ) {
                $this->dbw = $dbw;
                $this->id = $id;
@@ -362,7 +364,7 @@ class DatabasePostgres extends DatabaseBase {
         * @param string $user
         * @param string $password
         * @param string $dbName
-        * @throws DBConnectionError
+        * @throws DBConnectionError|Exception
         * @return DatabaseBase|null
         */
        function open( $server, $user, $password, $dbName ) {
@@ -379,7 +381,7 @@ class DatabasePostgres extends DatabaseBase {
                global $wgDBport;
 
                if ( !strlen( $user ) ) { # e.g. the class is being loaded
-                       return;
+                       return null;
                }
 
                $this->mServer = $server;
@@ -450,7 +452,8 @@ class DatabasePostgres extends DatabaseBase {
        /**
         * Postgres doesn't support selectDB in the same way MySQL does. So if the
         * DB name doesn't match the open connection, open a new one
-        * @return
+        * @param string $db
+        * @return bool
         */
        function selectDB( $db ) {
                if ( $this->mDBname !== $db ) {
@@ -536,6 +539,10 @@ class DatabasePostgres extends DatabaseBase {
                return $this->query( $sql, $fname, true );
        }
 
+       /**
+        * @param stdClass|ResultWrapper $res
+        * @throws DBUnexpectedError
+        */
        function freeResult( $res ) {
                if ( $res instanceof ResultWrapper ) {
                        $res = $res->result;
@@ -548,6 +555,11 @@ class DatabasePostgres extends DatabaseBase {
                }
        }
 
+       /**
+        * @param ResultWrapper|stdClass $res
+        * @return stdClass
+        * @throws DBUnexpectedError
+        */
        function fetchObject( $res ) {
                if ( $res instanceof ResultWrapper ) {
                        $res = $res->result;
@@ -629,6 +641,11 @@ class DatabasePostgres extends DatabaseBase {
                return $this->mInsertId;
        }
 
+       /**
+        * @param mixed $res
+        * @param int $row
+        * @return bool
+        */
        function dataSeek( $res, $row ) {
                if ( $res instanceof ResultWrapper ) {
                        $res = $res->result;
@@ -675,6 +692,12 @@ class DatabasePostgres extends DatabaseBase {
         * This is not necessarily an accurate estimate, so use sparingly
         * Returns -1 if count cannot be found
         * Takes same arguments as Database::select()
+        *
+        * @param string $table
+        * @param string $vars
+        * @param string $conds
+        * @param string $fname
+        * @param array $options
         * @return int
         */
        function estimateRowCount( $table, $vars = '*', $conds = '',
@@ -697,6 +720,10 @@ class DatabasePostgres extends DatabaseBase {
        /**
         * Returns information about an index
         * If errors are explicitly ignored, returns NULL on failure
+        *
+        * @param string $table
+        * @param string $index
+        * @param string $fname
         * @return bool|null
         */
        function indexInfo( $table, $index, $fname = __METHOD__ ) {
@@ -718,7 +745,9 @@ class DatabasePostgres extends DatabaseBase {
         * Returns is of attributes used in index
         *
         * @since 1.19
-        * @return Array
+        * @param string $index
+        * @param bool|string $schema
+        * @return array
         */
        function indexAttributes( $index, $schema = false ) {
                if ( $schema === false ) {
@@ -790,17 +819,39 @@ __INDEXATTR__;
                return $res->numRows() > 0;
        }
 
+       /**
+        * Change the FOR UPDATE option as necessary based on the join conditions. Then pass
+        * to the parent function to get the actual SQL text.
+        *
+        * In Postgres when using FOR UPDATE, only the main table and tables that are inner joined
+        * can be locked. That means tables in an outer join cannot be FOR UPDATE locked. Trying to do
+        * so causes a DB error. This wrapper checks which tables can be locked and adjusts it accordingly.
+        */
+       function selectSQLText( $table, $vars, $conds = '', $fname = __METHOD__, $options = array(), $join_conds = array() ) {
+               $forUpdateKey = array_search( 'FOR UPDATE', $options );
+               if ( $forUpdateKey !== false && $join_conds ) {
+                       unset( $options[$forUpdateKey] );
+
+                       foreach ( $join_conds as $table => $join_cond ) {
+                               if ( 0 === preg_match( '/^(?:LEFT|RIGHT|FULL)(?: OUTER)? JOIN$/i', $join_cond[0] ) ) {
+                                       $options['FOR UPDATE'][] = $table;
+                               }
+                       }
+               }
+
+               return parent::selectSQLText( $table, $vars, $conds, $fname, $options, $join_conds );
+       }
+
        /**
         * INSERT wrapper, inserts an array into a table
         *
         * $args may be a single associative array, or an array of these with numeric keys,
         * for multi-row insert (Postgres version 8.2 and above only).
         *
-        * @param $table   String: Name of the table to insert to.
-        * @param $args    Array: Items to insert into the table.
-        * @param $fname   String: Name of the function, for profiling
-        * @param string $options or Array. Valid options: IGNORE
-        *
+        * @param string $table Name of the table to insert to.
+        * @param array $args Items to insert into the table.
+        * @param string $fname Name of the function, for profiling
+        * @param array|string $options String or array. Valid options: IGNORE
         * @return bool Success of insert operation. IGNORE always returns true.
         */
        function insert( $table, $args, $fname = __METHOD__, $options = array() ) {
@@ -919,6 +970,14 @@ __INDEXATTR__;
         * $conds may be "*" to copy the whole table
         * srcTable may be an array of tables.
         * @todo FIXME: Implement this a little better (seperate select/insert)?
+        *
+        * @param string $destTable
+        * @param array|string $srcTable
+        * @param array $varMap
+        * @param array $conds
+        * @param string $fname
+        * @param array $insertOptions
+        * @param array $selectOptions
         * @return bool
         */
        function insertSelect( $destTable, $srcTable, $varMap, $conds, $fname = __METHOD__,
@@ -1019,7 +1078,7 @@ __INDEXATTR__;
         * Return the current value of a sequence. Assumes it has been nextval'ed in this session.
         *
         * @param string $seqName
-        * @return
+        * @return int
         */
        function currentSequenceValue( $seqName ) {
                $safeseq = str_replace( "'", "''", $seqName );
@@ -1096,10 +1155,10 @@ __INDEXATTR__;
         * This should really be handled by PHP PostgreSQL module
         *
         * @since 1.19
-        * @param $text   string: postgreql array returned in a text form like {a,b}
-        * @param $output string
-        * @param $limit  int
-        * @param $offset int
+        * @param string $text Postgreql array returned in a text form like {a,b}
+        * @param string $output
+        * @param int $limit
+        * @param int $offset
         * @return string
         */
        function pg_array_parse( $text, &$output, $limit = false, $offset = 1 ) {
@@ -1137,10 +1196,10 @@ __INDEXATTR__;
        }
 
        /**
-        * @return string wikitext of a link to the server software's web site
+        * @return string Wikitext of a link to the server software's web site
         */
        public function getSoftwareLink() {
-               return '[http://www.postgresql.org/ PostgreSQL]';
+               return '[{{int:version-db-postgres-url}} PostgreSQL]';
        }
 
        /**
@@ -1184,7 +1243,7 @@ __INDEXATTR__;
         * Needs transaction
         *
         * @since 1.19
-        * @return array how to search for table names schemas for the current user
+        * @return array How to search for table names schemas for the current user
         */
        function getSearchPath() {
                $res = $this->query( "SHOW search_path", __METHOD__ );
@@ -1217,14 +1276,15 @@ __INDEXATTR__;
         * This will be also called by the installer after the schema is created
         *
         * @since 1.19
-        * @param $desired_schema string
+        *
+        * @param string $desiredSchema
         */
-       function determineCoreSchema( $desired_schema ) {
+       function determineCoreSchema( $desiredSchema ) {
                $this->begin( __METHOD__ );
-               if ( $this->schemaExists( $desired_schema ) ) {
-                       if ( in_array( $desired_schema, $this->getSchemas() ) ) {
-                               $this->mCoreSchema = $desired_schema;
-                               wfDebug( "Schema \"" . $desired_schema . "\" already in the search path\n" );
+               if ( $this->schemaExists( $desiredSchema ) ) {
+                       if ( in_array( $desiredSchema, $this->getSchemas() ) ) {
+                               $this->mCoreSchema = $desiredSchema;
+                               wfDebug( "Schema \"" . $desiredSchema . "\" already in the search path\n" );
                        } else {
                                /**
                                 * Prepend our schema (e.g. 'mediawiki') in front
@@ -1233,14 +1293,14 @@ __INDEXATTR__;
                                 */
                                $search_path = $this->getSearchPath();
                                array_unshift( $search_path,
-                                       $this->addIdentifierQuotes( $desired_schema ) );
+                                       $this->addIdentifierQuotes( $desiredSchema ) );
                                $this->setSearchPath( $search_path );
-                               $this->mCoreSchema = $desired_schema;
-                               wfDebug( "Schema \"" . $desired_schema . "\" added to the search path\n" );
+                               $this->mCoreSchema = $desiredSchema;
+                               wfDebug( "Schema \"" . $desiredSchema . "\" added to the search path\n" );
                        }
                } else {
                        $this->mCoreSchema = $this->getCurrentSchema();
-                       wfDebug( "Schema \"" . $desired_schema . "\" not found, using current \"" .
+                       wfDebug( "Schema \"" . $desiredSchema . "\" not found, using current \"" .
                                $this->mCoreSchema . "\"\n" );
                }
                /* Commit SET otherwise it will be rollbacked on error or IGNORE SELECT */
@@ -1281,6 +1341,9 @@ __INDEXATTR__;
        /**
         * Query whether a given relation exists (in the given schema, or the
         * default mw one if not given)
+        * @param string $table
+        * @param array|string $types
+        * @param bool|string $schema
         * @return bool
         */
        function relationExists( $table, $types, $schema = false ) {
@@ -1305,6 +1368,9 @@ __INDEXATTR__;
        /**
         * For backward compatibility, this function checks both tables and
         * views.
+        * @param string $table
+        * @param string $fname
+        * @param bool|string $schema
         * @return bool
         */
        function tableExists( $table, $fname = __METHOD__, $schema = false ) {
@@ -1368,6 +1434,7 @@ SQL;
 
        /**
         * Query whether a given schema exists. Returns true if it does, false if it doesn't.
+        * @param string $schema
         * @return bool
         */
        function schemaExists( $schema ) {
@@ -1379,6 +1446,7 @@ SQL;
 
        /**
         * Returns true if a given role (i.e. user) exists, false otherwise.
+        * @param string $roleName
         * @return bool
         */
        function roleExists( $roleName ) {
@@ -1394,6 +1462,8 @@ SQL;
 
        /**
         * pg_field_type() wrapper
+        * @param ResultWrapper|resource $res ResultWrapper or PostgreSQL query result resource
+        * @param int $index Field number, starting from 0
         * @return string
         */
        function fieldType( $res, $index ) {
@@ -1405,7 +1475,7 @@ SQL;
        }
 
        /**
-        * @param $b
+        * @param string $b
         * @return Blob
         */
        function encodeBlob( $b ) {
@@ -1425,7 +1495,7 @@ SQL;
        }
 
        /**
-        * @param $s null|bool|Blob
+        * @param null|bool|Blob $s
         * @return int|string
         */
        function addQuotes( $s ) {
@@ -1444,10 +1514,7 @@ SQL;
         * Postgres specific version of replaceVars.
         * Calls the parent version in Database.php
         *
-        * @private
-        *
         * @param string $ins SQL string, read from a stream (usually tables.sql)
-        *
         * @return string SQL string
         */
        protected function replaceVars( $ins ) {
@@ -1468,10 +1535,8 @@ SQL;
        /**
         * Various select options
         *
-        * @private
-        *
         * @param array $options an associative array of options to be turned into
-        *              an SQL query, valid keys are listed in the function.
+        *   an SQL query, valid keys are listed in the function.
         * @return array
         */
        function makeSelectOptions( $options ) {
@@ -1495,9 +1560,12 @@ SQL;
                //              : false );
                //}
 
-               if ( isset( $noKeyOptions['FOR UPDATE'] ) ) {
+               if ( isset( $options['FOR UPDATE'] ) ) {
+                       $postLimitTail .= ' FOR UPDATE OF ' . implode( ', ', $options['FOR UPDATE'] );
+               } else if ( isset( $noKeyOptions['FOR UPDATE'] ) ) {
                        $postLimitTail .= ' FOR UPDATE';
                }
+
                if ( isset( $noKeyOptions['DISTINCT'] ) || isset( $noKeyOptions['DISTINCTROW'] ) ) {
                        $startOpts .= 'DISTINCT';
                }
@@ -1505,9 +1573,6 @@ SQL;
                return array( $startOpts, $useIndex, $preLimitTail, $postLimitTail );
        }
 
-       function setFakeMaster( $enabled = true ) {
-       }
-
        function getDBname() {
                return $this->mDBname;
        }
@@ -1549,9 +1614,9 @@ SQL;
         * Check to see if a named lock is available. This is non-blocking.
         * See http://www.postgresql.org/docs/8.2/static/functions-admin.html#FUNCTIONS-ADVISORY-LOCKS
         *
-        * @param string $lockName name of lock to poll
-        * @param string $method name of method calling us
-        * @return Boolean
+        * @param string $lockName Name of lock to poll
+        * @param string $method Name of method calling us
+        * @return bool
         * @since 1.20
         */
        public function lockIsFree( $lockName, $method ) {
@@ -1565,9 +1630,9 @@ SQL;
 
        /**
         * See http://www.postgresql.org/docs/8.2/static/functions-admin.html#FUNCTIONS-ADVISORY-LOCKS
-        * @param $lockName string
-        * @param $method string
-        * @param $timeout int
+        * @param string $lockName
+        * @param string $method
+        * @param int $timeout
         * @return bool
         */
        public function lock( $lockName, $method, $timeout = 5 ) {
@@ -1590,8 +1655,8 @@ SQL;
        /**
         * See http://www.postgresql.org/docs/8.2/static/functions-admin.html#FUNCTIONS-ADVISORY-LOCKSFROM
         * PG DOCS: http://www.postgresql.org/docs/8.2/static/functions-admin.html#FUNCTIONS-ADVISORY-LOCKS
-        * @param $lockName string
-        * @param $method string
+        * @param string $lockName
+        * @param string $method
         * @return bool
         */
        public function unlock( $lockName, $method ) {
index ea35391..5aaeb65 100644 (file)
@@ -119,12 +119,13 @@ class DatabaseSqlite extends DatabaseBase {
        /**
         * Opens a database file
         *
-        * @param $fileName string
-        *
+        * @param string $fileName
         * @throws DBConnectionError
         * @return PDO|bool SQL connection or false if failed
         */
        function openFile( $fileName ) {
+               $err = false;
+
                $this->mDatabaseFile = $fileName;
                try {
                        if ( $this->mFlags & DBO_PERSISTENT ) {
@@ -136,10 +137,12 @@ class DatabaseSqlite extends DatabaseBase {
                } catch ( PDOException $e ) {
                        $err = $e->getMessage();
                }
+
                if ( !$this->mConn ) {
                        wfDebug( "DB connection error: $err\n" );
                        throw new DBConnectionError( $this, $err );
                }
+
                $this->mOpened = !!$this->mConn;
                # set error codes only, don't raise exceptions
                if ( $this->mOpened ) {
@@ -147,8 +150,10 @@ class DatabaseSqlite extends DatabaseBase {
                        # Enforce LIKE to be case sensitive, just like MySQL
                        $this->query( 'PRAGMA case_sensitive_like = 1' );
 
-                       return true;
+                       return $this->mConn;
                }
+
+               return false;
        }
 
        /**
@@ -165,7 +170,7 @@ class DatabaseSqlite extends DatabaseBase {
         * Generates a database file name. Explicitly public for installer.
         * @param string $dir Directory where database resides
         * @param string $dbName Database name
-        * @return String
+        * @return string
         */
        public static function generateFileName( $dir, $dbName ) {
                return "$dir/$dbName.sqlite";
@@ -191,7 +196,7 @@ class DatabaseSqlite extends DatabaseBase {
 
        /**
         * Returns version of currently supported SQLite fulltext search module or false if none present.
-        * @return String
+        * @return string
         */
        static function getFulltextSearchModule() {
                static $cachedResult = null;
@@ -215,12 +220,11 @@ class DatabaseSqlite extends DatabaseBase {
         * Attaches external database to our connection, see http://sqlite.org/lang_attach.html
         * for details.
         *
-        * @param string $name database name to be used in queries like
+        * @param string $name Database name to be used in queries like
         *   SELECT foo FROM dbname.table
-        * @param string $file database file name. If omitted, will be generated
+        * @param bool|string $file Database file name. If omitted, will be generated
         *   using $name and $wgSQLiteDataDir
-        * @param string $fname calling function name
-        *
+        * @param string $fname Calling function name
         * @return ResultWrapper
         */
        function attachDatabase( $name, $file = false, $fname = __METHOD__ ) {
@@ -237,7 +241,6 @@ class DatabaseSqlite extends DatabaseBase {
         * @see DatabaseBase::isWriteQuery()
         *
         * @param $sql string
-        *
         * @return bool
         */
        function isWriteQuery( $sql ) {
@@ -247,9 +250,8 @@ class DatabaseSqlite extends DatabaseBase {
        /**
         * SQLite doesn't allow buffered results or data seeking etc, so we'll use fetchAll as the result
         *
-        * @param $sql string
-        *
-        * @return ResultWrapper
+        * @param string $sql
+        * @return bool|ResultWrapper
         */
        protected function doQuery( $sql ) {
                $res = $this->mConn->query( $sql );
@@ -265,7 +267,7 @@ class DatabaseSqlite extends DatabaseBase {
        }
 
        /**
-        * @param $res ResultWrapper
+        * @param ResultWrapper|mixed $res
         */
        function freeResult( $res ) {
                if ( $res instanceof ResultWrapper ) {
@@ -276,8 +278,8 @@ class DatabaseSqlite extends DatabaseBase {
        }
 
        /**
-        * @param $res ResultWrapper
-        * @return object|bool
+        * @param ResultWrapper|array $res
+        * @return stdClass|bool
         */
        function fetchObject( $res ) {
                if ( $res instanceof ResultWrapper ) {
@@ -303,7 +305,7 @@ class DatabaseSqlite extends DatabaseBase {
        }
 
        /**
-        * @param $res ResultWrapper
+        * @param ResultWrapper|mixed $res
         * @return array|bool
         */
        function fetchRow( $res ) {
@@ -325,8 +327,7 @@ class DatabaseSqlite extends DatabaseBase {
        /**
         * The PDO::Statement class implements the array interface so count() will work
         *
-        * @param $res ResultWrapper
-        *
+        * @param ResultWrapper|array $res
         * @return int
         */
        function numRows( $res ) {
@@ -336,7 +337,7 @@ class DatabaseSqlite extends DatabaseBase {
        }
 
        /**
-        * @param $res ResultWrapper
+        * @param ResultWrapper $res
         * @return int
         */
        function numFields( $res ) {
@@ -346,7 +347,7 @@ class DatabaseSqlite extends DatabaseBase {
        }
 
        /**
-        * @param $res ResultWrapper
+        * @param ResultWrapper $res
         * @param $n
         * @return bool
         */
@@ -364,8 +365,8 @@ class DatabaseSqlite extends DatabaseBase {
        /**
         * Use MySQL's naming (accounts for prefix etc) but remove surrounding backticks
         *
-        * @param $name
-        * @param $format String
+        * @param string $name
+        * @param string $format
         * @return string
         */
        function tableName( $name, $format = 'quoted' ) {
@@ -380,8 +381,7 @@ class DatabaseSqlite extends DatabaseBase {
        /**
         * Index names have DB scope
         *
-        * @param $index string
-        *
+        * @param string $index
         * @return string
         */
        function indexName( $index ) {
@@ -399,8 +399,8 @@ class DatabaseSqlite extends DatabaseBase {
        }
 
        /**
-        * @param $res ResultWrapper
-        * @param $row
+        * @param ResultWrapper|array $res
+        * @param int $row
         */
        function dataSeek( $res, $row ) {
                if ( $res instanceof ResultWrapper ) {
@@ -453,6 +453,9 @@ class DatabaseSqlite extends DatabaseBase {
         * Returns false if the index does not exist
         * - if errors are explicitly ignored, returns NULL on failure
         *
+        * @param string $table
+        * @param string $index
+        * @param string $fname
         * @return array
         */
        function indexInfo( $table, $index, $fname = __METHOD__ ) {
@@ -473,9 +476,9 @@ class DatabaseSqlite extends DatabaseBase {
        }
 
        /**
-        * @param $table
-        * @param $index
-        * @param $fname string
+        * @param string $table
+        * @param string $index
+        * @param string $fname
         * @return bool|null
         */
        function indexUnique( $table, $index, $fname = __METHOD__ ) {
@@ -502,8 +505,7 @@ class DatabaseSqlite extends DatabaseBase {
        /**
         * Filter the options used in SELECT statements
         *
-        * @param $options array
-        *
+        * @param array $options
         * @return array
         */
        function makeSelectOptions( $options ) {
@@ -517,17 +519,17 @@ class DatabaseSqlite extends DatabaseBase {
        }
 
        /**
-        * @param $options array
+        * @param array $options
         * @return string
         */
-       function makeUpdateOptions( $options ) {
+       protected function makeUpdateOptions( $options ) {
                $options = self::fixIgnore( $options );
 
                return parent::makeUpdateOptions( $options );
        }
 
        /**
-        * @param $options array
+        * @param array $options
         * @return array
         */
        static function fixIgnore( $options ) {
@@ -542,7 +544,7 @@ class DatabaseSqlite extends DatabaseBase {
        }
 
        /**
-        * @param $options array
+        * @param array $options
         * @return string
         */
        function makeInsertOptions( $options ) {
@@ -553,6 +555,10 @@ class DatabaseSqlite extends DatabaseBase {
 
        /**
         * Based on generic method (parent) with some prior SQLite-sepcific adjustments
+        * @param string $table
+        * @param array $a
+        * @param string $fname
+        * @param array $options
         * @return bool
         */
        function insert( $table, $a, $fname = __METHOD__, $options = array() ) {
@@ -576,10 +582,10 @@ class DatabaseSqlite extends DatabaseBase {
        }
 
        /**
-        * @param $table
-        * @param $uniqueIndexes
-        * @param $rows
-        * @param $fname string
+        * @param string $table
+        * @param array $uniqueIndexes Unused
+        * @param string|array $rows
+        * @param string $fname
         * @return bool|ResultWrapper
         */
        function replace( $table, $uniqueIndexes, $rows, $fname = __METHOD__ ) {
@@ -606,6 +612,8 @@ class DatabaseSqlite extends DatabaseBase {
         * Returns the size of a text field, or -1 for "unlimited"
         * In SQLite this is SQLITE_MAX_LENGTH, by default 1GB. No way to query it though.
         *
+        * @param string $table
+        * @param string $field
         * @return int
         */
        function textFieldSize( $table, $field ) {
@@ -620,8 +628,8 @@ class DatabaseSqlite extends DatabaseBase {
        }
 
        /**
-        * @param $sqls
-        * @param $all
+        * @param string $sqls
+        * @param bool $all Whether to "UNION ALL" or not
         * @return string
         */
        function unionQueries( $sqls, $all ) {
@@ -655,7 +663,7 @@ class DatabaseSqlite extends DatabaseBase {
         * @return string wikitext of a link to the server software's web site
         */
        public function getSoftwareLink() {
-               return "[http://sqlite.org/ SQLite]";
+               return "[{{int:version-db-sqlite-url}} SQLite]";
        }
 
        /**
@@ -680,8 +688,8 @@ class DatabaseSqlite extends DatabaseBase {
         * Get information about a given field
         * Returns false if the field does not exist.
         *
-        * @param $table string
-        * @param $field string
+        * @param string $table
+        * @param string $field
         * @return SQLiteField|bool False on failure
         */
        function fieldInfo( $table, $field ) {
@@ -730,7 +738,7 @@ class DatabaseSqlite extends DatabaseBase {
        }
 
        /**
-        * @param $s string
+        * @param string $s
         * @return string
         */
        function strencode( $s ) {
@@ -758,7 +766,7 @@ class DatabaseSqlite extends DatabaseBase {
        }
 
        /**
-        * @param $s Blob|string
+        * @param Blob|string $s
         * @return string
         */
        function addQuotes( $s ) {
@@ -800,6 +808,7 @@ class DatabaseSqlite extends DatabaseBase {
 
        /**
         * No-op version of deadlockLoop
+        *
         * @return mixed
         */
        public function deadlockLoop( /*...*/ ) {
@@ -810,7 +819,7 @@ class DatabaseSqlite extends DatabaseBase {
        }
 
        /**
-        * @param $s string
+        * @param string $s
         * @return string
         */
        protected function replaceVars( $s ) {
@@ -866,8 +875,7 @@ class DatabaseSqlite extends DatabaseBase {
        /**
         * Build a concatenation list to feed into a SQL query
         *
-        * @param $stringList array
-        *
+        * @param string[] $stringList
         * @return string
         */
        function buildConcat( $stringList ) {
@@ -884,10 +892,10 @@ class DatabaseSqlite extends DatabaseBase {
 
        /**
         * @throws MWException
-        * @param $oldName
-        * @param $newName
-        * @param $temporary bool
-        * @param $fname string
+        * @param string $oldName
+        * @param string $newName
+        * @param bool $temporary
+        * @param string $fname
         * @return bool|ResultWrapper
         */
        function duplicateTableStructure( $oldName, $newName, $temporary = false, $fname = __METHOD__ ) {
@@ -919,7 +927,7 @@ class DatabaseSqlite extends DatabaseBase {
         * List all tables on the database
         *
         * @param string $prefix Only show tables with this prefix, e.g. mw_
-        * @param string $fname calling function name
+        * @param string $fname Calling function name
         *
         * @return array
         */
index 5451e98..87687db 100644 (file)
@@ -129,7 +129,7 @@ class ResultWrapper implements Iterator {
        /**
         * Get the number of rows in a result object
         *
-        * @return integer
+        * @return int
         */
        function numRows() {
                return $this->db->numRows( $this );
@@ -151,7 +151,7 @@ class ResultWrapper implements Iterator {
         * Fetch the next row from the given result object, in associative array
         * form. Fields are retrieved with $row['fieldname'].
         *
-        * @return Array
+        * @return array
         * @throws DBUnexpectedError Thrown if the database returns an error
         */
        function fetchRow() {
@@ -171,7 +171,7 @@ class ResultWrapper implements Iterator {
         * Change the position of the cursor in a result object.
         * See mysql_data_seek()
         *
-        * @param $row integer
+        * @param int $row
         */
        function seek( $row ) {
                $this->db->dataSeek( $this, $row );
@@ -302,6 +302,7 @@ class FakeResultWrapper extends ResultWrapper {
  * manually, use DatabaseBase::anyChar() and anyString() instead.
  */
 class LikeMatch {
+       /** @var string */
        private $str;
 
        /**
@@ -316,7 +317,7 @@ class LikeMatch {
        /**
         * Return the original stored string.
         *
-        * @return String
+        * @return string
         */
        public function toString() {
                return $this->str;
@@ -325,6 +326,8 @@ class LikeMatch {
 
 /**
  * An object representing a master or slave position in a replicated setup.
+ *
+ * The implementation details of this opaque type are up to the database subclass.
  */
 interface DBMasterPos {
 }
index 847e173..ae105e2 100644 (file)
@@ -59,7 +59,6 @@ abstract class LBFactory {
         * Returns the LBFactory class to use and the load balancer configuration.
         *
         * @param array $config (e.g. $wgLBFactoryConf)
-        *
         * @return string class name
         */
        public static function getLBFactoryClass( array $config ) {
@@ -99,7 +98,7 @@ abstract class LBFactory {
        /**
         * Set the instance to be the given object
         *
-        * @param $instance LBFactory
+        * @param LBFactory $instance
         */
        static function setInstance( $instance ) {
                self::destroyInstance();
@@ -108,7 +107,7 @@ abstract class LBFactory {
 
        /**
         * Construct a factory based on a configuration array (typically from $wgLBFactoryConf)
-        * @param $conf
+        * @param array $conf
         */
        abstract function __construct( $conf );
 
@@ -116,7 +115,7 @@ abstract class LBFactory {
         * Create a new load balancer object. The resulting object will be untracked,
         * not chronology-protected, and the caller is responsible for cleaning it up.
         *
-        * @param string $wiki wiki ID, or false for the current wiki
+        * @param bool|string $wiki Wiki ID, or false for the current wiki
         * @return LoadBalancer
         */
        abstract function newMainLB( $wiki = false );
@@ -124,7 +123,7 @@ abstract class LBFactory {
        /**
         * Get a cached (tracked) load balancer object.
         *
-        * @param string $wiki wiki ID, or false for the current wiki
+        * @param bool|string $wiki Wiki ID, or false for the current wiki
         * @return LoadBalancer
         */
        abstract function getMainLB( $wiki = false );
@@ -134,9 +133,8 @@ abstract class LBFactory {
         * untracked, not chronology-protected, and the caller is responsible for
         * cleaning it up.
         *
-        * @param string $cluster external storage cluster, or false for core
-        * @param string $wiki wiki ID, or false for the current wiki
-        *
+        * @param string $cluster External storage cluster, or false for core
+        * @param bool|string $wiki Wiki ID, or false for the current wiki
         * @return LoadBalancer
         */
        abstract function newExternalLB( $cluster, $wiki = false );
@@ -145,8 +143,7 @@ abstract class LBFactory {
         * Get a cached (tracked) load balancer for external storage
         *
         * @param string $cluster external storage cluster, or false for core
-        * @param string $wiki wiki ID, or false for the current wiki
-        *
+        * @param bool|string $wiki Wiki ID, or false for the current wiki
         * @return LoadBalancer
         */
        abstract function &getExternalLB( $cluster, $wiki = false );
@@ -155,7 +152,8 @@ abstract class LBFactory {
         * Execute a function for each tracked load balancer
         * The callback is called with the load balancer as the first parameter,
         * and $params passed as the subsequent parameters.
-        * @param $callback string|array
+        *
+        * @param callable $callback
         * @param array $params
         */
        abstract function forEachLB( $callback, $params = array() );
@@ -169,8 +167,9 @@ abstract class LBFactory {
 
        /**
         * Call a method of each tracked load balancer
-        * @param $methodName string
-        * @param $args array
+        *
+        * @param string $methodName
+        * @param array $args
         */
        function forEachLBCallMethod( $methodName, $args = array() ) {
                $this->forEachLB( array( $this, 'callMethod' ), array( $methodName, $args ) );
@@ -178,8 +177,8 @@ abstract class LBFactory {
 
        /**
         * Private helper for forEachLBCallMethod
-        * @param $loadBalancer
-        * @param $methodName string
+        * @param LoadBalancer $loadBalancer
+        * @param string $methodName
         * @param $args
         */
        function callMethod( $loadBalancer, $methodName, $args ) {
@@ -212,7 +211,7 @@ class LBFactorySimple extends LBFactory {
        }
 
        /**
-        * @param $wiki
+        * @param bool|string $wiki
         * @return LoadBalancer
         */
        function newMainLB( $wiki = false ) {
@@ -249,7 +248,7 @@ class LBFactorySimple extends LBFactory {
        }
 
        /**
-        * @param $wiki
+        * @param bool|string $wiki
         * @return LoadBalancer
         */
        function getMainLB( $wiki = false ) {
@@ -264,8 +263,8 @@ class LBFactorySimple extends LBFactory {
 
        /**
         * @throws MWException
-        * @param $cluster
-        * @param $wiki
+        * @param string $cluster
+        * @param bool|string $wiki
         * @return LoadBalancer
         */
        function newExternalLB( $cluster, $wiki = false ) {
@@ -280,8 +279,8 @@ class LBFactorySimple extends LBFactory {
        }
 
        /**
-        * @param $cluster
-        * @param $wiki
+        * @param string $cluster
+        * @param bool|string $wiki
         * @return array
         */
        function &getExternalLB( $cluster, $wiki = false ) {
@@ -298,8 +297,9 @@ class LBFactorySimple extends LBFactory {
         * Execute a function for each tracked load balancer
         * The callback is called with the load balancer as the first parameter,
         * and $params passed as the subsequent parameters.
-        * @param $callback
-        * @param $params array
+        *
+        * @param callable $callback
+        * @param array $params
         */
        function forEachLB( $callback, $params = array() ) {
                if ( isset( $this->mainLB ) ) {
index 2ab0554..3c1885f 100644 (file)
@@ -149,7 +149,7 @@ class LBFactoryMulti extends LBFactory {
        protected $lastSection;
 
        /**
-        * @param $conf array
+        * @param array $conf
         * @throws MWException
         */
        function __construct( $conf ) {
@@ -183,7 +183,7 @@ class LBFactoryMulti extends LBFactory {
        }
 
        /**
-        * @param $wiki bool|string
+        * @param bool|string $wiki
         * @return string
         */
        function getSectionForWiki( $wiki = false ) {
@@ -203,7 +203,7 @@ class LBFactoryMulti extends LBFactory {
        }
 
        /**
-        * @param $wiki bool|string
+        * @param bool|string $wiki
         * @return LoadBalancer
         */
        function newMainLB( $wiki = false ) {
@@ -226,7 +226,7 @@ class LBFactoryMulti extends LBFactory {
        }
 
        /**
-        * @param $wiki bool|string
+        * @param bool|string $wiki
         * @return LoadBalancer
         */
        function getMainLB( $wiki = false ) {
@@ -243,7 +243,7 @@ class LBFactoryMulti extends LBFactory {
 
        /**
         * @param string $cluster
-        * @param bool $wiki
+        * @param bool|string $wiki
         * @throws MWException
         * @return LoadBalancer
         */
@@ -263,8 +263,8 @@ class LBFactoryMulti extends LBFactory {
        }
 
        /**
-        * @param $cluster
-        * @param $wiki
+        * @param string $cluster external storage cluster, or false for core
+        * @param bool|string $wiki Wiki ID, or false for the current wiki
         * @return LoadBalancer
         */
        function &getExternalLB( $cluster, $wiki = false ) {
@@ -280,9 +280,9 @@ class LBFactoryMulti extends LBFactory {
        /**
         * Make a new load balancer object based on template and load array
         *
-        * @param $template
-        * @param $loads array
-        * @param $groupLoads
+        * @param array $template
+        * @param array $loads
+        * @param array $groupLoads
         * @return LoadBalancer
         */
        function newLoadBalancer( $template, $loads, $groupLoads ) {
@@ -299,9 +299,9 @@ class LBFactoryMulti extends LBFactory {
        /**
         * Make a server array as expected by LoadBalancer::__construct, using a template and load array
         *
-        * @param $template
-        * @param $loads array
-        * @param $groupLoads
+        * @param array $template
+        * @param array $loads
+        * @param array $groupLoads
         * @return array
         */
        function makeServerArray( $template, $loads, $groupLoads ) {
@@ -343,7 +343,7 @@ class LBFactoryMulti extends LBFactory {
 
        /**
         * Take a group load array indexed by group then server, and reindex it by server then group
-        * @param $groupLoads
+        * @param array $groupLoads
         * @return array
         */
        function reindexGroupLoads( $groupLoads ) {
@@ -359,7 +359,7 @@ class LBFactoryMulti extends LBFactory {
 
        /**
         * Get the database name and prefix based on the wiki ID
-        * @param $wiki bool
+        * @param bool|string $wiki
         * @return array
         */
        function getDBNameAndPrefix( $wiki = false ) {
@@ -376,8 +376,8 @@ class LBFactoryMulti extends LBFactory {
         * Execute a function for each tracked load balancer
         * The callback is called with the load balancer as the first parameter,
         * and $params passed as the subsequent parameters.
-        * @param $callback
-        * @param $params array
+        * @param callable $callback
+        * @param array $params
         */
        function forEachLB( $callback, $params = array() ) {
                foreach ( $this->mainLBs as $lb ) {
index 83271ec..66e9d12 100644 (file)
@@ -25,6 +25,7 @@
  * An LBFactory class that always returns a single database object.
  */
 class LBFactorySingle extends LBFactory {
+       /** @var LoadBalancerSingle */
        protected $lb;
 
        /**
@@ -36,8 +37,7 @@ class LBFactorySingle extends LBFactory {
        }
 
        /**
-        * @param $wiki bool|string
-        *
+        * @param bool|string $wiki
         * @return LoadBalancerSingle
         */
        function newMainLB( $wiki = false ) {
@@ -45,8 +45,7 @@ class LBFactorySingle extends LBFactory {
        }
 
        /**
-        * @param $wiki bool|string
-        *
+        * @param bool|string $wiki
         * @return LoadBalancerSingle
         */
        function getMainLB( $wiki = false ) {
@@ -54,9 +53,8 @@ class LBFactorySingle extends LBFactory {
        }
 
        /**
-        * @param $cluster
-        * @param $wiki bool|string
-        *
+        * @param string $cluster External storage cluster, or false for core
+        * @param bool|string $wiki Wiki ID, or false for the current wiki
         * @return LoadBalancerSingle
         */
        function newExternalLB( $cluster, $wiki = false ) {
@@ -64,9 +62,8 @@ class LBFactorySingle extends LBFactory {
        }
 
        /**
-        * @param $cluster
-        * @param $wiki bool|string
-        *
+        * @param string $cluster external storage cluster, or false for core
+        * @param bool|string $wiki Wiki ID, or false for the current wiki
         * @return LoadBalancerSingle
         */
        function &getExternalLB( $cluster, $wiki = false ) {
@@ -74,8 +71,8 @@ class LBFactorySingle extends LBFactory {
        }
 
        /**
-        * @param $callback string|array
-        * @param $params array
+        * @param string|array $callback
+        * @param array $params
         */
        function forEachLB( $callback, $params = array() ) {
                call_user_func_array( $callback, array_merge( array( $this->lb ), $params ) );
@@ -104,8 +101,8 @@ class LoadBalancerSingle extends LoadBalancer {
 
        /**
         *
-        * @param $server string
-        * @param $dbNameOverride bool
+        * @param string $server
+        * @param bool $dbNameOverride
         *
         * @return DatabaseBase
         */
index 7dcb88f..c88ad05 100644 (file)
  */
 class LoadBalancer {
        private $mServers, $mConns, $mLoads, $mGroupLoads;
+
+       /** @var bool|DatabaseBase Database connection that caused a problem */
        private $mErrorConnection;
        private $mReadIndex, $mAllowLagged;
-       private $mWaitForPos, $mWaitTimeout;
+
+       /** @var bool|DBMasterPos False if not set */
+       private $mWaitForPos;
+
+       private $mWaitTimeout;
        private $mLaggedSlaveMode, $mLastError = 'Unknown error';
        private $mParentInfo, $mLagTimes;
        private $mLoadMonitorClass, $mLoadMonitor;
 
        /**
         * @param array $params with keys:
-        *    servers           Required. Array of server info structures.
-        *    masterWaitTimeout Replication lag wait timeout
-        *    loadMonitor       Name of a class used to fetch server lag and load.
+        *   servers           Required. Array of server info structures.
+        *   masterWaitTimeout Replication lag wait timeout
+        *   loadMonitor       Name of a class used to fetch server lag and load.
         * @throws MWException
         */
        function __construct( $params ) {
@@ -108,7 +114,7 @@ class LoadBalancer {
        /**
         * Get or set arbitrary data used by the parent object, usually an LBFactory
         * @param $x
-        * @return Mixed
+        * @return mixed
         */
        function parentInfo( $x = null ) {
                return wfSetVar( $this->mParentInfo, $x );
@@ -120,8 +126,7 @@ class LoadBalancer {
         *
         * @deprecated since 1.21, use ArrayUtils::pickRandom()
         *
-        * @param $weights array
-        *
+        * @param array $weights
         * @return bool|int|string
         */
        function pickRandom( $weights ) {
@@ -129,8 +134,8 @@ class LoadBalancer {
        }
 
        /**
-        * @param $loads array
-        * @param $wiki bool
+        * @param array $loads
+        * @param bool|string $wiki Wiki to get non-lagged for
         * @return bool|int|string
         */
        function getRandomNonLagged( $loads, $wiki = false ) {
@@ -177,8 +182,8 @@ class LoadBalancer {
         * always return a consistent index during a given invocation
         *
         * Side effect: opens connections to databases
-        * @param $group bool
-        * @param $wiki bool
+        * @param bool|string $group
+        * @param bool|string $wiki
         * @throws MWException
         * @return bool|int|string
         */
@@ -273,7 +278,7 @@ class LoadBalancer {
 
                                // Perform post-connection backoff
                                $threshold = isset( $this->mServers[$i]['max threads'] )
-                                       ? $this->mServers[$i]['max threads'] : false;
+                                       ? $this->mServers[$i]['max threads'] : 0;
                                $backoff = $this->getLoadMonitor()->postConnectionBackoff( $conn, $threshold );
 
                                // Decrement reference counter, we are finished with this connection.
@@ -338,7 +343,7 @@ class LoadBalancer {
 
        /**
         * Wait for a specified number of microseconds, and return the period waited
-        * @param $t int
+        * @param int $t
         * @return int
         */
        function sleep( $t ) {
@@ -354,7 +359,7 @@ class LoadBalancer {
         * Set the master wait position
         * If a DB_SLAVE connection has been opened already, waits
         * Otherwise sets a variable telling it to wait if such a connection is opened
-        * @param $pos DBMasterPos
+        * @param DBMasterPos $pos
         */
        public function waitFor( $pos ) {
                wfProfileIn( __METHOD__ );
@@ -372,7 +377,7 @@ class LoadBalancer {
 
        /**
         * Set the master wait position and wait for ALL slaves to catch up to it
-        * @param $pos DBMasterPos
+        * @param DBMasterPos $pos
         */
        public function waitForAll( $pos ) {
                wfProfileIn( __METHOD__ );
@@ -390,7 +395,7 @@ class LoadBalancer {
         * Get any open connection to a given server index, local or foreign
         * Returns false if there is no connection open
         *
-        * @param $i int
+        * @param int $i
         * @return DatabaseBase|bool False on failure
         */
        function getAnyOpenConnection( $i ) {
@@ -575,7 +580,7 @@ class LoadBalancer {
         *
         * @param integer $db
         * @param mixed $groups
-        * @param string $wiki
+        * @param bool|string $wiki
         * @return DBConnRef
         */
        public function getConnectionRef( $db, $groups = array(), $wiki = false ) {
@@ -591,7 +596,7 @@ class LoadBalancer {
         *
         * @param integer $db
         * @param mixed $groups
-        * @param string $wiki
+        * @param bool|string $wiki
         * @return DBConnRef
         */
        public function getLazyConnectionRef( $db, $groups = array(), $wiki = false ) {
@@ -607,7 +612,7 @@ class LoadBalancer {
         * error will be available via $this->mErrorConnection.
         *
         * @param $i Integer server index
-        * @param string $wiki wiki ID to open
+        * @param bool|string $wiki wiki ID to open
         * @return DatabaseBase
         *
         * @access private
@@ -802,7 +807,7 @@ class LoadBalancer {
        /**
         * Returns true if the specified index is a valid server index
         *
-        * @param $i
+        * @param string $i
         * @return bool
         */
        function haveIndex( $i ) {
@@ -812,7 +817,7 @@ class LoadBalancer {
        /**
         * Returns true if the specified index is valid and has non-zero load
         *
-        * @param $i
+        * @param string $i
         * @return bool
         */
        function isNonZeroLoad( $i ) {
@@ -831,7 +836,7 @@ class LoadBalancer {
        /**
         * Get the host name or IP address of the server with the specified index
         * Prefer a readable name if available.
-        * @param $i
+        * @param string $i
         * @return string
         */
        function getServerName( $i ) {
@@ -900,6 +905,7 @@ class LoadBalancer {
        function closeAll() {
                foreach ( $this->mConns as $conns2 ) {
                        foreach ( $conns2 as $conns3 ) {
+                               /** @var DatabaseBase $conn */
                                foreach ( $conns3 as $conn ) {
                                        $conn->close();
                                }
@@ -916,7 +922,7 @@ class LoadBalancer {
         * Deprecated function, typo in function name
         *
         * @deprecated in 1.18
-        * @param $conn
+        * @param DatabaseBase $conn
         */
        function closeConnecton( $conn ) {
                wfDeprecated( __METHOD__, '1.18' );
@@ -927,7 +933,7 @@ class LoadBalancer {
         * Close a connection
         * Using this function makes sure the LoadBalancer knows the connection is closed.
         * If you use $conn->close() directly, the load balancer won't update its state.
-        * @param $conn DatabaseBase
+        * @param DatabaseBase $conn
         */
        function closeConnection( $conn ) {
                $done = false;
@@ -954,6 +960,7 @@ class LoadBalancer {
        function commitAll() {
                foreach ( $this->mConns as $conns2 ) {
                        foreach ( $conns2 as $conns3 ) {
+                               /** @var DatabaseBase[] $conns3 */
                                foreach ( $conns3 as $conn ) {
                                        if ( $conn->trxLevel() ) {
                                                $conn->commit( __METHOD__, 'flush' );
@@ -973,6 +980,7 @@ class LoadBalancer {
                        if ( empty( $conns2[$masterIndex] ) ) {
                                continue;
                        }
+                       /** @var DatabaseBase $conn */
                        foreach ( $conns2[$masterIndex] as $conn ) {
                                if ( $conn->trxLevel() && $conn->writesOrCallbacksPending() ) {
                                        $conn->commit( __METHOD__, 'flush' );
@@ -998,7 +1006,7 @@ class LoadBalancer {
 
        /**
         * Disables/enables lag checks
-        * @param $mode null
+        * @param null|bool $mode
         * @return bool
         */
        function allowLagged( $mode = null ) {
@@ -1017,6 +1025,7 @@ class LoadBalancer {
                $success = true;
                foreach ( $this->mConns as $conns2 ) {
                        foreach ( $conns2 as $conns3 ) {
+                               /** @var DatabaseBase[] $conns3 */
                                foreach ( $conns3 as $conn ) {
                                        if ( !$conn->ping() ) {
                                                $success = false;
@@ -1030,7 +1039,7 @@ class LoadBalancer {
 
        /**
         * Call a function with each open connection object
-        * @param $callback
+        * @param callable $callback
         * @param array $params
         */
        function forEachOpenConnection( $callback, $params = array() ) {
@@ -1050,8 +1059,7 @@ class LoadBalancer {
         * May attempt to open connections to slaves on the default DB. If there is
         * no lag, the maximum lag will be reported as -1.
         *
-        * @param string $wiki Wiki ID, or false for the default database
-        *
+        * @param bool|string $wiki Wiki ID, or false for the default database
         * @return array ( host, max lag, index of max lagged host )
         */
        function getMaxLag( $wiki = false ) {
@@ -1086,8 +1094,7 @@ class LoadBalancer {
         * Get lag time for each server
         * Results are cached for a short time in memcached, and indefinitely in the process cache
         *
-        * @param $wiki
-        *
+        * @param string|bool $wiki
         * @return array
         */
        function getLagTimes( $wiki = false ) {
@@ -1118,8 +1125,7 @@ class LoadBalancer {
         * function instead of Database::getLag() avoids a fatal error in this
         * case on many installations.
         *
-        * @param $conn DatabaseBase
-        *
+        * @param DatabaseBase $conn
         * @return int
         */
        function safeGetLag( $conn ) {
@@ -1148,14 +1154,16 @@ class LoadBalancer {
 class DBConnRef implements IDatabase {
        /** @var LoadBalancer */
        protected $lb;
+
        /** @var DatabaseBase|null */
        protected $conn;
-       /** @var Array|null */
+
+       /** @var array|null */
        protected $params;
 
        /**
-        * @param $lb LoadBalancer
-        * @param $conn DatabaseBase|array Connection or (server index, group, wiki ID) array
+        * @param LoadBalancer $lb
+        * @param DatabaseBase|array $conn Connection or (server index, group, wiki ID) array
         */
        public function __construct( LoadBalancer $lb, $conn ) {
                $this->lb = $lb;
index 5854456..651c499 100644 (file)
@@ -37,7 +37,7 @@ interface LoadMonitor {
        /**
         * Perform pre-connection load ratio adjustment.
         * @param array $loads
-        * @param string|bool $group the selected query group. Default: false
+        * @param string|bool $group The selected query group. Default: false
         * @param string|bool $wiki Default: false
         */
        function scaleLoads( &$loads, $group = false, $wiki = false );
@@ -55,16 +55,16 @@ interface LoadMonitor {
         * to the running thread count. The threshold may be false, which indicates
         * that the sysadmin has not configured this feature.
         *
-        * @param $conn DatabaseBase
-        * @param $threshold Float
+        * @param DatabaseBase $conn
+        * @param float $threshold
         */
        function postConnectionBackoff( $conn, $threshold );
 
        /**
         * Return an estimate of replication lag for each server
         *
-        * @param $serverIndexes
-        * @param $wiki
+        * @param array $serverIndexes
+        * @param string $wiki
         *
         * @return array
         */
@@ -82,8 +82,8 @@ class LoadMonitorNull implements LoadMonitor {
        }
 
        /**
-        * @param $serverIndexes
-        * @param $wiki
+        * @param array $serverIndexes
+        * @param string $wiki
         * @return array
         */
        function getLagTimes( $serverIndexes, $wiki ) {
@@ -98,9 +98,7 @@ class LoadMonitorNull implements LoadMonitor {
  * @ingroup Database
  */
 class LoadMonitorMySQL implements LoadMonitor {
-       /**
-        * @var LoadBalancer
-        */
+       /** @var LoadBalancer */
        public $parent;
 
        /**
@@ -111,16 +109,16 @@ class LoadMonitorMySQL implements LoadMonitor {
        }
 
        /**
-        * @param $loads
-        * @param $group bool
-        * @param $wiki bool
+        * @param array $loads
+        * @param bool $group
+        * @param bool $wiki
         */
        function scaleLoads( &$loads, $group = false, $wiki = false ) {
        }
 
        /**
-        * @param $serverIndexes
-        * @param $wiki
+        * @param array $serverIndexes
+        * @param string $wiki
         * @return array
         */
        function getLagTimes( $serverIndexes, $wiki ) {
@@ -192,8 +190,8 @@ class LoadMonitorMySQL implements LoadMonitor {
        }
 
        /**
-        * @param $conn DatabaseBase
-        * @param $threshold
+        * @param DatabaseBase|DatabaseMySQLBase $conn
+        * @param int $threshold
         * @return int
         */
        function postConnectionBackoff( $conn, $threshold ) {
index e47bc67..3f91e0a 100644 (file)
@@ -246,9 +246,9 @@ class ORMTable extends DBAccessBase implements IORMTable {
         * @param array $conditions
         * @param array $options
         * @param null|string $functionName
-        *
         * @return ResultWrapper
-        * @throws DBQueryError if the quey failed (even if the database was in ignoreErrors mode).
+        * @throws DBQueryError if the query failed (even if the database was in
+        *   ignoreErrors mode).
         */
        public function rawSelect( $fields = null, array $conditions = array(),
                array $options = array(), $functionName = null
@@ -378,7 +378,7 @@ class ORMTable extends DBAccessBase implements IORMTable {
         * @param array $options
         * @param string|null $functionName
         *
-        * @return ResultWrapper
+        * @return stdClass
         */
        public function rawSelectRow( array $fields, array $conditions = array(),
                array $options = array(), $functionName = null
@@ -825,7 +825,7 @@ class ORMTable extends DBAccessBase implements IORMTable {
         * @since 1.20
         *
         * @param stdClass $result
-        *
+        * @throws MWException
         * @return array
         */
        public function getFieldsFromDBResult( stdClass $result ) {
index bb21f1b..f5d63b9 100644 (file)
@@ -104,6 +104,10 @@ abstract class FileBackend {
        /** @var FileJournal */
        protected $fileJournal;
 
+       /** Flags for supported features */
+       const ATTR_HEADERS  = 1;
+       const ATTR_METADATA = 2;
+
        /**
         * Create a new backend instance from configuration.
         * This should only be called from within FileBackendGroup.
@@ -200,6 +204,27 @@ abstract class FileBackend {
                return ( $this->readOnly != '' ) ? $this->readOnly : false;
        }
 
+       /**
+        * Get the a bitfield of extra features supported by the backend medium
+        *
+        * @return integer Bitfield of FileBackend::ATTR_* flags
+        * @since 1.23
+        */
+       public function getFeatures() {
+               return 0;
+       }
+
+       /**
+        * Check if the backend medium supports a field of extra features
+        *
+        * @return integer Bitfield of FileBackend::ATTR_* flags
+        * @return bool
+        * @since 1.23
+        */
+       final public function hasFeatures( $bitfield ) {
+               return ( $this->getFeatures() & $bitfield ) === $bitfield;
+       }
+
        /**
         * This is the main entry point into the backend for write operations.
         * Callers supply an ordered list of operations to perform as a transaction.
@@ -901,6 +926,26 @@ abstract class FileBackend {
         */
        abstract public function getFileContentsMulti( array $params );
 
+       /**
+        * Get metadata about a file at a storage path in the backend.
+        * If the file does not exist, then this returns false.
+        * Otherwise, the result is an associative array that includes:
+        *   - headers  : map of HTTP headers used for GET/HEAD requests (name => value)
+        *   - metadata : map of file metadata (name => value)
+        * Metadata keys and headers names will be returned in all lower-case.
+        * Additional values may be included for internal use only.
+        *
+        * Use FileBackend::hasFeatures() to check how well this is supported.
+        *
+        * @param array $params
+        * $params include:
+        *   - src    : source storage path
+        *   - latest : use the latest available data
+        * @return Array|bool Returns false on failure
+        * @since 1.23
+        */
+       abstract public function getFileXAttributes( array $params );
+
        /**
         * Get the size (bytes) of a file at a storage path in the backend.
         *
index 1c9832d..1b2860a 100644 (file)
@@ -567,6 +567,11 @@ class FileBackendMultiWrite extends FileBackend {
                return $this->backends[$this->masterIndex]->getFileStat( $realParams );
        }
 
+       public function getFileXAttributes( array $params ) {
+               $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
+               return $this->backends[$this->masterIndex]->getFileXAttributes( $realParams );
+       }
+
        public function getFileContentsMulti( array $params ) {
                $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
                $contentsM = $this->backends[$this->masterIndex]->getFileContentsMulti( $realParams );
@@ -645,6 +650,10 @@ class FileBackendMultiWrite extends FileBackend {
                return $this->backends[$this->masterIndex]->getFileList( $realParams );
        }
 
+       public function getFeatures() {
+               return $this->backends[$this->masterIndex]->getFeatures();
+       }
+
        public function clearCache( array $paths = null ) {
                foreach ( $this->backends as $backend ) {
                        $realPaths = is_array( $paths ) ? $this->substPaths( $paths, $backend ) : null;
index fe3a068..13f6436 100644 (file)
@@ -655,10 +655,15 @@ abstract class FileBackendStore extends FileBackend {
                                $this->cheapCache->set( $path, 'sha1',
                                        array( 'hash' => $stat['sha1'], 'latest' => $latest ) );
                        }
+                       if ( isset( $stat['xattr'] ) ) { // some backends store headers/metadata
+                               $stat['xattr'] = self::normalizeXAttributes( $stat['xattr'] );
+                               $this->cheapCache->set( $path, 'xattr',
+                                       array( 'map' => $stat['xattr'], 'latest' => $latest ) );
+                       }
                } elseif ( $stat === false ) { // file does not exist
                        $this->cheapCache->set( $path, 'stat', $latest ? 'NOT_EXIST_LATEST' : 'NOT_EXIST' );
-                       $this->cheapCache->set( $path, 'sha1', // the SHA-1 must be false too
-                               array( 'hash' => false, 'latest' => $latest ) );
+                       $this->cheapCache->set( $path, 'xattr', array( 'map' => false, 'latest' => $latest ) );
+                       $this->cheapCache->set( $path, 'sha1', array( 'hash' => false, 'latest' => $latest ) );
                        wfDebug( __METHOD__ . ": File $path does not exist.\n" );
                } else { // an error occurred
                        wfDebug( __METHOD__ . ": Could not stat file $path.\n" );
@@ -697,6 +702,39 @@ abstract class FileBackendStore extends FileBackend {
                return $contents;
        }
 
+       final public function getFileXAttributes( array $params ) {
+               $path = self::normalizeStoragePath( $params['src'] );
+               if ( $path === null ) {
+                       return false; // invalid storage path
+               }
+               $section = new ProfileSection( __METHOD__ . "-{$this->name}" );
+               $latest = !empty( $params['latest'] ); // use latest data?
+               if ( $this->cheapCache->has( $path, 'xattr', self::CACHE_TTL ) ) {
+                       $stat = $this->cheapCache->get( $path, 'xattr' );
+                       // If we want the latest data, check that this cached
+                       // value was in fact fetched with the latest available data.
+                       if ( !$latest || $stat['latest'] ) {
+                               return $stat['map'];
+                       }
+               }
+               wfProfileIn( __METHOD__ . '-miss' );
+               wfProfileIn( __METHOD__ . '-miss-' . $this->name );
+               $fields = $this->doGetFileXAttributes( $params );
+               $fields = is_array( $fields ) ? self::normalizeXAttributes( $fields ) : false;
+               wfProfileOut( __METHOD__ . '-miss-' . $this->name );
+               wfProfileOut( __METHOD__ . '-miss' );
+               $this->cheapCache->set( $path, 'xattr', array( 'map' => $fields, 'latest' => $latest ) );
+               return $fields;
+       }
+
+       /**
+        * @see FileBackendStore::getFileXAttributes()
+        * @return bool|string
+        */
+       protected function doGetFileXAttributes( array $params ) {
+               return array( 'headers' => array(), 'metadata' => array() ); // not supported
+       }
+
        final public function getFileSha1Base36( array $params ) {
                $path = self::normalizeStoragePath( $params['src'] );
                if ( $path === null ) {
@@ -1625,10 +1663,33 @@ abstract class FileBackendStore extends FileBackend {
                                        $this->cheapCache->set( $path, 'sha1',
                                                array( 'hash' => $val['sha1'], 'latest' => $val['latest'] ) );
                                }
+                               if ( isset( $val['xattr'] ) ) { // some backends store headers/metadata
+                                       $val['xattr'] = self::normalizeXAttributes( $val['xattr'] );
+                                       $this->cheapCache->set( $path, 'xattr',
+                                               array( 'map' => $val['xattr'], 'latest' => $val['latest'] ) );
+                               }
                        }
                }
        }
 
+       /**
+        * Normalize file headers/metadata to the FileBackend::getFileXAttributes() format
+        *
+        * @param array $xattr
+        * @return array
+        * @since 1.22
+        */
+       final protected static function normalizeXAttributes( array $xattr ) {
+               $newXAttr = array( 'headers' => array(), 'metadata' => array() );
+               foreach ( $xattr['headers'] as $name => $value ) {
+                       $newXAttr['headers'][strtolower( $name )] = $value;
+               }
+               foreach ( $xattr['metadata'] as $name => $value ) {
+                       $newXAttr['metadata'][strtolower( $name )] = $value;
+               }
+               return $newXAttr;
+       }
+
        /**
         * Set the 'concurrency' option from a list of operation options
         *
index 3924c12..6f40957 100644 (file)
@@ -155,7 +155,9 @@ class MemoryFileBackend extends FileBackendStore {
                        if ( $src === null || !isset( $this->files[$src] ) ) {
                                $fsFile = null;
                        } else {
-                               $fsFile = TempFSFile::factory( 'localcopy_' );
+                               // Create a new temporary file with the same extension...
+                               $ext = FileBackend::extensionFromPath( $src );
+                               $fsFile = TempFSFile::factory( 'localcopy_', $ext );
                                if ( $fsFile ) {
                                        $bytes = file_put_contents( $fsFile->getPath(), $this->files[$src]['data'] );
                                        if ( $bytes !== strlen( $this->files[$src]['data'] ) ) {
index 8790f05..b459b77 100644 (file)
@@ -89,12 +89,12 @@ class SwiftFileBackend extends FileBackendStore {
         *   - cacheAuthInfo      : Whether to cache authentication tokens in APC, XCache, ect.
         *                          If those are not available, then the main cache will be used.
         *                          This is probably insecure in shared hosting environments.
-        *   - rgwS3AccessKey     : Ragos Gateway S3 "access key" value on the account.
+        *   - rgwS3AccessKey     : Rados Gateway S3 "access key" value on the account.
         *                          Do not set this until it has been set in the backend.
         *                          This is used for generating expiring pre-authenticated URLs.
         *                          Only use this when using rgw and to work around
         *                          http://tracker.newdream.net/issues/3454.
-        *   - rgwS3SecretKey     : Ragos Gateway S3 "secret key" value on the account.
+        *   - rgwS3SecretKey     : Rados Gateway S3 "secret key" value on the account.
         *                          Do not set this until it has been set in the backend.
         *                          This is used for generating expiring pre-authenticated URLs.
         *                          Only use this when using rgw and to work around
@@ -142,6 +142,10 @@ class SwiftFileBackend extends FileBackendStore {
                $this->srvCache = $this->srvCache ?: new EmptyBagOStuff();
        }
 
+       public function getFeatures() {
+               return ( FileBackend::ATTR_HEADERS | FileBackend::ATTR_METADATA );
+       }
+
        protected function resolveContainerPath( $container, $relStoragePath ) {
                if ( !mb_check_encoding( $relStoragePath, 'UTF-8' ) ) { // mb_string required by CF
                        return null; // not UTF-8, makes it hard to use CF and the swift HTTP API
@@ -179,6 +183,8 @@ class SwiftFileBackend extends FileBackendStore {
                                        continue; // blacklisted
                                } elseif ( preg_match( '/^(x-)?content-/', $name ) ) {
                                        $headers[$name] = $value; // allowed
+                               } elseif ( preg_match( '/^content-(disposition)/', $name ) ) {
+                                       $headers[$name] = $value; // allowed
                                }
                        }
                }
@@ -189,7 +195,7 @@ class SwiftFileBackend extends FileBackendStore {
                                $part = trim( $part );
                                $new = ( $disposition === '' ) ? $part : "{$disposition};{$part}";
                                if ( strlen( $new ) <= 255 ) {
-                                       $res = $new;
+                                       $disposition = $new;
                                } else {
                                        break; // too long; sigh
                                }
@@ -632,7 +638,7 @@ class SwiftFileBackend extends FileBackendStore {
                list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $this->http->run( array(
                        'method'  => 'HEAD',
                        'url'     => $this->storageUrl( $auth, $srcCont, $srcRel ),
-                       'headers' => $this->authTokenHeaders( $auth )
+                       'headers' => $this->authTokenHeaders( $auth ) + $this->headersFromParams( $params )
                ) );
                if ( $rcode === 200 || $rcode === 204 ) {
                        // Update the object if it is missing some headers
@@ -986,6 +992,20 @@ class SwiftFileBackend extends FileBackendStore {
                $this->cheapCache->set( $path, 'stat', $val );
        }
 
+       protected function doGetFileXAttributes( array $params ) {
+               $stat = $this->getFileStat( $params );
+               if ( $stat ) {
+                       if ( !isset( $stat['xattr'] ) ) {
+                               // Stat entries filled by file listings don't include metadata/headers
+                               $this->clearCache( array( $params['src'] ) );
+                               $stat = $this->getFileStat( $params );
+                       }
+                       return $stat['xattr'];
+               } else {
+                       return false;
+               }
+       }
+
        protected function doGetFileSha1base36( array $params ) {
                $stat = $this->getFileStat( $params );
                if ( $stat ) {
@@ -1081,7 +1101,7 @@ class SwiftFileBackend extends FileBackendStore {
                                fclose( $op['stream'] ); // close open handle
                                if ( $rcode >= 200 && $rcode <= 299
                                        // double check that the disk is not full/broken
-                                       && $tmpFile->getSize() == $rhdrs['content-length']
+                                       && $tmpFiles[$path]->getSize() == $rhdrs['content-length']
                                ) {
                                        // good
                                } elseif ( $rcode === 404 ) {
@@ -1116,8 +1136,10 @@ class SwiftFileBackend extends FileBackendStore {
 
                        if ( $this->swiftTempUrlKey != '' ) {
                                $url = $this->storageUrl( $auth, $srcCont, $srcRel );
+                               // Swift wants the signature based on the unencoded object name
+                               $contPath = parse_url( $this->storageUrl( $auth, $srcCont ), PHP_URL_PATH );
                                $signature = hash_hmac( 'sha1',
-                                       "GET\n{$expires}\n" . parse_url( $url, PHP_URL_PATH ),
+                                       "GET\n{$expires}\n{$contPath}/{$srcRel}",
                                        $this->swiftTempUrlKey
                                );
                                return "{$url}?temp_url_sig={$signature}&temp_url_expires={$expires}";
@@ -1163,7 +1185,7 @@ class SwiftFileBackend extends FileBackendStore {
        protected function headersFromParams( array $params ) {
                $hdrs = array();
                if ( !empty( $params['latest'] ) ) {
-                       $hdrs[] = 'X-Newest: true';
+                       $hdrs['x-newest'] = 'true';
                }
 
                return $hdrs;
diff --git a/includes/filebackend/lockmanager/LSLockManager.php b/includes/filebackend/lockmanager/LSLockManager.php
deleted file mode 100644 (file)
index 539a780..0000000
+++ /dev/null
@@ -1,225 +0,0 @@
-<?php
-/**
- * Version of LockManager based on using lock daemon servers.
- *
- * 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 LockManager
- */
-
-/**
- * Manage locks using a lock daemon server.
- *
- * Version of LockManager based on using lock daemon servers.
- * This is meant for multi-wiki systems that may share files.
- * All locks are non-blocking, which avoids deadlocks.
- *
- * All lock requests for a resource, identified by a hash string, will map
- * to one bucket. Each bucket maps to one or several peer servers, each
- * running LockServerDaemon.php, listening on a designated TCP port.
- * A majority of peers must agree for a lock to be acquired.
- *
- * @ingroup LockManager
- * @since 1.19
- */
-class LSLockManager extends QuorumLockManager {
-       /** @var array Mapping of lock types to the type actually used */
-       protected $lockTypeMap = array(
-               self::LOCK_SH => self::LOCK_SH,
-               self::LOCK_UW => self::LOCK_SH,
-               self::LOCK_EX => self::LOCK_EX
-       );
-
-       /** @var array Map of server names to server config */
-       protected $lockServers; // (server name => server config array)
-
-       /** @var array Map Server connections (server name => resource) */
-       protected $conns = array();
-
-       protected $connTimeout; // float number of seconds
-       protected $session = ''; // random SHA-1 string
-
-       /**
-        * Construct a new instance from configuration.
-        *
-        * @param array $config Paramaters include:
-        *   - lockServers  : Associative array of server names to configuration.
-        *                    Configuration is an associative array that includes:
-        *                      - host    : IP address/hostname
-        *                      - port    : TCP port
-        *                      - authKey : Secret string the lock server uses
-        *   - srvsByBucket : Array of 1-16 consecutive integer keys, starting from 0,
-        *                    each having an odd-numbered list of server names (peers) as values.
-        *   - connTimeout  : Lock server connection attempt timeout. [optional]
-        */
-       public function __construct( array $config ) {
-               parent::__construct( $config );
-
-               $this->lockServers = $config['lockServers'];
-               // Sanitize srvsByBucket config to prevent PHP errors
-               $this->srvsByBucket = array_filter( $config['srvsByBucket'], 'is_array' );
-               $this->srvsByBucket = array_values( $this->srvsByBucket ); // consecutive
-
-               if ( isset( $config['connTimeout'] ) ) {
-                       $this->connTimeout = $config['connTimeout'];
-               } else {
-                       $this->connTimeout = 3; // use some sane amount
-               }
-
-               $this->session = wfRandomString( 32 ); // 128 bits
-       }
-
-       /**
-        * @see QuorumLockManager::getLocksOnServer()
-        * @param string $lockSrv
-        * @param array $paths
-        * @param int $type
-        * @return Status
-        */
-       protected function getLocksOnServer( $lockSrv, array $paths, $type ) {
-               $status = Status::newGood();
-
-               // Send out the command and get the response...
-               $type = ( $type == self::LOCK_SH ) ? 'SH' : 'EX';
-               $keys = array_unique( array_map( array( $this, 'sha1Base36Absolute' ), $paths ) );
-               $response = $this->sendCommand( $lockSrv, 'ACQUIRE', $type, $keys );
-
-               if ( $response !== 'ACQUIRED' ) {
-                       foreach ( $paths as $path ) {
-                               $status->fatal( 'lockmanager-fail-acquirelock', $path );
-                       }
-               }
-
-               return $status;
-       }
-
-       /**
-        * @see QuorumLockManager::freeLocksOnServer()
-        * @param string $lockSrv
-        * @param array $paths
-        * @param int $type
-        * @return Status
-        */
-       protected function freeLocksOnServer( $lockSrv, array $paths, $type ) {
-               $status = Status::newGood();
-
-               // Send out the command and get the response...
-               $type = ( $type == self::LOCK_SH ) ? 'SH' : 'EX';
-               $keys = array_unique( array_map( array( $this, 'sha1Base36Absolute' ), $paths ) );
-               $response = $this->sendCommand( $lockSrv, 'RELEASE', $type, $keys );
-
-               if ( $response !== 'RELEASED' ) {
-                       foreach ( $paths as $path ) {
-                               $status->fatal( 'lockmanager-fail-releaselock', $path );
-                       }
-               }
-
-               return $status;
-       }
-
-       /**
-        * @see QuorumLockManager::releaseAllLocks()
-        * @return Status
-        */
-       protected function releaseAllLocks() {
-               $status = Status::newGood();
-
-               foreach ( $this->conns as $lockSrv => $conn ) {
-                       $response = $this->sendCommand( $lockSrv, 'RELEASE_ALL', '', array() );
-                       if ( $response !== 'RELEASED_ALL' ) {
-                               $status->fatal( 'lockmanager-fail-svr-release', $lockSrv );
-                       }
-               }
-
-               return $status;
-       }
-
-       /**
-        * @see QuorumLockManager::isServerUp()
-        * @param string $lockSrv
-        * @return bool
-        */
-       protected function isServerUp( $lockSrv ) {
-               return (bool)$this->getConnection( $lockSrv );
-       }
-
-       /**
-        * Send a command and get back the response
-        *
-        * @param string $lockSrv
-        * @param string $action
-        * @param string $type
-        * @param array $values
-        * @return string|bool
-        */
-       protected function sendCommand( $lockSrv, $action, $type, $values ) {
-               $conn = $this->getConnection( $lockSrv );
-               if ( !$conn ) {
-                       return false; // no connection
-               }
-               $authKey = $this->lockServers[$lockSrv]['authKey'];
-               // Build of the command as a flat string...
-               $values = implode( '|', $values );
-               $key = hash_hmac( 'sha1', "{$this->session}\n{$action}\n{$type}\n{$values}", $authKey );
-               // Send out the command...
-               if ( fwrite( $conn, "{$this->session}:$key:$action:$type:$values\n" ) === false ) {
-                       return false;
-               }
-               // Get the response...
-               $response = fgets( $conn );
-               if ( $response === false ) {
-                       return false;
-               }
-
-               return trim( $response );
-       }
-
-       /**
-        * Get (or reuse) a connection to a lock server
-        *
-        * @param string $lockSrv
-        * @return resource
-        */
-       protected function getConnection( $lockSrv ) {
-               if ( !isset( $this->conns[$lockSrv] ) ) {
-                       $cfg = $this->lockServers[$lockSrv];
-                       wfSuppressWarnings();
-                       $errno = $errstr = '';
-                       $conn = fsockopen( $cfg['host'], $cfg['port'], $errno, $errstr, $this->connTimeout );
-                       wfRestoreWarnings();
-                       if ( $conn === false ) {
-                               return null;
-                       }
-                       $sec = floor( $this->connTimeout );
-                       $usec = floor( ( $this->connTimeout - floor( $this->connTimeout ) ) * 1e6 );
-                       stream_set_timeout( $conn, $sec, $usec );
-                       $this->conns[$lockSrv] = $conn;
-               }
-
-               return $this->conns[$lockSrv];
-       }
-
-       /**
-        * Make sure remaining locks get cleared for sanity
-        */
-       function __destruct() {
-               $this->releaseAllLocks();
-               foreach ( $this->conns as $conn ) {
-                       fclose( $conn );
-               }
-       }
-}
index cab5690..81529e7 100644 (file)
@@ -416,7 +416,7 @@ class FileRepo {
         *   ignoreRedirect: If true, do not follow file redirects
         *   private:        If true, return restricted (deleted) files if the current
         *                   user is allowed to view them. Otherwise, such files will not
-        *                   be found.
+        *                   be found. If a User object, use that user instead of the current.
         * @return File|bool False on failure
         */
        public function findFile( $title, $options = array() ) {
@@ -439,7 +439,11 @@ class FileRepo {
                        if ( $img && $img->exists() ) {
                                if ( !$img->isDeleted( File::DELETED_FILE ) ) {
                                        return $img; // always OK
-                               } elseif ( !empty( $options['private'] ) && $img->userCan( File::DELETED_FILE ) ) {
+                               } elseif ( !empty( $options['private'] ) &&
+                                       $img->userCan( File::DELETED_FILE,
+                                               $options['private'] instanceof User ? $options['private'] : null
+                                       )
+                               ) {
                                        return $img;
                                }
                        }
@@ -536,7 +540,11 @@ class FileRepo {
                        if ( $img && $img->exists() ) {
                                if ( !$img->isDeleted( File::DELETED_FILE ) ) {
                                        return $img; // always OK
-                               } elseif ( !empty( $options['private'] ) && $img->userCan( File::DELETED_FILE ) ) {
+                               } elseif ( !empty( $options['private'] ) &&
+                                       $img->userCan( File::DELETED_FILE,
+                                               $options['private'] instanceof User ? $options['private'] : null
+                                       )
+                               ) {
                                        return $img;
                                }
                        }
index c5346aa..99c0e09 100644 (file)
@@ -260,6 +260,9 @@ class LocalRepo extends FileRepo {
 
                $fileMatchesSearch = function( File $file, array $search ) {
                        // Note: file name comparison done elsewhere (to handle redirects)
+                       $user = ( !empty( $search['private'] ) && $search['private'] instanceof User )
+                               ? $search['private']
+                               : null;
                        return (
                                $file->exists() &&
                                (
@@ -267,7 +270,7 @@ class LocalRepo extends FileRepo {
                                        ( !empty( $search['time'] ) && $search['time'] === $file->getTimestamp() )
                                ) &&
                                ( !empty( $search['private'] ) || !$file->isDeleted( File::DELETED_FILE ) ) &&
-                               $file->userCan( File::DELETED_FILE )
+                               $file->userCan( File::DELETED_FILE, $user )
                        );
                };
 
@@ -315,11 +318,11 @@ class LocalRepo extends FileRepo {
                // Query old image table
                $oiConds = array(); // WHERE clause array for each file
                foreach ( $searchSet as $dbKey => $search ) {
-                       if ( isset( $search['params']['time'] ) ) {
+                       if ( isset( $search['time'] ) ) {
                                $oiConds[] = $dbr->makeList(
                                        array(
                                                'oi_name' => $this->getNameFromTitle( File::normalizeTitle( $dbKey ) ),
-                                               'oi_timestamp' => $dbr->timestamp( $search['params']['time'] )
+                                               'oi_timestamp' => $dbr->timestamp( $search['time'] )
                                        ),
                                        LIST_AND
                                );
index c95d73b..f8d017c 100644 (file)
@@ -19,11 +19,7 @@ class HTMLButtonField extends HTMLFormField {
                $attr = array(
                        'class' => 'mw-htmlform-submit ' . $this->mClass,
                        'id' => $this->mID,
-               );
-
-               if ( !empty( $this->mParams['disabled'] ) ) {
-                       $attr['disabled'] = 'disabled';
-               }
+               ) + $this->getAttributes( array( 'disabled', 'tabindex' ) );
 
                return Html::input( $this->mName, $value, $this->buttonType, $attr );
        }
index 105a884..237fa32 100644 (file)
@@ -12,9 +12,7 @@ class HTMLCheckField extends HTMLFormField {
                $attr = $this->getTooltipAndAccessKey();
                $attr['id'] = $this->mID;
 
-               if ( !empty( $this->mParams['disabled'] ) ) {
-                       $attr['disabled'] = 'disabled';
-               }
+               $attr += $this->getAttributes( array( 'disabled', 'tabindex' ) );
 
                if ( $this->mClass !== '' ) {
                        $attr['class'] = $this->mClass;
index 323d2d9..2fc170c 100644 (file)
@@ -82,14 +82,10 @@ class HTMLCheckMatrix extends HTMLFormField implements HTMLNestedFilterable {
        function getInputHTML( $value ) {
                $html = '';
                $tableContents = '';
-               $attribs = array();
                $rows = $this->mParams['rows'];
                $columns = $this->mParams['columns'];
 
-               // If the disabled param is set, disable all the options
-               if ( !empty( $this->mParams['disabled'] ) ) {
-                       $attribs['disabled'] = 'disabled';
-               }
+               $attribs = $this->getAttributes( array( 'disabled', 'tabindex' ) );
 
                // Build the column headers
                $headerContents = Html::rawElement( 'td', array(), '&#160;' );
index eeed907..622dd94 100644 (file)
@@ -484,6 +484,30 @@ abstract class HTMLFormField {
                return Linker::tooltipAndAccesskeyAttribs( $this->mParams['tooltip'] );
        }
 
+       /**
+        * Returns the given attributes from the parameters
+        *
+        * @param array $list List of attributes to get
+        * @return array Attributes
+        */
+       public function getAttributes( array $list ) {
+               static $boolAttribs = array( 'disabled', 'required', 'autofocus', 'multiple', 'readonly' );
+
+               $ret = array();
+
+               foreach( $list as $key ) {
+                       if ( in_array( $key, $boolAttribs ) ) {
+                               if ( !empty( $this->mParams[$key] ) ) {
+                                       $ret[$key] = '';
+                               }
+                       } elseif ( isset( $this->mParams[$key] ) ) {
+                               $ret[$key] = $this->mParams[$key];
+                       }
+               }
+
+               return $ret;
+       }
+
        /**
         * flatten an array of options to a single array, for instance,
         * a set of "<options>" inside "<optgroups>".
index 6b0396d..09576d4 100644 (file)
@@ -36,11 +36,7 @@ class HTMLMultiSelectField extends HTMLFormField implements HTMLNestedFilterable
        function formatOptions( $options, $value ) {
                $html = '';
 
-               $attribs = array();
-
-               if ( !empty( $this->mParams['disabled'] ) ) {
-                       $attribs['disabled'] = 'disabled';
-               }
+               $attribs = $this->getAttributes( array( 'disabled', 'tabindex' ) );
 
                foreach ( $options as $label => $info ) {
                        if ( is_array( $info ) ) {
index 51e7cdd..f206ed6 100644 (file)
@@ -41,10 +41,7 @@ class HTMLRadioField extends HTMLFormField {
        function formatOptions( $options, $value ) {
                $html = '';
 
-               $attribs = array();
-               if ( !empty( $this->mParams['disabled'] ) ) {
-                       $attribs['disabled'] = 'disabled';
-               }
+               $attribs = $this->getAttributes( array( 'disabled', 'tabindex' ) );
 
                # @todo Should this produce an unordered list perhaps?
                foreach ( $options as $label => $info ) {
index 7b2e865..044670d 100644 (file)
@@ -90,11 +90,15 @@ class HTMLSelectAndOtherField extends HTMLSelectField {
                        $textAttribs['class'] = $this->mClass;
                }
 
-               foreach ( array( 'required', 'autofocus', 'multiple', 'disabled' ) as $param ) {
-                       if ( isset( $this->mParams[$param] ) ) {
-                               $textAttribs[$param] = '';
-                       }
-               }
+               $allowedParams = array(
+                       'required',
+                       'autofocus',
+                       'multiple',
+                       'disabled',
+                       'tabindex'
+               );
+
+               $textAttribs += $this->getAttributes( $allowedParams );
 
                $textbox = Html::input( $this->mName . '-other', $value[2], 'text', $textAttribs );
 
index d2dd432..9d719f6 100644 (file)
@@ -37,6 +37,10 @@ class HTMLSelectField extends HTMLFormField {
                        $select->setAttribute( 'disabled', 'disabled' );
                }
 
+               if ( isset( $this->mParams['tabindex'] ) ) {
+                       $select->setAttribute( 'tabindex', $this->mParams['tabindex'] );
+               }
+
                if ( $this->mClass !== '' ) {
                        $select->setAttribute( 'class', $this->mClass );
                }
index 4e322d4..08be435 100644 (file)
@@ -47,6 +47,11 @@ class HTMLSelectOrOtherField extends HTMLTextField {
                        $tbAttribs['disabled'] = 'disabled';
                }
 
+               if ( isset( $this->mParams['tabindex'] ) ) {
+                       $select->setAttribute( 'tabindex', $this->mParams['tabindex'] );
+                       $tbAttribs['tabindex'] = $this->mParams['tabindex'];
+               }
+
                $select = $select->getHTML();
 
                if ( isset( $this->mParams['maxlength'] ) ) {
index 89e7be2..4fd1989 100644 (file)
@@ -24,23 +24,16 @@ class HTMLTextAreaField extends HTMLFormField {
                        $attribs['class'] = $this->mClass;
                }
 
-               if ( !empty( $this->mParams['disabled'] ) ) {
-                       $attribs['disabled'] = 'disabled';
-               }
-
-               if ( !empty( $this->mParams['readonly'] ) ) {
-                       $attribs['readonly'] = 'readonly';
-               }
-
-               if ( isset( $this->mParams['placeholder'] ) ) {
-                       $attribs['placeholder'] = $this->mParams['placeholder'];
-               }
-
-               foreach ( array( 'required', 'autofocus' ) as $param ) {
-                       if ( isset( $this->mParams[$param] ) ) {
-                               $attribs[$param] = '';
-                       }
-               }
+               $allowedParams = array(
+                       'placeholder',
+                       'tabindex',
+                       'disabled',
+                       'readonly',
+                       'required',
+                       'autofocus'
+               );
+
+               $attribs += $this->getAttributes( $allowedParams );
 
                return Html::element( 'textarea', $attribs, $value );
        }
index fe962f4..57f0a72 100644 (file)
@@ -17,10 +17,6 @@ class HTMLTextField extends HTMLFormField {
                        $attribs['class'] = $this->mClass;
                }
 
-               if ( !empty( $this->mParams['disabled'] ) ) {
-                       $attribs['disabled'] = 'disabled';
-               }
-
                # @todo Enforce pattern, step, required, readonly on the server side as
                # well
                $allowedParams = array(
@@ -31,19 +27,16 @@ class HTMLTextField extends HTMLFormField {
                        'step',
                        'placeholder',
                        'list',
-                       'maxlength'
+                       'maxlength',
+                       'tabindex',
+                       'disabled',
+                       'required',
+                       'autofocus',
+                       'multiple',
+                       'readonly'
                );
-               foreach ( $allowedParams as $param ) {
-                       if ( isset( $this->mParams[$param] ) ) {
-                               $attribs[$param] = $this->mParams[$param];
-                       }
-               }
 
-               foreach ( array( 'required', 'autofocus', 'multiple', 'readonly' ) as $param ) {
-                       if ( isset( $this->mParams[$param] ) ) {
-                               $attribs[$param] = '';
-                       }
-               }
+               $attribs += $this->getAttributes( $allowedParams );
 
                # Implement tiny differences between some field variants
                # here, rather than creating a new class for each one which
index 68dd216..892fb2a 100644 (file)
@@ -71,7 +71,7 @@ $1
 
 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'''.
+This program is distributed in the hope that it will be useful, but <strong>without any warranty</strong>; without even the implied warranty of <strong>merchantability</strong> or <strong>fitness for a particular purpose</strong>.
 See the GNU General Public License for more details.
 
 You should have received <doclink href=Copying>a copy of the GNU General Public License</doclink> along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, or [http://www.gnu.org/copyleft/gpl.html read it online].",
@@ -93,57 +93,54 @@ You cannot install MediaWiki.',
 However, MediaWiki requires PHP $2 or higher.',
        'config-unicode-using-utf8'       => 'Using Brion Vibber\'s utf8_normalize.so for Unicode normalization.',
        'config-unicode-using-intl'       => 'Using the [http://pecl.php.net/intl intl PECL extension] for Unicode normalization.',
-       'config-unicode-pure-php-warning' => "'''Warning:''' The [http://pecl.php.net/intl intl PECL extension] is not available to handle Unicode normalization, falling back to slow pure-PHP implementation.
+       'config-unicode-pure-php-warning' => "<strong>Warning:</strong> The [http://pecl.php.net/intl intl PECL extension] is not available to handle Unicode normalization, falling back to slow pure-PHP implementation.
 If you run a high-traffic site, you should read a little on [//www.mediawiki.org/wiki/Unicode_normalization_considerations Unicode normalization].",
-       'config-unicode-update-warning'   => "'''Warning:''' The installed version of the Unicode normalization wrapper uses an older version of [http://site.icu-project.org/ the ICU project's] library.
+       'config-unicode-update-warning'   => "<strong>Warning:</strong> The installed version of the Unicode normalization wrapper uses an older version of [http://site.icu-project.org/ the ICU project's] library.
 You should [//www.mediawiki.org/wiki/Unicode_normalization_considerations upgrade] if you are at all concerned about using Unicode.",
        'config-no-db'                    => 'Could not find a suitable database driver! You need to install a database driver for PHP.
 The following database types are supported: $1.
 
-If you are on shared hosting, ask your hosting provider to install a suitable database driver.
-If you compiled PHP yourself, reconfigure it with a database client enabled, for example using <code>./configure --with-mysql</code>.
-If you installed PHP from a Debian or Ubuntu package, then you also need install the php5-mysql module.',
-       'config-outdated-sqlite'          => "'''Warning:''' you have SQLite $1, which is lower than minimum required version $2. SQLite will be unavailable.",
-       'config-no-fts3'                  => "'''Warning:''' SQLite is compiled without the [//sqlite.org/fts3.html FTS3 module], search features will be unavailable on this backend.",
-       'config-register-globals'         => "'''Warning: PHP's <code>[http://php.net/register_globals register_globals]</code> option is enabled.'''
-'''Disable it if you can.'''
+If you compiled PHP yourself, reconfigure it with a database client enabled, for example, using <code>./configure --with-mysqli</code>.
+If you installed PHP from a Debian or Ubuntu package, then you also need to install, for example, the <code>php5-mysql</code> package.',
+       'config-outdated-sqlite'          => "<strong>Warning:</strong> you have SQLite $1, which is lower than minimum required version $2. SQLite will be unavailable.",
+       'config-no-fts3'                  => "<strong>Warning:</strong> SQLite is compiled without the [//sqlite.org/fts3.html FTS3 module], search features will be unavailable on this backend.",
+       'config-register-globals'         => "<strong>Warning: PHP's <code>[http://php.net/register_globals register_globals]</code> option is enabled.
+Disable it if you can.</strong>
 MediaWiki will work, but your server is exposed to potential security vulnerabilities.",
-       'config-magic-quotes-runtime'     => "'''Fatal: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] is active!'''
+       'config-magic-quotes-runtime'     => "<strong>Fatal: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] is active!'</strong>
 This option corrupts data input unpredictably.
 You cannot install or use MediaWiki unless this option is disabled.",
-       'config-magic-quotes-sybase'      => "'''Fatal: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] is active!'''
+       'config-magic-quotes-sybase'      => "<strong>Fatal: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] is active!</strong>
 This option corrupts data input unpredictably.
 You cannot install or use MediaWiki unless this option is disabled.",
-       'config-mbstring'                 => "'''Fatal: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] is active!'''
+       'config-mbstring'                 => "<strong>Fatal: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] is active!</strong>
 This option causes errors and may corrupt data unpredictably.
 You cannot install or use MediaWiki unless this option is disabled.",
-       'config-ze1'                      => "'''Fatal: [http://www.php.net/manual/en/ini.core.php zend.ze1_compatibility_mode] is active!'''
-This option causes horrible bugs with MediaWiki.
-You cannot install or use MediaWiki unless this option is disabled.",
-       'config-safe-mode'                => "'''Warning:''' PHP's [http://www.php.net/features.safe-mode safe mode] is active.
+       'config-safe-mode'                => "<strong>Warning:</strong> PHP's [http://www.php.net/features.safe-mode safe mode] is active.
 It may cause problems, particularly if using file uploads and <code>math</code> support.",
        'config-xml-bad'                  => "PHP's XML module is missing.
 MediaWiki requires functions in this module and will not work in this configuration.
 If you're running Mandrake, install the php-xml package.",
-       'config-pcre'                     => 'The PCRE support module appears to be missing.
-MediaWiki requires the Perl-compatible regular expression functions to work.',
-       'config-pcre-no-utf8'             => "'''Fatal:''' PHP's PCRE module seems to be compiled without PCRE_UTF8 support.
+       'config-pcre-old'                 => "<strong>Fatal:</strong> PCRE $1 or later is required.
+Your PHP binary is linked with PCRE $2.
+[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE More information].",
+       'config-pcre-no-utf8'             => "<strong>Fatal:</strong> PHP's PCRE module seems to be compiled without PCRE_UTF8 support.
 MediaWiki requires UTF-8 support to function correctly.",
        'config-memory-raised'            => "PHP's <code>memory_limit</code> is $1, raised to $2.",
-       'config-memory-bad'               => "'''Warning:''' PHP's <code>memory_limit</code> is $1.
+       'config-memory-bad'               => "<strong>Warning:</strong> PHP's <code>memory_limit</code> is $1.
 This is probably too low.
 The installation may fail!",
-       'config-ctype'                    => "'''Fatal:''' PHP must be compiled with support for the [http://www.php.net/manual/en/ctype.installation.php Ctype extension].",
-       'config-json'                     => "'''Fatal:''' PHP was compiled without JSON support.
+       'config-ctype'                    => "<strong>Fatal:</strong> PHP must be compiled with support for the [http://www.php.net/manual/en/ctype.installation.php Ctype extension].",
+       'config-json'                     => "<strong>Fatal:</strong> PHP was compiled without JSON support.
 You must install either the PHP JSON extension or the [http://pecl.php.net/package/jsonc PECL jsonc] extension before installing MediaWiki.
 * The PHP extension is included in Red Hat Enterprise Linux (CentOS) 5 and 6, though must be enabled in <code>/etc/php.ini</code> or <code>/etc/php.d/json.ini</code>.
 * Some Linux distributions released after May 2013 omit the PHP extension, instead packaging the PECL extension as <code>php5-json</code> or <code>php-pecl-jsonc</code>.",
        'config-xcache'                   => '[http://xcache.lighttpd.net/ XCache] is installed',
        'config-apc'                      => '[http://www.php.net/apc APC] is installed',
        'config-wincache'                 => '[http://www.iis.net/download/WinCacheForPhp WinCache] is installed',
-       'config-no-cache'                 => "'''Warning:''' Could not find [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] or [http://www.iis.net/download/WinCacheForPhp WinCache].
+       'config-no-cache'                 => "<strong>Warning:</strong> Could not find [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] or [http://www.iis.net/download/WinCacheForPhp WinCache].
 Object caching is not enabled.",
-       'config-mod-security'             => "'''Warning:''' Your web server has [http://modsecurity.org/ mod_security] enabled. If misconfigured, it can cause problems for MediaWiki or other software that allows users to post arbitrary content.
+       'config-mod-security'             => "<strong>Warning:</strong> Your web server has [http://modsecurity.org/ mod_security] enabled. If misconfigured, it can cause problems for MediaWiki or other software that allows users to post arbitrary content.
 Refer to [http://modsecurity.org/documentation/ mod_security documentation] or contact your host's support if you encounter random errors.",
        'config-diff3-bad'                => 'GNU diff3 not found.',
        'config-git'                      => 'Found the Git version control software: <code>$1</code>.',
@@ -154,20 +151,17 @@ Image thumbnailing will be enabled if you enable uploads.',
 Image thumbnailing will be enabled if you enable uploads.',
        'config-no-scaling'               => 'Could not find GD library or ImageMagick.
 Image thumbnailing will be disabled.',
-       'config-no-uri'                   => "'''Error:''' Could not determine the current URI.
+       'config-no-uri'                   => "<strong>Error:</strong> Could not determine the current URI.
 Installation aborted.",
-       'config-no-cli-uri'               => "'''Warning:''' No --scriptpath specified, using default: <code>$1</code>.",
+       'config-no-cli-uri'               => "<strong>Warning:</strong> No --scriptpath specified, using default: <code>$1</code>.",
        'config-using-server'             => 'Using server name "<nowiki>$1</nowiki>".',
        'config-using-uri'                => 'Using server URL "<nowiki>$1$2</nowiki>".',
-       'config-uploads-not-safe'         => "'''Warning:''' Your default directory for uploads <code>$1</code> is vulnerable to arbitrary scripts execution.
+       'config-uploads-not-safe'         => "<strong>Warning:</strong> Your default directory for uploads <code>$1</code> is vulnerable to arbitrary scripts execution.
 Although MediaWiki checks all uploaded files for security threats, it is highly recommended to [//www.mediawiki.org/wiki/Manual:Security#Upload_security close this security vulnerability] before enabling uploads.",
-       'config-no-cli-uploads-check'     => "'''Warning:''' Your default directory for uploads (<code>$1</code>) is not checked for vulnerability
+       'config-no-cli-uploads-check'     => "<strong>Warning:</strong> Your default directory for uploads (<code>$1</code>) is not checked for vulnerability
 to arbitrary script execution during the CLI install.",
-       'config-brokenlibxml'             => 'Your system has a combination of PHP and libxml2 versions which is buggy and can cause hidden data corruption in MediaWiki and other web applications.
-Upgrade to PHP 5.2.9 or later and libxml2 2.7.3 or later ([//bugs.php.net/bug.php?id=45996 bug filed with PHP]).
-Installation aborted.',
-       'config-using531'                 => 'MediaWiki cannot be used with PHP $1 due to a bug involving reference parameters to <code>__call()</code>.
-Upgrade to PHP 5.3.2 or higher, or downgrade to PHP 5.3.0 to resolve this.
+       'config-brokenlibxml'             => 'Your system has a combination of PHP and libxml2 versions that is buggy and can cause hidden data corruption in MediaWiki and other web applications.
+Upgrade to libxml2 2.7.3 or later ([https://bugs.php.net/bug.php?id=45996 bug filed with PHP]).
 Installation aborted.',
        'config-suhosin-max-value-length' => "Suhosin is installed and limits the GET parameter <code>length</code> to $1 bytes.
 MediaWiki's ResourceLoader component will work around this limit, but that will degrade performance.
@@ -218,24 +212,24 @@ This field is usually left empty.',
        'config-charset-mysql5-binary'    => 'MySQL 4.1/5.0 binary',
        'config-charset-mysql5'           => 'MySQL 4.1/5.0 UTF-8',
        'config-charset-mysql4'           => 'MySQL 4.0 backwards-compatible UTF-8',
-       'config-charset-help'             => "'''Warning:''' If you use '''backwards-compatible UTF-8''' on MySQL 4.1+, and subsequently back up the database with <code>mysqldump</code>, it may destroy all non-ASCII characters, irreversibly corrupting your backups!
+       'config-charset-help'             => "<strong>Warning:</strong> If you use <strong>backwards-compatible UTF-8</strong> on MySQL 4.1+, and subsequently back up the database with <code>mysqldump</code>, it may destroy all non-ASCII characters, irreversibly corrupting your backups!
 
-In '''binary mode''', MediaWiki stores UTF-8 text to the database in binary fields.
+In <strong>binary mode</strong>, MediaWiki stores UTF-8 text to the database in binary fields.
 This is more efficient than MySQL's UTF-8 mode, and allows you to use the full range of Unicode characters.
-In '''UTF-8 mode''', MySQL will know what character set your data is in, and can present and convert it appropriately,
+In <strong>UTF-8 mode</strong>, MySQL will know what character set your data is in, and can present and convert it appropriately,
 but it will not let you store characters above the [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Basic Multilingual Plane].",
        'config-mysql-old'                => 'MySQL $1 or later is required. You have $2.',
        'config-db-port'                  => 'Database port:',
        'config-db-schema'                => 'Schema for MediaWiki:',
        'config-db-schema-help'           => 'This schema will usually be fine.
 Only change it if you know you need to.',
-       'config-pg-test-error'            => "Cannot connect to database '''$1''': $2",
+       'config-pg-test-error'            => "Cannot connect to database <strong>$1</strong>: $2",
        'config-sqlite-dir'               => 'SQLite data directory:',
        'config-sqlite-dir-help'          => "SQLite stores all data in a single file.
 
 The directory you provide must be writable by the webserver during installation.
 
-It should '''not''' be accessible via the web, this is why we're not putting it where your PHP files are.
+It should <strong>not</strong> be accessible via the web, this is why we're not putting it where your PHP files are.
 
 The installer will write a <code>.htaccess</code> file along with it, but if that fails someone can gain access to your raw database.
 That includes raw user data (email addresses, hashed passwords) as well as deleted revisions and other restricted data on the wiki.
@@ -243,7 +237,7 @@ That includes raw user data (email addresses, hashed passwords) as well as delet
 Consider putting the database somewhere else altogether, for example in <code>/var/lib/mediawiki/yourwiki</code>.",
        'config-oracle-def-ts'            => 'Default tablespace:',
        'config-oracle-temp-ts'           => 'Temporary tablespace:',
-       'config-type-mysql'               => 'MySQL',
+       'config-type-mysql'               => 'MySQL (or compatible)',
        'config-type-postgres'            => 'PostgreSQL',
        'config-type-sqlite'              => 'SQLite',
        'config-type-oracle'              => 'Oracle',
@@ -252,10 +246,10 @@ Consider putting the database somewhere else altogether, for example in <code>/v
 $1
 
 If you do not see the database system you are trying to use listed below, then follow the instructions linked above to enable support.',
-       'config-support-mysql'            => '* $1 is the primary target for MediaWiki and is best supported ([http://www.php.net/manual/en/mysql.installation.php how to compile PHP with MySQL support])',
-       'config-support-postgres'         => '* $1 is a popular open source database system as an alternative to MySQL ([http://www.php.net/manual/en/pgsql.installation.php how to compile PHP with PostgreSQL support]). There may be some minor outstanding bugs, and it is not recommended for use in a production environment.',
-       'config-support-sqlite'           => '* $1 is a lightweight database system which is very well supported. ([http://www.php.net/manual/en/pdo.installation.php How to compile PHP with SQLite support], uses PDO)',
-       'config-support-oracle'           => '* $1 is a commercial enterprise database. ([http://www.php.net/manual/en/oci8.installation.php How to compile PHP with OCI8 support])',
+       'config-dbsupport-mysql'          => '* [{{int:version-db-mysql-url}} MySQL] is the primary target for MediaWiki and is best supported. MediaWiki also works with [{{int:version-db-mariadb-url}} MariaDB] and [{{int:version-db-percona-url}} Percona Server], which are MySQL compatible. ([http://www.php.net/manual/en/mysqli.installation.php How to compile PHP with MySQL support])',
+       'config-dbsupport-postgres'       => '* [{{int:version-db-postgres-url}} PostgreSQL] is a popular open source database system as an alternative to MySQL. There may be some minor outstanding bugs, and it is not recommended for use in a production environment. ([http://www.php.net/manual/en/pgsql.installation.php How to compile PHP with PostgreSQL support])',
+       'config-dbsupport-sqlite'         => '* [{{int:version-db-sqlite-url}} SQLite] is a lightweight database system that is very well supported. ([http://www.php.net/manual/en/pdo.installation.php How to compile PHP with SQLite support], uses PDO)',
+       'config-dbsupport-oracle'         => '* [{{int:version-db-oracle-url}} Oracle] is a commercial enterprise database. ([http://www.php.net/manual/en/oci8.installation.php How to compile PHP with OCI8 support])',
        'config-header-mysql'             => 'MySQL settings',
        'config-header-postgres'          => 'PostgreSQL settings',
        'config-header-sqlite'            => 'SQLite settings',
@@ -311,19 +305,19 @@ Check the data directory and database name below and try again.',
        'config-sqlite-cant-create-db'    => 'Could not create database file <code>$1</code>.',
        'config-sqlite-fts3-downgrade'    => 'PHP is missing FTS3 support, downgrading tables',
        'config-can-upgrade'              => "There are MediaWiki tables in this database.
-To upgrade them to MediaWiki $1, click '''Continue'''.",
+To upgrade them to MediaWiki $1, click <strong>Continue</strong>.",
        'config-upgrade-done'             => "Upgrade complete.
 
 You can now [$1 start using your wiki].
 
 If you want to regenerate your <code>LocalSettings.php</code> file, click the button below.
-This is '''not recommended''' unless you are having problems with your wiki.",
+This is <strong>not recommended</strong> unless you are having problems with your wiki.",
        'config-upgrade-done-no-regenerate' => "Upgrade complete.
 
 You can now [$1 start using your wiki].",
        'config-regenerate'               => 'Regenerate LocalSettings.php →',
        'config-show-table-status'        => '<code>SHOW TABLE STATUS</code> query failed!',
-       'config-unknown-collation'        => "'''Warning:''' Database is using unrecognized collation.",
+       'config-unknown-collation'        => "<strong>Warning:</strong> Database is using unrecognized collation.",
        'config-db-web-account'           => 'Database account for web access',
        'config-db-web-help'              => 'Select the username and password that the web server will use to connect to the database server, during ordinary operation of the wiki.',
        'config-db-web-account-same'      => 'Use the same account as for installation',
@@ -333,30 +327,30 @@ The account you specify here must already exist.',
        'config-mysql-engine'             => 'Storage engine:',
        'config-mysql-innodb'             => 'InnoDB',
        'config-mysql-myisam'             => 'MyISAM',
-       'config-mysql-myisam-dep'         => "'''Warning:''' You have selected MyISAM as storage engine for MySQL, which is not recommended for use with MediaWiki, because:
+       'config-mysql-myisam-dep'         => "<strong>Warning:</strong> You have selected MyISAM as storage engine for MySQL, which is not recommended for use with MediaWiki, because:
 * it barely supports concurrency due to table locking
 * it is more prone to corruption than other engines
 * the MediaWiki codebase does not always handle MyISAM as it should
 
 If your MySQL installation supports InnoDB, it is highly recommended that you choose that instead.
 If your MySQL installation does not support InnoDB, maybe it's time for an upgrade.",
-       'config-mysql-only-myisam-dep'    => "'''Warning:''' MyISAM is the only available storage engine for MySQL on this machine, and this is not recommended for use with MediaWiki, because:
+       'config-mysql-only-myisam-dep'    => "<strong>Warning:</strong> MyISAM is the only available storage engine for MySQL on this machine, and this is not recommended for use with MediaWiki, because:
 * it barely supports concurrency due to table locking
 * it is more prone to corruption than other engines
 * the MediaWiki codebase does not always handle MyISAM as it should
 
 Your MySQL installation does not support InnoDB, maybe it's time for an upgrade.",
-       'config-mysql-engine-help'        => "'''InnoDB''' is almost always the best option, since it has good concurrency support.
+       'config-mysql-engine-help'        => "<strong>InnoDB</strong> is almost always the best option, since it has good concurrency support.
 
-'''MyISAM''' may be faster in single-user or read-only installations.
+<strong>MyISAM</strong> may be faster in single-user or read-only installations.
 MyISAM databases tend to get corrupted more often than InnoDB databases.",
        'config-mysql-charset'            => 'Database character set:',
        'config-mysql-binary'             => 'Binary',
        'config-mysql-utf8'               => 'UTF-8',
-       'config-mysql-charset-help'       => "In '''binary mode''', MediaWiki stores UTF-8 text to the database in binary fields.
+       'config-mysql-charset-help'       => "In <strong>binary mode</strong>, MediaWiki stores UTF-8 text to the database in binary fields.
 This is more efficient than MySQL's UTF-8 mode, and allows you to use the full range of Unicode characters.
 
-In '''UTF-8 mode''', MySQL will know what character set your data is in, and can present and convert it appropriately, but it will not let you store characters above the [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Basic Multilingual Plane].",
+In <strong>UTF-8 mode</strong>, MySQL will know what character set your data is in, and can present and convert it appropriately, but it will not let you store characters above the [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Basic Multilingual Plane].",
 
        'config-site-name'                => 'Name of wiki:',
        'config-site-name-help'           => "This will appear in the title bar of the browser and in various other places.",
@@ -410,11 +404,11 @@ In MediaWiki, it is easy to review the recent changes, and to revert any damage
 However, many have found MediaWiki to be useful in a wide variety of roles, and sometimes it is not easy to convince everyone of the benefits of the wiki way.
 So you have the choice.
 
-The '''{{int:config-profile-wiki}}''' model allows anyone to edit, without even logging in.
-A wiki with '''{{int:config-profile-no-anon}}''' provides extra accountability, but may deter casual contributors.
+The <strong>{{int:config-profile-wiki}}</strong> model allows anyone to edit, without even logging in.
+A wiki with <strong>{{int:config-profile-no-anon}}</strong> provides extra accountability, but may deter casual contributors.
 
-The '''{{int:config-profile-fishbowl}}''' scenario allows approved users to edit, but the public can view the pages, including history.
-A '''{{int:config-profile-private}}''' only allows approved users to view pages, with the same group allowed to edit.
+The <strong>{{int:config-profile-fishbowl}}</strong> scenario allows approved users to edit, but the public can view the pages, including history.
+A <strong>{{int:config-profile-private}}</strong> only allows approved users to view pages, with the same group allowed to edit.
 
 More complex user rights configurations are available after installation, see the [//www.mediawiki.org/wiki/Manual:User_rights relevant manual entry].",
        'config-license'                  => 'Copyright and license:',
@@ -430,7 +424,7 @@ More complex user rights configurations are available after installation, see th
 This helps to create a sense of community ownership and encourages long-term contribution.
 It is not generally necessary for a private or corporate wiki.
 
-If you want to be able to use text from Wikipedia, and you want Wikipedia to be able to accept text copied from your wiki, you should choose '''Creative Commons Attribution Share Alike'''.
+If you want to be able to use text from Wikipedia, and you want Wikipedia to be able to accept text copied from your wiki, you should choose <strong>Creative Commons Attribution Share Alike</strong>.
 
 Wikipedia previously used the GNU Free Documentation License.
 The GFDL is a valid license, but it is difficult to understand.
@@ -448,7 +442,7 @@ If you do not want any email features, you can disable them here.",
        'config-email-auth'               => 'Enable email authentication',
        'config-email-auth-help'          => "If this option is enabled, users have to confirm their email address using a link sent to them whenever they set or change it.
 Only authenticated email addresses can receive emails from other users or change notification emails.
-Setting this option is '''recommended''' for public wikis because of potential abuse of the email features.",
+Setting this option is <strong>recommended</strong> for public wikis because of potential abuse of the email features.",
        'config-email-sender'             => 'Return email address:',
        'config-email-sender-help'        => 'Enter the email address to use as the return address on outbound email.
 This is where bounces will be sent.
@@ -500,7 +494,7 @@ If you do not know the port, the default is 11211.',
        'config-extensions-help'          => 'The extensions listed above were detected in your <code>./extensions</code> directory.
 
 They may require additional configuration, but you can enable them now.',
-       'config-install-alreadydone'      => "'''Warning:''' You seem to have already installed MediaWiki and are trying to install it again.
+       'config-install-alreadydone'      => "<strong>Warning:</strong> You seem to have already installed MediaWiki and are trying to install it again.
 Please proceed to the next page.",
        'config-install-begin'            => 'By pressing "{{int:config-continue}}", you will begin the installation of MediaWiki.
 If you still want to make changes, press "{{int:config-back}}".',
@@ -528,23 +522,23 @@ MediaWiki currently requires that the tables be owned by the web user. Please sp
        'config-install-user-missing-create' => 'The specified user "$1" does not exist.
 Please click the "create account" checkbox below if you want to create it.',
        'config-install-tables'           => 'Creating tables',
-       'config-install-tables-exist'     => "'''Warning:''' MediaWiki tables seem to already exist.
+       'config-install-tables-exist'     => "<strong>Warning:</strong> MediaWiki tables seem to already exist.
 Skipping creation.",
-       'config-install-tables-failed'    => "'''Error:''' Table creation failed with the following error: $1",
+       'config-install-tables-failed'    => "<strong>Error:</strong> Table creation failed with the following error: $1",
        'config-install-interwiki'        => 'Populating default interwiki table',
        'config-install-interwiki-list'   => 'Could not read file <code>interwiki.list</code>.',
-       'config-install-interwiki-exists' => "'''Warning:''' The interwiki table seems to already have entries.
+       'config-install-interwiki-exists' => "<strong>Warning:</strong> The interwiki table seems to already have entries.
 Skipping default list.",
        'config-install-stats'            => 'Initializing statistics',
        'config-install-keys'             => 'Generating secret keys',
-       'config-insecure-keys'            => "'''Warning:''' {{PLURAL:$2|A secure key|Secure keys}} ($1) generated during installation {{PLURAL:$2|is|are}} not completely safe. Consider changing {{PLURAL:$2|it|them}} manually.",
+       'config-insecure-keys'            => "<strong>Warning:</strong> {{PLURAL:$2|A secure key|Secure keys}} ($1) generated during installation {{PLURAL:$2|is|are}} not completely safe. Consider changing {{PLURAL:$2|it|them}} manually.",
        'config-install-sysop'            => 'Creating administrator user account',
        'config-install-subscribe-fail'   => 'Unable to subscribe to mediawiki-announce: $1',
        'config-install-subscribe-notpossible' => 'cURL is not installed and allow_url_fopen is not available.',
        'config-install-mainpage'         => 'Creating main page with default content',
        'config-install-extension-tables' => 'Creating tables for enabled extensions',
        'config-install-mainpage-failed'  => 'Could not insert main page: $1',
-       'config-install-done'             => "'''Congratulations!'''
+       'config-install-done'             => "<strong>Congratulations!</strong>
 You have successfully installed MediaWiki.
 
 The installer has generated a <code>LocalSettings.php</code> file.
@@ -556,16 +550,16 @@ If the download was not offered, or if you cancelled it, you can restart the dow
 
 $3
 
-'''Note:''' If you do not do this now, this generated configuration file will not be available to you later if you exit the installation without downloading it.
+<strong>Note:</strong> If you do not do this now, this generated configuration file will not be available to you later if you exit the installation without downloading it.
 
-When that has been done, you can '''[$2 enter your wiki]'''.",
+When that has been done, you can <strong>[$2 enter your wiki]</strong>.",
        'config-download-localsettings' => 'Download <code>LocalSettings.php</code>',
        'config-help' => 'help',
        'config-nofile'     => 'File "$1" could not be found. Has it been deleted?',
        'config-extension-link' => 'Did you know that your wiki supports [//www.mediawiki.org/wiki/Manual:Extensions extensions]?
 
 You can browse [//www.mediawiki.org/wiki/Category:Extensions_by_category extensions by category] or the [//www.mediawiki.org/wiki/Extension_Matrix Extension Matrix] to see the full list of extensions.',
-       'mainpagetext'      => "'''MediaWiki has been successfully installed.'''",
+       'mainpagetext'      => "<strong>MediaWiki has been successfully installed.</strong>",
        'mainpagedocfooter' => "Consult the [//meta.wikimedia.org/wiki/Help:Contents User's Guide] for information on using the wiki software.
 
 == Getting started ==
@@ -640,7 +634,7 @@ See also:
 * {{msg-mw|config-env-php}}',
        'config-unicode-pure-php-warning' => 'PECL is the name of a group producing standard pieces of software for PHP, and intl is the name of their library handling some aspects of internationalization.',
        'config-unicode-update-warning' => "ICU is a body producing standard software tools for support of Unicode and other internationalization aspects. This message warns the system administrator installing MediaWiki that the server's software is not up-to-date and MediaWiki will have problems handling some characters.",
-       'config-no-db' => '{{doc-important|Do not translate "<code>./configure --with-mysql</code>" and "<code>php5-mysql</code>".}}
+       'config-no-db' => '{{doc-important|Do not translate "<code>./configure --with-mysqli</code>" and "<code>php5-mysql</code>".}}
 Parameters:
 * $1 is comma separated list of database types supported by MediaWiki.',
        'config-outdated-sqlite' => 'Used as warning. Parameters:
@@ -652,6 +646,10 @@ Parameters:
        'config-mbstring' => '{{Related|Config-fatal}}',
        'config-ze1' => '{{Related|Config-fatal}}',
        'config-pcre' => 'PCRE is an initialism for "Perl-compatible regular expression". Perl is programming language whose [[:w:regular expression|regular expression]] syntax is popular and used in other languages using a library called PCRE.',
+       'config-pcre-old' => 'Parameters:
+* $1 - minimum PCRE version number
+* $2 - the installed version of [[wikipedia:PCRE|PCRE]]
+{{Related|Config-fatal}}',
        'config-pcre-no-utf8' => "PCRE is a name of a programmers' library for supporting regular expressions. It can probably be translated without change.
 {{Related|Config-fatal}}",
        'config-memory-raised' => 'Parameters:
@@ -704,12 +702,12 @@ Message shown when PHP parameter <code>suhosin.get.max_value_length</code> is be
 * $2 - error message',
        'config-sqlite-dir-help' => '{{doc-important|Do not translate <code>.htaccess</code> and <code>/var/lib/mediawiki/yourwiki</code>.}}
 Used in help box.',
-       'config-type-mysql' => '{{optional}}',
+       'config-type-mysql' => '"Or compatible" refers to several database systems that are compatible with MySQL, as explained in {{msg-mw|config-dbsupport-mysql}}, and thus also work with this choice of database type.',
        'config-type-postgres' => '{{optional}}',
        'config-type-sqlite' => '{{optional}}',
        'config-type-oracle' => '{{optional}}',
        'config-support-info' => 'Parameters:
-* $1 - a list of DBMSs that MediaWiki supports, composed with other config-type-* and config-support-* messages.',
+* $1 - a list of DBMSs that MediaWiki supports, composed with config-dbsupport-* messages.',
        'config-support-mysql' => 'Parameters:
 * $1 - a link to the MySQL home page having the anchor text "MySQL".',
        'config-support-postgres' => 'Parameters:
@@ -718,6 +716,10 @@ Used in help box.',
 * $1 - a link to the SQLite home page having the anchor text "SQLite".',
        'config-support-oracle' => 'Parameters:
 * $1 - a link to the Oracle home page, the anchor text of which is "Oracle".',
+       'config-dbsupport-mysql' => 'Used in {{msg-mw|config-support-info}}.',
+       'config-dbsupport-postgres' => 'Used in {{msg-mw|config-support-info}}.',
+       'config-dbsupport-sqlite' => 'Used in {{msg-mw|config-support-info}}.',
+       'config-dbsupport-oracle' => 'Used in {{msg-mw|config-support-info}}.',
        'config-invalid-db-server-oracle' => 'Used as error message. Parameters:
 * $1 - database server name
 See also:
index 765838b..8b15f0c 100644 (file)
@@ -41,6 +41,14 @@ abstract class Installer {
        // This is the absolute minimum PHP version we can support
        const MINIMUM_PHP_VERSION = '5.3.2';
 
+       /**
+        * The oldest version of PCRE we can support.
+        *
+        * Defining this is necessary because PHP may be linked with a system version
+        * of PCRE, which may be older than that bundled with the minimum PHP version.
+        */
+       const MINIMUM_PCRE_VERSION = '7.2';
+
        /**
         * @var array
         */
@@ -108,11 +116,9 @@ abstract class Installer {
                'envCheckDB',
                'envCheckRegisterGlobals',
                'envCheckBrokenXML',
-               'envCheckPHP531',
                'envCheckMagicQuotes',
                'envCheckMagicSybase',
                'envCheckMbstring',
-               'envCheckZE1',
                'envCheckSafeMode',
                'envCheckXML',
                'envCheckPCRE',
@@ -416,6 +422,15 @@ abstract class Installer {
                        $good = false;
                }
 
+               // Must go here because an old version of PCRE can prevent other checks from completing
+               if ( $good ) {
+                       list( $pcreVersion ) = explode( ' ', PCRE_VERSION, 2 );
+                       if ( version_compare( $pcreVersion, self::MINIMUM_PCRE_VERSION, '<' ) ) {
+                               $this->showError( 'config-pcre-old', self::MINIMUM_PCRE_VERSION, $pcreVersion );
+                               $good = false;
+                       }
+               }
+
                if ( $good ) {
                        foreach ( $this->envChecks as $check ) {
                                $status = $this->$check();
@@ -717,23 +732,6 @@ abstract class Installer {
                return true;
        }
 
-       /**
-        * Test PHP (probably 5.3.1, but it could regress again) to make sure that
-        * reference parameters to __call() are not converted to null
-        * @return bool
-        */
-       protected function envCheckPHP531() {
-               $test = new PhpRefCallBugTester;
-               $test->execute();
-               if ( !$test->ok ) {
-                       $this->showError( 'config-using531', phpversion() );
-
-                       return false;
-               }
-
-               return true;
-       }
-
        /**
         * Environment check for magic_quotes_runtime.
         * @return bool
@@ -776,20 +774,6 @@ abstract class Installer {
                return true;
        }
 
-       /**
-        * Environment check for zend.ze1_compatibility_mode.
-        * @return bool
-        */
-       protected function envCheckZE1() {
-               if ( wfIniGetBool( 'zend.ze1_compatibility_mode' ) ) {
-                       $this->showError( 'config-ze1' );
-
-                       return false;
-               }
-
-               return true;
-       }
-
        /**
         * Environment check for safe_mode.
         * @return bool
@@ -826,11 +810,6 @@ abstract class Installer {
         * @return bool
         */
        protected function envCheckPCRE() {
-               if ( !function_exists( 'preg_match' ) ) {
-                       $this->showError( 'config-pcre' );
-
-                       return false;
-               }
                wfSuppressWarnings();
                $regexd = preg_replace( '/[\x{0430}-\x{04FF}]/iu', '', '-АБВГД-' );
                // Need to check for \p support too, as PCRE can be compiled
index 5471264..0460134 100644 (file)
@@ -45,29 +45,3 @@ class PhpXmlBugTester {
                $this->parsedData .= $data;
        }
 }
-
-/**
- * Test for PHP bug #50394 (PHP 5.3.x conversion to null only, not 5.2.x)
- * @see http://bugs.php.net/bug.php?id=50394
- * @ingroup PHPBugTests
- */
-class PhpRefCallBugTester {
-       public $ok = false;
-
-       function __call( $name, $args ) {
-               $old = error_reporting( E_ALL & ~E_WARNING );
-               call_user_func_array( array( $this, 'checkForBrokenRef' ), $args );
-               error_reporting( $old );
-       }
-
-       function checkForBrokenRef( &$var ) {
-               if ( $var ) {
-                       $this->ok = true;
-               }
-       }
-
-       function execute() {
-               $var = true;
-               call_user_func_array( array( $this, 'foo' ), array( &$var ) );
-       }
-}
index aa324de..d4b3d65 100644 (file)
@@ -481,12 +481,11 @@ class WebInstaller_DBConnect extends WebInstallerPage {
                $settings = '';
                $defaultType = $this->getVar( 'wgDBtype' );
 
-               // Messages: config-support-mysql, config-support-postgres, config-support-oracle,
-               // config-support-sqlite
+               // Messages: config-dbsupport-mysql, config-dbsupport-postgres, config-dbsupport-oracle,
+               // config-dbsupport-sqlite
                $dbSupport = '';
-               foreach ( $this->parent->getDBTypes() as $type ) {
-                       $link = DatabaseBase::factory( $type )->getSoftwareLink();
-                       $dbSupport .= wfMessage( "config-support-$type", $link )->plain() . "\n";
+               foreach ( Installer::getDBTypes() as $type ) {
+                       $dbSupport .= wfMessage( "config-dbsupport-$type" )->plain() . "\n";
                }
                $this->addHTML( $this->parent->getInfoBox(
                        wfMessage( 'config-support-info', trim( $dbSupport ) )->text() ) );
index 8d93dc0..52978b8 100644 (file)
@@ -298,7 +298,7 @@ abstract class JobQueue {
        }
 
        /**
-        * Push a single jobs into the queue.
+        * Push one or more jobs into the queue.
         * This does not require $wgJobClasses to be set for the given job type.
         * Outside callers should use JobQueueGroup::push() instead of this function.
         *
index b0b6ccd..c8e5df6 100644 (file)
@@ -62,7 +62,7 @@ class BacklinkJobUtils {
         * @param int $bSize BacklinkCache partition size; usually $wgUpdateRowsPerJob
         * @param int $cSize Max titles per leaf job; Usually 1 or a modest value
         * @param array $opts Optional parameter map
-        * @return array List of Job objects
+        * @return Job[] List of Job objects
         */
        public static function partitionBacklinkJob( Job $job, $bSize, $cSize, $opts = array() ) {
                $class = get_class( $job );
index 29f737e..0675b38 100644 (file)
@@ -6,11 +6,13 @@
  * HTTP request maps use the following format:
  *   - method   : GET/HEAD/PUT/POST/DELETE
  *   - url      : HTTP/HTTPS URL
- *   - query    : <query parameter field/value associative array>
+ *   - query    : <query parameter field/value associative array> (uses RFC 3986)
  *   - headers  : <header name/value associative array>
  *   - body     : source to get the HTTP request body from;
  *                this can simply be a string (always), a resource for
- *                PUT requests, and a field/value array for POST request
+ *                PUT requests, and a field/value array for POST request;
+ *                array bodies are encoded as multipart/form-data and strings
+ *                use application/x-www-form-urlencoded (headers sent automatically)
  *   - stream   : resource to stream the HTTP response body to
  *
  * @author Aaron Schulz
@@ -179,7 +181,12 @@ class MultiHttpClient {
                curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
 
                $url = $req['url'];
-               $query = http_build_query( $req['query'], '', '&', PHP_QUERY_RFC3986 );
+               // PHP_QUERY_RFC3986 is PHP 5.4+ only
+               $query = str_replace(
+                       array( '+', '%7E' ),
+                       array( '%20', '~' ),
+                       http_build_query( $req['query'], '', '&' )
+               );
                if ( $query != '' ) {
                        $url .= strpos( $req['url'], '?' ) === false ? "?$query" : "&$query";
                }
index 92ca7d8..eb98a4a 100644 (file)
@@ -39,6 +39,13 @@ class XmlTypeCheck {
         */
        public $rootElement = '';
 
+       /**
+        * Additional parsing options
+        */
+       private $parserOptions = array(
+               'processing_instruction_handler' => '',
+       );
+
        /**
         * @param string $input a filename or string containing the XML element
         * @param callable $filterCallback (optional)
@@ -48,9 +55,13 @@ class XmlTypeCheck {
         *        Filter should return 'true' to toggle on $this->filterMatch
         * @param boolean $isFile (optional) indicates if the first parameter is a
         *        filename (default, true) or if it is a string (false)
+        * @param array $options list of additional parsing options:
+        *        processing_instruction_handler: Callback for xml_set_processing_instruction_handler
         */
-       function __construct( $input, $filterCallback = null, $isFile = true ) {
+       function __construct( $input, $filterCallback = null, $isFile = true, $options = array() ) {
                $this->filterCallback = $filterCallback;
+               $this->parserOptions = array_merge( $this->parserOptions, $options );
+
                if ( $isFile ) {
                        $this->validateFromFile( $input );
                } else {
@@ -107,6 +118,12 @@ class XmlTypeCheck {
                // case folding violates XML standard, turn it off
                xml_parser_set_option( $parser, XML_OPTION_CASE_FOLDING, false );
                xml_set_element_handler( $parser, array( $this, 'rootElementOpen' ), false );
+               if ( $this->parserOptions['processing_instruction_handler'] ) {
+                       xml_set_processing_instruction_handler(
+                               $parser,
+                               array( $this, 'processingInstructionHandler' )
+                       );
+               }
                return $parser;
        }
 
@@ -181,4 +198,16 @@ class XmlTypeCheck {
                        $this->filterMatch = true;
                }
        }
+
+       /**
+        * @param $parser
+        * @param $target
+        * @param $data
+        */
+       private function processingInstructionHandler( $parser, $target, $data ) {
+               if ( call_user_func( $this->parserOptions['processing_instruction_handler'], $target, $data ) ) {
+                       // Filter hit!
+                       $this->filterMatch = true;
+               }
+       }
 }
index 1be04a7..7f108c8 100644 (file)
@@ -187,7 +187,9 @@ class BitmapHandler extends ImageHandler {
                                        wfHostname(), $image->getName() ) );
 
                        return new MediaTransformError( 'thumbnail_error',
-                               $scalerParams['clientWidth'], $scalerParams['clientHeight'] );
+                               $scalerParams['clientWidth'], $scalerParams['clientHeight'],
+                               wfMessage( 'filemissing' )->text()
+                       );
                }
 
                # Try a hook
@@ -227,7 +229,9 @@ class BitmapHandler extends ImageHandler {
                } elseif ( $removed ) {
                        # Thumbnail was zero-byte and had to be removed
                        return new MediaTransformError( 'thumbnail_error',
-                               $scalerParams['clientWidth'], $scalerParams['clientHeight'] );
+                               $scalerParams['clientWidth'], $scalerParams['clientHeight'],
+                               wfMessage( 'unknown-error' )->text()
+                       );
                } elseif ( $mto ) {
                        return $mto;
                } else {
diff --git a/includes/normal/.gitignore b/includes/normal/.gitignore
new file mode 100644 (file)
index 0000000..0dea457
--- /dev/null
@@ -0,0 +1,7 @@
+/CompositionExclusions.txt
+/DerivedNormalizationProps.txt
+/NormalizationCorrections.txt
+/NormalizationTest.txt
+/UTF-8-test.txt
+/UnicodeData.txt
+/testdata
index 66348ee..76cb68b 100644 (file)
@@ -16,14 +16,11 @@ PHP=php
 FETCH=wget
 #FETCH=fetch
 
-all : UtfNormalData.inc Utf8Case.php
+all : UtfNormalData.inc
 
 UtfNormalData.inc : UtfNormalGenerate.php UtfNormalUtil.php UnicodeData.txt CompositionExclusions.txt NormalizationCorrections.txt DerivedNormalizationProps.txt
        $(PHP) UtfNormalGenerate.php
 
-Utf8Case.php : Utf8CaseGenerate.php UtfNormalUtil.php UnicodeData.txt
-       $(PHP) Utf8CaseGenerate.php
-
 test : testutf8 UtfNormalTest.php UtfNormalData.inc NormalizationTest.txt
        $(PHP) UtfNormalTest.php
 
diff --git a/includes/normal/Utf8Case.php b/includes/normal/Utf8Case.php
deleted file mode 100644 (file)
index abc56e4..0000000
+++ /dev/null
@@ -1,2109 +0,0 @@
-<?php
-/**
- * Simple 1:1 upper/lowercase switching arrays for utf-8 text.
- * Won't get context-sensitive things yet.
- *
- * Hack for bugs in ucfirst() and company
- *
- * These are pulled from memcached if possible, as this is faster than filling
- * up a big array manually.
- *
- * @file
- * @ingroup Language
- */
-
-/**
- * Translation array to get upper case character
- */
-$wikiUpperChars = array(
-       'a' => 'A',
-       'b' => 'B',
-       'c' => 'C',
-       'd' => 'D',
-       'e' => 'E',
-       'f' => 'F',
-       'g' => 'G',
-       'h' => 'H',
-       'i' => 'I',
-       'j' => 'J',
-       'k' => 'K',
-       'l' => 'L',
-       'm' => 'M',
-       'n' => 'N',
-       'o' => 'O',
-       'p' => 'P',
-       'q' => 'Q',
-       'r' => 'R',
-       's' => 'S',
-       't' => 'T',
-       'u' => 'U',
-       'v' => 'V',
-       'w' => 'W',
-       'x' => 'X',
-       'y' => 'Y',
-       'z' => 'Z',
-       'µ' => 'Μ',
-       'à' => 'À',
-       'á' => 'Á',
-       'â' => 'Â',
-       'ã' => 'Ã',
-       'ä' => 'Ä',
-       'å' => 'Å',
-       'æ' => 'Æ',
-       'ç' => 'Ç',
-       'è' => 'È',
-       'é' => 'É',
-       'ê' => 'Ê',
-       'ë' => 'Ë',
-       'ì' => 'Ì',
-       'í' => 'Í',
-       'î' => 'Î',
-       'ï' => 'Ï',
-       'ð' => 'Ð',
-       'ñ' => 'Ñ',
-       'ò' => 'Ò',
-       'ó' => 'Ó',
-       'ô' => 'Ô',
-       'õ' => 'Õ',
-       'ö' => 'Ö',
-       'ø' => 'Ø',
-       'ù' => 'Ù',
-       'ú' => 'Ú',
-       'û' => 'Û',
-       'ü' => 'Ü',
-       'ý' => 'Ý',
-       'þ' => 'Þ',
-       'ÿ' => 'Ÿ',
-       'ā' => 'Ā',
-       'ă' => 'Ă',
-       'ą' => 'Ą',
-       'ć' => 'Ć',
-       'ĉ' => 'Ĉ',
-       'ċ' => 'Ċ',
-       'č' => 'Č',
-       'ď' => 'Ď',
-       'đ' => 'Đ',
-       'ē' => 'Ē',
-       'ĕ' => 'Ĕ',
-       'ė' => 'Ė',
-       'ę' => 'Ę',
-       'ě' => 'Ě',
-       'ĝ' => 'Ĝ',
-       'ğ' => 'Ğ',
-       'ġ' => 'Ġ',
-       'ģ' => 'Ģ',
-       'ĥ' => 'Ĥ',
-       'ħ' => 'Ħ',
-       'ĩ' => 'Ĩ',
-       'ī' => 'Ī',
-       'ĭ' => 'Ĭ',
-       'į' => 'Į',
-       'ı' => 'I',
-       'ij' => 'IJ',
-       'ĵ' => 'Ĵ',
-       'ķ' => 'Ķ',
-       'ĺ' => 'Ĺ',
-       'ļ' => 'Ļ',
-       'ľ' => 'Ľ',
-       'ŀ' => 'Ŀ',
-       'ł' => 'Ł',
-       'ń' => 'Ń',
-       'ņ' => 'Ņ',
-       'ň' => 'Ň',
-       'ŋ' => 'Ŋ',
-       'ō' => 'Ō',
-       'ŏ' => 'Ŏ',
-       'ő' => 'Ő',
-       'œ' => 'Œ',
-       'ŕ' => 'Ŕ',
-       'ŗ' => 'Ŗ',
-       'ř' => 'Ř',
-       'ś' => 'Ś',
-       'ŝ' => 'Ŝ',
-       'ş' => 'Ş',
-       'š' => 'Š',
-       'ţ' => 'Ţ',
-       'ť' => 'Ť',
-       'ŧ' => 'Ŧ',
-       'ũ' => 'Ũ',
-       'ū' => 'Ū',
-       'ŭ' => 'Ŭ',
-       'ů' => 'Ů',
-       'ű' => 'Ű',
-       'ų' => 'Ų',
-       'ŵ' => 'Ŵ',
-       'ŷ' => 'Ŷ',
-       'ź' => 'Ź',
-       'ż' => 'Ż',
-       'ž' => 'Ž',
-       'ſ' => 'S',
-       'ƀ' => 'Ƀ',
-       'ƃ' => 'Ƃ',
-       'ƅ' => 'Ƅ',
-       'ƈ' => 'Ƈ',
-       'ƌ' => 'Ƌ',
-       'ƒ' => 'Ƒ',
-       'ƕ' => 'Ƕ',
-       'ƙ' => 'Ƙ',
-       'ƚ' => 'Ƚ',
-       'ƞ' => 'Ƞ',
-       'ơ' => 'Ơ',
-       'ƣ' => 'Ƣ',
-       'ƥ' => 'Ƥ',
-       'ƨ' => 'Ƨ',
-       'ƭ' => 'Ƭ',
-       'ư' => 'Ư',
-       'ƴ' => 'Ƴ',
-       'ƶ' => 'Ƶ',
-       'ƹ' => 'Ƹ',
-       'ƽ' => 'Ƽ',
-       'ƿ' => 'Ƿ',
-       'Dž' => 'DŽ',
-       'dž' => 'DŽ',
-       'Lj' => 'LJ',
-       'lj' => 'LJ',
-       'Nj' => 'NJ',
-       'nj' => 'NJ',
-       'ǎ' => 'Ǎ',
-       'ǐ' => 'Ǐ',
-       'ǒ' => 'Ǒ',
-       'ǔ' => 'Ǔ',
-       'ǖ' => 'Ǖ',
-       'ǘ' => 'Ǘ',
-       'ǚ' => 'Ǚ',
-       'ǜ' => 'Ǜ',
-       'ǝ' => 'Ǝ',
-       'ǟ' => 'Ǟ',
-       'ǡ' => 'Ǡ',
-       'ǣ' => 'Ǣ',
-       'ǥ' => 'Ǥ',
-       'ǧ' => 'Ǧ',
-       'ǩ' => 'Ǩ',
-       'ǫ' => 'Ǫ',
-       'ǭ' => 'Ǭ',
-       'ǯ' => 'Ǯ',
-       'Dz' => 'DZ',
-       'dz' => 'DZ',
-       'ǵ' => 'Ǵ',
-       'ǹ' => 'Ǹ',
-       'ǻ' => 'Ǻ',
-       'ǽ' => 'Ǽ',
-       'ǿ' => 'Ǿ',
-       'ȁ' => 'Ȁ',
-       'ȃ' => 'Ȃ',
-       'ȅ' => 'Ȅ',
-       'ȇ' => 'Ȇ',
-       'ȉ' => 'Ȉ',
-       'ȋ' => 'Ȋ',
-       'ȍ' => 'Ȍ',
-       'ȏ' => 'Ȏ',
-       'ȑ' => 'Ȑ',
-       'ȓ' => 'Ȓ',
-       'ȕ' => 'Ȕ',
-       'ȗ' => 'Ȗ',
-       'ș' => 'Ș',
-       'ț' => 'Ț',
-       'ȝ' => 'Ȝ',
-       'ȟ' => 'Ȟ',
-       'ȣ' => 'Ȣ',
-       'ȥ' => 'Ȥ',
-       'ȧ' => 'Ȧ',
-       'ȩ' => 'Ȩ',
-       'ȫ' => 'Ȫ',
-       'ȭ' => 'Ȭ',
-       'ȯ' => 'Ȯ',
-       'ȱ' => 'Ȱ',
-       'ȳ' => 'Ȳ',
-       'ȼ' => 'Ȼ',
-       'ȿ' => 'Ȿ',
-       'ɀ' => 'Ɀ',
-       'ɂ' => 'Ɂ',
-       'ɇ' => 'Ɇ',
-       'ɉ' => 'Ɉ',
-       'ɋ' => 'Ɋ',
-       'ɍ' => 'Ɍ',
-       'ɏ' => 'Ɏ',
-       'ɐ' => 'Ɐ',
-       'ɑ' => 'Ɑ',
-       'ɒ' => 'Ɒ',
-       'ɓ' => 'Ɓ',
-       'ɔ' => 'Ɔ',
-       'ɖ' => 'Ɖ',
-       'ɗ' => 'Ɗ',
-       'ə' => 'Ə',
-       'ɛ' => 'Ɛ',
-       'ɠ' => 'Ɠ',
-       'ɣ' => 'Ɣ',
-       'ɥ' => 'Ɥ',
-       'ɨ' => 'Ɨ',
-       'ɩ' => 'Ɩ',
-       'ɫ' => 'Ɫ',
-       'ɯ' => 'Ɯ',
-       'ɱ' => 'Ɱ',
-       'ɲ' => 'Ɲ',
-       'ɵ' => 'Ɵ',
-       'ɽ' => 'Ɽ',
-       'ʀ' => 'Ʀ',
-       'ʃ' => 'Ʃ',
-       'ʈ' => 'Ʈ',
-       'ʉ' => 'Ʉ',
-       'ʊ' => 'Ʊ',
-       'ʋ' => 'Ʋ',
-       'ʌ' => 'Ʌ',
-       'ʒ' => 'Ʒ',
-       'ͅ' => 'Ι',
-       'ͱ' => 'Ͱ',
-       'ͳ' => 'Ͳ',
-       'ͷ' => 'Ͷ',
-       'ͻ' => 'Ͻ',
-       'ͼ' => 'Ͼ',
-       'ͽ' => 'Ͽ',
-       'ά' => 'Ά',
-       'έ' => 'Έ',
-       'ή' => 'Ή',
-       'ί' => 'Ί',
-       'α' => 'Α',
-       'β' => 'Β',
-       'γ' => 'Γ',
-       'δ' => 'Δ',
-       'ε' => 'Ε',
-       'ζ' => 'Ζ',
-       'η' => 'Η',
-       'θ' => 'Θ',
-       'ι' => 'Ι',
-       'κ' => 'Κ',
-       'λ' => 'Λ',
-       'μ' => 'Μ',
-       'ν' => 'Ν',
-       'ξ' => 'Ξ',
-       'ο' => 'Ο',
-       'π' => 'Π',
-       'ρ' => 'Ρ',
-       'ς' => 'Σ',
-       'σ' => 'Σ',
-       'τ' => 'Τ',
-       'υ' => 'Υ',
-       'φ' => 'Φ',
-       'χ' => 'Χ',
-       'ψ' => 'Ψ',
-       'ω' => 'Ω',
-       'ϊ' => 'Ϊ',
-       'ϋ' => 'Ϋ',
-       'ό' => 'Ό',
-       'ύ' => 'Ύ',
-       'ώ' => 'Ώ',
-       'ϐ' => 'Β',
-       'ϑ' => 'Θ',
-       'ϕ' => 'Φ',
-       'ϖ' => 'Π',
-       'ϗ' => 'Ϗ',
-       'ϙ' => 'Ϙ',
-       'ϛ' => 'Ϛ',
-       'ϝ' => 'Ϝ',
-       'ϟ' => 'Ϟ',
-       'ϡ' => 'Ϡ',
-       'ϣ' => 'Ϣ',
-       'ϥ' => 'Ϥ',
-       'ϧ' => 'Ϧ',
-       'ϩ' => 'Ϩ',
-       'ϫ' => 'Ϫ',
-       'ϭ' => 'Ϭ',
-       'ϯ' => 'Ϯ',
-       'ϰ' => 'Κ',
-       'ϱ' => 'Ρ',
-       'ϲ' => 'Ϲ',
-       'ϵ' => 'Ε',
-       'ϸ' => 'Ϸ',
-       'ϻ' => 'Ϻ',
-       'а' => 'А',
-       'б' => 'Б',
-       'в' => 'В',
-       'г' => 'Г',
-       'д' => 'Д',
-       'е' => 'Е',
-       'ж' => 'Ж',
-       'з' => 'З',
-       'и' => 'И',
-       'й' => 'Й',
-       'к' => 'К',
-       'л' => 'Л',
-       'м' => 'М',
-       'н' => 'Н',
-       'о' => 'О',
-       'п' => 'П',
-       'р' => 'Р',
-       'с' => 'С',
-       'т' => 'Т',
-       'у' => 'У',
-       'ф' => 'Ф',
-       'х' => 'Х',
-       'ц' => 'Ц',
-       'ч' => 'Ч',
-       'ш' => 'Ш',
-       'щ' => 'Щ',
-       'ъ' => 'Ъ',
-       'ы' => 'Ы',
-       'ь' => 'Ь',
-       'э' => 'Э',
-       'ю' => 'Ю',
-       'я' => 'Я',
-       'ѐ' => 'Ѐ',
-       'ё' => 'Ё',
-       'ђ' => 'Ђ',
-       'ѓ' => 'Ѓ',
-       'є' => 'Є',
-       'ѕ' => 'Ѕ',
-       'і' => 'І',
-       'ї' => 'Ї',
-       'ј' => 'Ј',
-       'љ' => 'Љ',
-       'њ' => 'Њ',
-       'ћ' => 'Ћ',
-       'ќ' => 'Ќ',
-       'ѝ' => 'Ѝ',
-       'ў' => 'Ў',
-       'џ' => 'Џ',
-       'ѡ' => 'Ѡ',
-       'ѣ' => 'Ѣ',
-       'ѥ' => 'Ѥ',
-       'ѧ' => 'Ѧ',
-       'ѩ' => 'Ѩ',
-       'ѫ' => 'Ѫ',
-       'ѭ' => 'Ѭ',
-       'ѯ' => 'Ѯ',
-       'ѱ' => 'Ѱ',
-       'ѳ' => 'Ѳ',
-       'ѵ' => 'Ѵ',
-       'ѷ' => 'Ѷ',
-       'ѹ' => 'Ѹ',
-       'ѻ' => 'Ѻ',
-       'ѽ' => 'Ѽ',
-       'ѿ' => 'Ѿ',
-       'ҁ' => 'Ҁ',
-       'ҋ' => 'Ҋ',
-       'ҍ' => 'Ҍ',
-       'ҏ' => 'Ҏ',
-       'ґ' => 'Ґ',
-       'ғ' => 'Ғ',
-       'ҕ' => 'Ҕ',
-       'җ' => 'Җ',
-       'ҙ' => 'Ҙ',
-       'қ' => 'Қ',
-       'ҝ' => 'Ҝ',
-       'ҟ' => 'Ҟ',
-       'ҡ' => 'Ҡ',
-       'ң' => 'Ң',
-       'ҥ' => 'Ҥ',
-       'ҧ' => 'Ҧ',
-       'ҩ' => 'Ҩ',
-       'ҫ' => 'Ҫ',
-       'ҭ' => 'Ҭ',
-       'ү' => 'Ү',
-       'ұ' => 'Ұ',
-       'ҳ' => 'Ҳ',
-       'ҵ' => 'Ҵ',
-       'ҷ' => 'Ҷ',
-       'ҹ' => 'Ҹ',
-       'һ' => 'Һ',
-       'ҽ' => 'Ҽ',
-       'ҿ' => 'Ҿ',
-       'ӂ' => 'Ӂ',
-       'ӄ' => 'Ӄ',
-       'ӆ' => 'Ӆ',
-       'ӈ' => 'Ӈ',
-       'ӊ' => 'Ӊ',
-       'ӌ' => 'Ӌ',
-       'ӎ' => 'Ӎ',
-       'ӏ' => 'Ӏ',
-       'ӑ' => 'Ӑ',
-       'ӓ' => 'Ӓ',
-       'ӕ' => 'Ӕ',
-       'ӗ' => 'Ӗ',
-       'ә' => 'Ә',
-       'ӛ' => 'Ӛ',
-       'ӝ' => 'Ӝ',
-       'ӟ' => 'Ӟ',
-       'ӡ' => 'Ӡ',
-       'ӣ' => 'Ӣ',
-       'ӥ' => 'Ӥ',
-       'ӧ' => 'Ӧ',
-       'ө' => 'Ө',
-       'ӫ' => 'Ӫ',
-       'ӭ' => 'Ӭ',
-       'ӯ' => 'Ӯ',
-       'ӱ' => 'Ӱ',
-       'ӳ' => 'Ӳ',
-       'ӵ' => 'Ӵ',
-       'ӷ' => 'Ӷ',
-       'ӹ' => 'Ӹ',
-       'ӻ' => 'Ӻ',
-       'ӽ' => 'Ӽ',
-       'ӿ' => 'Ӿ',
-       'ԁ' => 'Ԁ',
-       'ԃ' => 'Ԃ',
-       'ԅ' => 'Ԅ',
-       'ԇ' => 'Ԇ',
-       'ԉ' => 'Ԉ',
-       'ԋ' => 'Ԋ',
-       'ԍ' => 'Ԍ',
-       'ԏ' => 'Ԏ',
-       'ԑ' => 'Ԑ',
-       'ԓ' => 'Ԓ',
-       'ԕ' => 'Ԕ',
-       'ԗ' => 'Ԗ',
-       'ԙ' => 'Ԙ',
-       'ԛ' => 'Ԛ',
-       'ԝ' => 'Ԝ',
-       'ԟ' => 'Ԟ',
-       'ԡ' => 'Ԡ',
-       'ԣ' => 'Ԣ',
-       'ԥ' => 'Ԥ',
-       'ԧ' => 'Ԧ',
-       'ա' => 'Ա',
-       'բ' => 'Բ',
-       'գ' => 'Գ',
-       'դ' => 'Դ',
-       'ե' => 'Ե',
-       'զ' => 'Զ',
-       'է' => 'Է',
-       'ը' => 'Ը',
-       'թ' => 'Թ',
-       'ժ' => 'Ժ',
-       'ի' => 'Ի',
-       'լ' => 'Լ',
-       'խ' => 'Խ',
-       'ծ' => 'Ծ',
-       'կ' => 'Կ',
-       'հ' => 'Հ',
-       'ձ' => 'Ձ',
-       'ղ' => 'Ղ',
-       'ճ' => 'Ճ',
-       'մ' => 'Մ',
-       'յ' => 'Յ',
-       'ն' => 'Ն',
-       'շ' => 'Շ',
-       'ո' => 'Ո',
-       'չ' => 'Չ',
-       'պ' => 'Պ',
-       'ջ' => 'Ջ',
-       'ռ' => 'Ռ',
-       'ս' => 'Ս',
-       'վ' => 'Վ',
-       'տ' => 'Տ',
-       'ր' => 'Ր',
-       'ց' => 'Ց',
-       'ւ' => 'Ւ',
-       'փ' => 'Փ',
-       'ք' => 'Ք',
-       'օ' => 'Օ',
-       'ֆ' => 'Ֆ',
-       'ᵹ' => 'Ᵹ',
-       'ᵽ' => 'Ᵽ',
-       'ḁ' => 'Ḁ',
-       'ḃ' => 'Ḃ',
-       'ḅ' => 'Ḅ',
-       'ḇ' => 'Ḇ',
-       'ḉ' => 'Ḉ',
-       'ḋ' => 'Ḋ',
-       'ḍ' => 'Ḍ',
-       'ḏ' => 'Ḏ',
-       'ḑ' => 'Ḑ',
-       'ḓ' => 'Ḓ',
-       'ḕ' => 'Ḕ',
-       'ḗ' => 'Ḗ',
-       'ḙ' => 'Ḙ',
-       'ḛ' => 'Ḛ',
-       'ḝ' => 'Ḝ',
-       'ḟ' => 'Ḟ',
-       'ḡ' => 'Ḡ',
-       'ḣ' => 'Ḣ',
-       'ḥ' => 'Ḥ',
-       'ḧ' => 'Ḧ',
-       'ḩ' => 'Ḩ',
-       'ḫ' => 'Ḫ',
-       'ḭ' => 'Ḭ',
-       'ḯ' => 'Ḯ',
-       'ḱ' => 'Ḱ',
-       'ḳ' => 'Ḳ',
-       'ḵ' => 'Ḵ',
-       'ḷ' => 'Ḷ',
-       'ḹ' => 'Ḹ',
-       'ḻ' => 'Ḻ',
-       'ḽ' => 'Ḽ',
-       'ḿ' => 'Ḿ',
-       'ṁ' => 'Ṁ',
-       'ṃ' => 'Ṃ',
-       'ṅ' => 'Ṅ',
-       'ṇ' => 'Ṇ',
-       'ṉ' => 'Ṉ',
-       'ṋ' => 'Ṋ',
-       'ṍ' => 'Ṍ',
-       'ṏ' => 'Ṏ',
-       'ṑ' => 'Ṑ',
-       'ṓ' => 'Ṓ',
-       'ṕ' => 'Ṕ',
-       'ṗ' => 'Ṗ',
-       'ṙ' => 'Ṙ',
-       'ṛ' => 'Ṛ',
-       'ṝ' => 'Ṝ',
-       'ṟ' => 'Ṟ',
-       'ṡ' => 'Ṡ',
-       'ṣ' => 'Ṣ',
-       'ṥ' => 'Ṥ',
-       'ṧ' => 'Ṧ',
-       'ṩ' => 'Ṩ',
-       'ṫ' => 'Ṫ',
-       'ṭ' => 'Ṭ',
-       'ṯ' => 'Ṯ',
-       'ṱ' => 'Ṱ',
-       'ṳ' => 'Ṳ',
-       'ṵ' => 'Ṵ',
-       'ṷ' => 'Ṷ',
-       'ṹ' => 'Ṹ',
-       'ṻ' => 'Ṻ',
-       'ṽ' => 'Ṽ',
-       'ṿ' => 'Ṿ',
-       'ẁ' => 'Ẁ',
-       'ẃ' => 'Ẃ',
-       'ẅ' => 'Ẅ',
-       'ẇ' => 'Ẇ',
-       'ẉ' => 'Ẉ',
-       'ẋ' => 'Ẋ',
-       'ẍ' => 'Ẍ',
-       'ẏ' => 'Ẏ',
-       'ẑ' => 'Ẑ',
-       'ẓ' => 'Ẓ',
-       'ẕ' => 'Ẕ',
-       'ẛ' => 'Ṡ',
-       'ạ' => 'Ạ',
-       'ả' => 'Ả',
-       'ấ' => 'Ấ',
-       'ầ' => 'Ầ',
-       'ẩ' => 'Ẩ',
-       'ẫ' => 'Ẫ',
-       'ậ' => 'Ậ',
-       'ắ' => 'Ắ',
-       'ằ' => 'Ằ',
-       'ẳ' => 'Ẳ',
-       'ẵ' => 'Ẵ',
-       'ặ' => 'Ặ',
-       'ẹ' => 'Ẹ',
-       'ẻ' => 'Ẻ',
-       'ẽ' => 'Ẽ',
-       'ế' => 'Ế',
-       'ề' => 'Ề',
-       'ể' => 'Ể',
-       'ễ' => 'Ễ',
-       'ệ' => 'Ệ',
-       'ỉ' => 'Ỉ',
-       'ị' => 'Ị',
-       'ọ' => 'Ọ',
-       'ỏ' => 'Ỏ',
-       'ố' => 'Ố',
-       'ồ' => 'Ồ',
-       'ổ' => 'Ổ',
-       'ỗ' => 'Ỗ',
-       'ộ' => 'Ộ',
-       'ớ' => 'Ớ',
-       'ờ' => 'Ờ',
-       'ở' => 'Ở',
-       'ỡ' => 'Ỡ',
-       'ợ' => 'Ợ',
-       'ụ' => 'Ụ',
-       'ủ' => 'Ủ',
-       'ứ' => 'Ứ',
-       'ừ' => 'Ừ',
-       'ử' => 'Ử',
-       'ữ' => 'Ữ',
-       'ự' => 'Ự',
-       'ỳ' => 'Ỳ',
-       'ỵ' => 'Ỵ',
-       'ỷ' => 'Ỷ',
-       'ỹ' => 'Ỹ',
-       'ỻ' => 'Ỻ',
-       'ỽ' => 'Ỽ',
-       'ỿ' => 'Ỿ',
-       'ἀ' => 'Ἀ',
-       'ἁ' => 'Ἁ',
-       'ἂ' => 'Ἂ',
-       'ἃ' => 'Ἃ',
-       'ἄ' => 'Ἄ',
-       'ἅ' => 'Ἅ',
-       'ἆ' => 'Ἆ',
-       'ἇ' => 'Ἇ',
-       'ἐ' => 'Ἐ',
-       'ἑ' => 'Ἑ',
-       'ἒ' => 'Ἒ',
-       'ἓ' => 'Ἓ',
-       'ἔ' => 'Ἔ',
-       'ἕ' => 'Ἕ',
-       'ἠ' => 'Ἠ',
-       'ἡ' => 'Ἡ',
-       'ἢ' => 'Ἢ',
-       'ἣ' => 'Ἣ',
-       'ἤ' => 'Ἤ',
-       'ἥ' => 'Ἥ',
-       'ἦ' => 'Ἦ',
-       'ἧ' => 'Ἧ',
-       'ἰ' => 'Ἰ',
-       'ἱ' => 'Ἱ',
-       'ἲ' => 'Ἲ',
-       'ἳ' => 'Ἳ',
-       'ἴ' => 'Ἴ',
-       'ἵ' => 'Ἵ',
-       'ἶ' => 'Ἶ',
-       'ἷ' => 'Ἷ',
-       'ὀ' => 'Ὀ',
-       'ὁ' => 'Ὁ',
-       'ὂ' => 'Ὂ',
-       'ὃ' => 'Ὃ',
-       'ὄ' => 'Ὄ',
-       'ὅ' => 'Ὅ',
-       'ὑ' => 'Ὑ',
-       'ὓ' => 'Ὓ',
-       'ὕ' => 'Ὕ',
-       'ὗ' => 'Ὗ',
-       'ὠ' => 'Ὠ',
-       'ὡ' => 'Ὡ',
-       'ὢ' => 'Ὢ',
-       'ὣ' => 'Ὣ',
-       'ὤ' => 'Ὤ',
-       'ὥ' => 'Ὥ',
-       'ὦ' => 'Ὦ',
-       'ὧ' => 'Ὧ',
-       'ὰ' => 'Ὰ',
-       'ά' => 'Ά',
-       'ὲ' => 'Ὲ',
-       'έ' => 'Έ',
-       'ὴ' => 'Ὴ',
-       'ή' => 'Ή',
-       'ὶ' => 'Ὶ',
-       'ί' => 'Ί',
-       'ὸ' => 'Ὸ',
-       'ό' => 'Ό',
-       'ὺ' => 'Ὺ',
-       'ύ' => 'Ύ',
-       'ὼ' => 'Ὼ',
-       'ώ' => 'Ώ',
-       'ᾀ' => 'ᾈ',
-       'ᾁ' => 'ᾉ',
-       'ᾂ' => 'ᾊ',
-       'ᾃ' => 'ᾋ',
-       'ᾄ' => 'ᾌ',
-       'ᾅ' => 'ᾍ',
-       'ᾆ' => 'ᾎ',
-       'ᾇ' => 'ᾏ',
-       'ᾐ' => 'ᾘ',
-       'ᾑ' => 'ᾙ',
-       'ᾒ' => 'ᾚ',
-       'ᾓ' => 'ᾛ',
-       'ᾔ' => 'ᾜ',
-       'ᾕ' => 'ᾝ',
-       'ᾖ' => 'ᾞ',
-       'ᾗ' => 'ᾟ',
-       'ᾠ' => 'ᾨ',
-       'ᾡ' => 'ᾩ',
-       'ᾢ' => 'ᾪ',
-       'ᾣ' => 'ᾫ',
-       'ᾤ' => 'ᾬ',
-       'ᾥ' => 'ᾭ',
-       'ᾦ' => 'ᾮ',
-       'ᾧ' => 'ᾯ',
-       'ᾰ' => 'Ᾰ',
-       'ᾱ' => 'Ᾱ',
-       'ᾳ' => 'ᾼ',
-       'ι' => 'Ι',
-       'ῃ' => 'ῌ',
-       'ῐ' => 'Ῐ',
-       'ῑ' => 'Ῑ',
-       'ῠ' => 'Ῠ',
-       'ῡ' => 'Ῡ',
-       'ῥ' => 'Ῥ',
-       'ῳ' => 'ῼ',
-       'ⅎ' => 'Ⅎ',
-       'ⅰ' => 'Ⅰ',
-       'ⅱ' => 'Ⅱ',
-       'ⅲ' => 'Ⅲ',
-       'ⅳ' => 'Ⅳ',
-       'ⅴ' => 'Ⅴ',
-       'ⅵ' => 'Ⅵ',
-       'ⅶ' => 'Ⅶ',
-       'ⅷ' => 'Ⅷ',
-       'ⅸ' => 'Ⅸ',
-       'ⅹ' => 'Ⅹ',
-       'ⅺ' => 'Ⅺ',
-       'ⅻ' => 'Ⅻ',
-       'ⅼ' => 'Ⅼ',
-       'ⅽ' => 'Ⅽ',
-       'ⅾ' => 'Ⅾ',
-       'ⅿ' => 'Ⅿ',
-       'ↄ' => 'Ↄ',
-       'ⓐ' => 'Ⓐ',
-       'ⓑ' => 'Ⓑ',
-       'ⓒ' => 'Ⓒ',
-       'ⓓ' => 'Ⓓ',
-       'ⓔ' => 'Ⓔ',
-       'ⓕ' => 'Ⓕ',
-       'ⓖ' => 'Ⓖ',
-       'ⓗ' => 'Ⓗ',
-       'ⓘ' => 'Ⓘ',
-       'ⓙ' => 'Ⓙ',
-       'ⓚ' => 'Ⓚ',
-       'ⓛ' => 'Ⓛ',
-       'ⓜ' => 'Ⓜ',
-       'ⓝ' => 'Ⓝ',
-       'ⓞ' => 'Ⓞ',
-       'ⓟ' => 'Ⓟ',
-       'ⓠ' => 'Ⓠ',
-       'ⓡ' => 'Ⓡ',
-       'ⓢ' => 'Ⓢ',
-       'ⓣ' => 'Ⓣ',
-       'ⓤ' => 'Ⓤ',
-       'ⓥ' => 'Ⓥ',
-       'ⓦ' => 'Ⓦ',
-       'ⓧ' => 'Ⓧ',
-       'ⓨ' => 'Ⓨ',
-       'ⓩ' => 'Ⓩ',
-       'ⰰ' => 'Ⰰ',
-       'ⰱ' => 'Ⰱ',
-       'ⰲ' => 'Ⰲ',
-       'ⰳ' => 'Ⰳ',
-       'ⰴ' => 'Ⰴ',
-       'ⰵ' => 'Ⰵ',
-       'ⰶ' => 'Ⰶ',
-       'ⰷ' => 'Ⰷ',
-       'ⰸ' => 'Ⰸ',
-       'ⰹ' => 'Ⰹ',
-       'ⰺ' => 'Ⰺ',
-       'ⰻ' => 'Ⰻ',
-       'ⰼ' => 'Ⰼ',
-       'ⰽ' => 'Ⰽ',
-       'ⰾ' => 'Ⰾ',
-       'ⰿ' => 'Ⰿ',
-       'ⱀ' => 'Ⱀ',
-       'ⱁ' => 'Ⱁ',
-       'ⱂ' => 'Ⱂ',
-       'ⱃ' => 'Ⱃ',
-       'ⱄ' => 'Ⱄ',
-       'ⱅ' => 'Ⱅ',
-       'ⱆ' => 'Ⱆ',
-       'ⱇ' => 'Ⱇ',
-       'ⱈ' => 'Ⱈ',
-       'ⱉ' => 'Ⱉ',
-       'ⱊ' => 'Ⱊ',
-       'ⱋ' => 'Ⱋ',
-       'ⱌ' => 'Ⱌ',
-       'ⱍ' => 'Ⱍ',
-       'ⱎ' => 'Ⱎ',
-       'ⱏ' => 'Ⱏ',
-       'ⱐ' => 'Ⱐ',
-       'ⱑ' => 'Ⱑ',
-       'ⱒ' => 'Ⱒ',
-       'ⱓ' => 'Ⱓ',
-       'ⱔ' => 'Ⱔ',
-       'ⱕ' => 'Ⱕ',
-       'ⱖ' => 'Ⱖ',
-       'ⱗ' => 'Ⱗ',
-       'ⱘ' => 'Ⱘ',
-       'ⱙ' => 'Ⱙ',
-       'ⱚ' => 'Ⱚ',
-       'ⱛ' => 'Ⱛ',
-       'ⱜ' => 'Ⱜ',
-       'ⱝ' => 'Ⱝ',
-       'ⱞ' => 'Ⱞ',
-       'ⱡ' => 'Ⱡ',
-       'ⱥ' => 'Ⱥ',
-       'ⱦ' => 'Ⱦ',
-       'ⱨ' => 'Ⱨ',
-       'ⱪ' => 'Ⱪ',
-       'ⱬ' => 'Ⱬ',
-       'ⱳ' => 'Ⱳ',
-       'ⱶ' => 'Ⱶ',
-       'ⲁ' => 'Ⲁ',
-       'ⲃ' => 'Ⲃ',
-       'ⲅ' => 'Ⲅ',
-       'ⲇ' => 'Ⲇ',
-       'ⲉ' => 'Ⲉ',
-       'ⲋ' => 'Ⲋ',
-       'ⲍ' => 'Ⲍ',
-       'ⲏ' => 'Ⲏ',
-       'ⲑ' => 'Ⲑ',
-       'ⲓ' => 'Ⲓ',
-       'ⲕ' => 'Ⲕ',
-       'ⲗ' => 'Ⲗ',
-       'ⲙ' => 'Ⲙ',
-       'ⲛ' => 'Ⲛ',
-       'ⲝ' => 'Ⲝ',
-       'ⲟ' => 'Ⲟ',
-       'ⲡ' => 'Ⲡ',
-       'ⲣ' => 'Ⲣ',
-       'ⲥ' => 'Ⲥ',
-       'ⲧ' => 'Ⲧ',
-       'ⲩ' => 'Ⲩ',
-       'ⲫ' => 'Ⲫ',
-       'ⲭ' => 'Ⲭ',
-       'ⲯ' => 'Ⲯ',
-       'ⲱ' => 'Ⲱ',
-       'ⲳ' => 'Ⲳ',
-       'ⲵ' => 'Ⲵ',
-       'ⲷ' => 'Ⲷ',
-       'ⲹ' => 'Ⲹ',
-       'ⲻ' => 'Ⲻ',
-       'ⲽ' => 'Ⲽ',
-       'ⲿ' => 'Ⲿ',
-       'ⳁ' => 'Ⳁ',
-       'ⳃ' => 'Ⳃ',
-       'ⳅ' => 'Ⳅ',
-       'ⳇ' => 'Ⳇ',
-       'ⳉ' => 'Ⳉ',
-       'ⳋ' => 'Ⳋ',
-       'ⳍ' => 'Ⳍ',
-       'ⳏ' => 'Ⳏ',
-       'ⳑ' => 'Ⳑ',
-       'ⳓ' => 'Ⳓ',
-       'ⳕ' => 'Ⳕ',
-       'ⳗ' => 'Ⳗ',
-       'ⳙ' => 'Ⳙ',
-       'ⳛ' => 'Ⳛ',
-       'ⳝ' => 'Ⳝ',
-       'ⳟ' => 'Ⳟ',
-       'ⳡ' => 'Ⳡ',
-       'ⳣ' => 'Ⳣ',
-       'ⳬ' => 'Ⳬ',
-       'ⳮ' => 'Ⳮ',
-       'ⴀ' => 'Ⴀ',
-       'ⴁ' => 'Ⴁ',
-       'ⴂ' => 'Ⴂ',
-       'ⴃ' => 'Ⴃ',
-       'ⴄ' => 'Ⴄ',
-       'ⴅ' => 'Ⴅ',
-       'ⴆ' => 'Ⴆ',
-       'ⴇ' => 'Ⴇ',
-       'ⴈ' => 'Ⴈ',
-       'ⴉ' => 'Ⴉ',
-       'ⴊ' => 'Ⴊ',
-       'ⴋ' => 'Ⴋ',
-       'ⴌ' => 'Ⴌ',
-       'ⴍ' => 'Ⴍ',
-       'ⴎ' => 'Ⴎ',
-       'ⴏ' => 'Ⴏ',
-       'ⴐ' => 'Ⴐ',
-       'ⴑ' => 'Ⴑ',
-       'ⴒ' => 'Ⴒ',
-       'ⴓ' => 'Ⴓ',
-       'ⴔ' => 'Ⴔ',
-       'ⴕ' => 'Ⴕ',
-       'ⴖ' => 'Ⴖ',
-       'ⴗ' => 'Ⴗ',
-       'ⴘ' => 'Ⴘ',
-       'ⴙ' => 'Ⴙ',
-       'ⴚ' => 'Ⴚ',
-       'ⴛ' => 'Ⴛ',
-       'ⴜ' => 'Ⴜ',
-       'ⴝ' => 'Ⴝ',
-       'ⴞ' => 'Ⴞ',
-       'ⴟ' => 'Ⴟ',
-       'ⴠ' => 'Ⴠ',
-       'ⴡ' => 'Ⴡ',
-       'ⴢ' => 'Ⴢ',
-       'ⴣ' => 'Ⴣ',
-       'ⴤ' => 'Ⴤ',
-       'ⴥ' => 'Ⴥ',
-       'ꙁ' => 'Ꙁ',
-       'ꙃ' => 'Ꙃ',
-       'ꙅ' => 'Ꙅ',
-       'ꙇ' => 'Ꙇ',
-       'ꙉ' => 'Ꙉ',
-       'ꙋ' => 'Ꙋ',
-       'ꙍ' => 'Ꙍ',
-       'ꙏ' => 'Ꙏ',
-       'ꙑ' => 'Ꙑ',
-       'ꙓ' => 'Ꙓ',
-       'ꙕ' => 'Ꙕ',
-       'ꙗ' => 'Ꙗ',
-       'ꙙ' => 'Ꙙ',
-       'ꙛ' => 'Ꙛ',
-       'ꙝ' => 'Ꙝ',
-       'ꙟ' => 'Ꙟ',
-       'ꙡ' => 'Ꙡ',
-       'ꙣ' => 'Ꙣ',
-       'ꙥ' => 'Ꙥ',
-       'ꙧ' => 'Ꙧ',
-       'ꙩ' => 'Ꙩ',
-       'ꙫ' => 'Ꙫ',
-       'ꙭ' => 'Ꙭ',
-       'ꚁ' => 'Ꚁ',
-       'ꚃ' => 'Ꚃ',
-       'ꚅ' => 'Ꚅ',
-       'ꚇ' => 'Ꚇ',
-       'ꚉ' => 'Ꚉ',
-       'ꚋ' => 'Ꚋ',
-       'ꚍ' => 'Ꚍ',
-       'ꚏ' => 'Ꚏ',
-       'ꚑ' => 'Ꚑ',
-       'ꚓ' => 'Ꚓ',
-       'ꚕ' => 'Ꚕ',
-       'ꚗ' => 'Ꚗ',
-       'ꜣ' => 'Ꜣ',
-       'ꜥ' => 'Ꜥ',
-       'ꜧ' => 'Ꜧ',
-       'ꜩ' => 'Ꜩ',
-       'ꜫ' => 'Ꜫ',
-       'ꜭ' => 'Ꜭ',
-       'ꜯ' => 'Ꜯ',
-       'ꜳ' => 'Ꜳ',
-       'ꜵ' => 'Ꜵ',
-       'ꜷ' => 'Ꜷ',
-       'ꜹ' => 'Ꜹ',
-       'ꜻ' => 'Ꜻ',
-       'ꜽ' => 'Ꜽ',
-       'ꜿ' => 'Ꜿ',
-       'ꝁ' => 'Ꝁ',
-       'ꝃ' => 'Ꝃ',
-       'ꝅ' => 'Ꝅ',
-       'ꝇ' => 'Ꝇ',
-       'ꝉ' => 'Ꝉ',
-       'ꝋ' => 'Ꝋ',
-       'ꝍ' => 'Ꝍ',
-       'ꝏ' => 'Ꝏ',
-       'ꝑ' => 'Ꝑ',
-       'ꝓ' => 'Ꝓ',
-       'ꝕ' => 'Ꝕ',
-       'ꝗ' => 'Ꝗ',
-       'ꝙ' => 'Ꝙ',
-       'ꝛ' => 'Ꝛ',
-       'ꝝ' => 'Ꝝ',
-       'ꝟ' => 'Ꝟ',
-       'ꝡ' => 'Ꝡ',
-       'ꝣ' => 'Ꝣ',
-       'ꝥ' => 'Ꝥ',
-       'ꝧ' => 'Ꝧ',
-       'ꝩ' => 'Ꝩ',
-       'ꝫ' => 'Ꝫ',
-       'ꝭ' => 'Ꝭ',
-       'ꝯ' => 'Ꝯ',
-       'ꝺ' => 'Ꝺ',
-       'ꝼ' => 'Ꝼ',
-       'ꝿ' => 'Ꝿ',
-       'ꞁ' => 'Ꞁ',
-       'ꞃ' => 'Ꞃ',
-       'ꞅ' => 'Ꞅ',
-       'ꞇ' => 'Ꞇ',
-       'ꞌ' => 'Ꞌ',
-       'ꞑ' => 'Ꞑ',
-       'ꞡ' => 'Ꞡ',
-       'ꞣ' => 'Ꞣ',
-       'ꞥ' => 'Ꞥ',
-       'ꞧ' => 'Ꞧ',
-       'ꞩ' => 'Ꞩ',
-       'a' => 'A',
-       'b' => 'B',
-       'c' => 'C',
-       'd' => 'D',
-       'e' => 'E',
-       'f' => 'F',
-       'g' => 'G',
-       'h' => 'H',
-       'i' => 'I',
-       'j' => 'J',
-       'k' => 'K',
-       'l' => 'L',
-       'm' => 'M',
-       'n' => 'N',
-       'o' => 'O',
-       'p' => 'P',
-       'q' => 'Q',
-       'r' => 'R',
-       's' => 'S',
-       't' => 'T',
-       'u' => 'U',
-       'v' => 'V',
-       'w' => 'W',
-       'x' => 'X',
-       'y' => 'Y',
-       'z' => 'Z',
-       '𐐨' => '𐐀',
-       '𐐩' => '𐐁',
-       '𐐪' => '𐐂',
-       '𐐫' => '𐐃',
-       '𐐬' => '𐐄',
-       '𐐭' => '𐐅',
-       '𐐮' => '𐐆',
-       '𐐯' => '𐐇',
-       '𐐰' => '𐐈',
-       '𐐱' => '𐐉',
-       '𐐲' => '𐐊',
-       '𐐳' => '𐐋',
-       '𐐴' => '𐐌',
-       '𐐵' => '𐐍',
-       '𐐶' => '𐐎',
-       '𐐷' => '𐐏',
-       '𐐸' => '𐐐',
-       '𐐹' => '𐐑',
-       '𐐺' => '𐐒',
-       '𐐻' => '𐐓',
-       '𐐼' => '𐐔',
-       '𐐽' => '𐐕',
-       '𐐾' => '𐐖',
-       '𐐿' => '𐐗',
-       '𐑀' => '𐐘',
-       '𐑁' => '𐐙',
-       '𐑂' => '𐐚',
-       '𐑃' => '𐐛',
-       '𐑄' => '𐐜',
-       '𐑅' => '𐐝',
-       '𐑆' => '𐐞',
-       '𐑇' => '𐐟',
-       '𐑈' => '𐐠',
-       '𐑉' => '𐐡',
-       '𐑊' => '𐐢',
-       '𐑋' => '𐐣',
-       '𐑌' => '𐐤',
-       '𐑍' => '𐐥',
-       '𐑎' => '𐐦',
-       '𐑏' => '𐐧'
-);
-
-/**
- * Translation array to get lower case character
- */
-$wikiLowerChars = array(
-       'A' => 'a',
-       'B' => 'b',
-       'C' => 'c',
-       'D' => 'd',
-       'E' => 'e',
-       'F' => 'f',
-       'G' => 'g',
-       'H' => 'h',
-       'I' => 'i',
-       'J' => 'j',
-       'K' => 'k',
-       'L' => 'l',
-       'M' => 'm',
-       'N' => 'n',
-       'O' => 'o',
-       'P' => 'p',
-       'Q' => 'q',
-       'R' => 'r',
-       'S' => 's',
-       'T' => 't',
-       'U' => 'u',
-       'V' => 'v',
-       'W' => 'w',
-       'X' => 'x',
-       'Y' => 'y',
-       'Z' => 'z',
-       'À' => 'à',
-       'Á' => 'á',
-       'Â' => 'â',
-       'Ã' => 'ã',
-       'Ä' => 'ä',
-       'Å' => 'å',
-       'Æ' => 'æ',
-       'Ç' => 'ç',
-       'È' => 'è',
-       'É' => 'é',
-       'Ê' => 'ê',
-       'Ë' => 'ë',
-       'Ì' => 'ì',
-       'Í' => 'í',
-       'Î' => 'î',
-       'Ï' => 'ï',
-       'Ð' => 'ð',
-       'Ñ' => 'ñ',
-       'Ò' => 'ò',
-       'Ó' => 'ó',
-       'Ô' => 'ô',
-       'Õ' => 'õ',
-       'Ö' => 'ö',
-       'Ø' => 'ø',
-       'Ù' => 'ù',
-       'Ú' => 'ú',
-       'Û' => 'û',
-       'Ü' => 'ü',
-       'Ý' => 'ý',
-       'Þ' => 'þ',
-       'Ā' => 'ā',
-       'Ă' => 'ă',
-       'Ą' => 'ą',
-       'Ć' => 'ć',
-       'Ĉ' => 'ĉ',
-       'Ċ' => 'ċ',
-       'Č' => 'č',
-       'Ď' => 'ď',
-       'Đ' => 'đ',
-       'Ē' => 'ē',
-       'Ĕ' => 'ĕ',
-       'Ė' => 'ė',
-       'Ę' => 'ę',
-       'Ě' => 'ě',
-       'Ĝ' => 'ĝ',
-       'Ğ' => 'ğ',
-       'Ġ' => 'ġ',
-       'Ģ' => 'ģ',
-       'Ĥ' => 'ĥ',
-       'Ħ' => 'ħ',
-       'Ĩ' => 'ĩ',
-       'Ī' => 'ī',
-       'Ĭ' => 'ĭ',
-       'Į' => 'į',
-       'İ' => 'i',
-       'IJ' => 'ij',
-       'Ĵ' => 'ĵ',
-       'Ķ' => 'ķ',
-       'Ĺ' => 'ĺ',
-       'Ļ' => 'ļ',
-       'Ľ' => 'ľ',
-       'Ŀ' => 'ŀ',
-       'Ł' => 'ł',
-       'Ń' => 'ń',
-       'Ņ' => 'ņ',
-       'Ň' => 'ň',
-       'Ŋ' => 'ŋ',
-       'Ō' => 'ō',
-       'Ŏ' => 'ŏ',
-       'Ő' => 'ő',
-       'Œ' => 'œ',
-       'Ŕ' => 'ŕ',
-       'Ŗ' => 'ŗ',
-       'Ř' => 'ř',
-       'Ś' => 'ś',
-       'Ŝ' => 'ŝ',
-       'Ş' => 'ş',
-       'Š' => 'š',
-       'Ţ' => 'ţ',
-       'Ť' => 'ť',
-       'Ŧ' => 'ŧ',
-       'Ũ' => 'ũ',
-       'Ū' => 'ū',
-       'Ŭ' => 'ŭ',
-       'Ů' => 'ů',
-       'Ű' => 'ű',
-       'Ų' => 'ų',
-       'Ŵ' => 'ŵ',
-       'Ŷ' => 'ŷ',
-       'Ÿ' => 'ÿ',
-       'Ź' => 'ź',
-       'Ż' => 'ż',
-       'Ž' => 'ž',
-       'Ɓ' => 'ɓ',
-       'Ƃ' => 'ƃ',
-       'Ƅ' => 'ƅ',
-       'Ɔ' => 'ɔ',
-       'Ƈ' => 'ƈ',
-       'Ɖ' => 'ɖ',
-       'Ɗ' => 'ɗ',
-       'Ƌ' => 'ƌ',
-       'Ǝ' => 'ǝ',
-       'Ə' => 'ə',
-       'Ɛ' => 'ɛ',
-       'Ƒ' => 'ƒ',
-       'Ɠ' => 'ɠ',
-       'Ɣ' => 'ɣ',
-       'Ɩ' => 'ɩ',
-       'Ɨ' => 'ɨ',
-       'Ƙ' => 'ƙ',
-       'Ɯ' => 'ɯ',
-       'Ɲ' => 'ɲ',
-       'Ɵ' => 'ɵ',
-       'Ơ' => 'ơ',
-       'Ƣ' => 'ƣ',
-       'Ƥ' => 'ƥ',
-       'Ʀ' => 'ʀ',
-       'Ƨ' => 'ƨ',
-       'Ʃ' => 'ʃ',
-       'Ƭ' => 'ƭ',
-       'Ʈ' => 'ʈ',
-       'Ư' => 'ư',
-       'Ʊ' => 'ʊ',
-       'Ʋ' => 'ʋ',
-       'Ƴ' => 'ƴ',
-       'Ƶ' => 'ƶ',
-       'Ʒ' => 'ʒ',
-       'Ƹ' => 'ƹ',
-       'Ƽ' => 'ƽ',
-       'DŽ' => 'dž',
-       'Dž' => 'dž',
-       'LJ' => 'lj',
-       'Lj' => 'lj',
-       'NJ' => 'nj',
-       'Nj' => 'nj',
-       'Ǎ' => 'ǎ',
-       'Ǐ' => 'ǐ',
-       'Ǒ' => 'ǒ',
-       'Ǔ' => 'ǔ',
-       'Ǖ' => 'ǖ',
-       'Ǘ' => 'ǘ',
-       'Ǚ' => 'ǚ',
-       'Ǜ' => 'ǜ',
-       'Ǟ' => 'ǟ',
-       'Ǡ' => 'ǡ',
-       'Ǣ' => 'ǣ',
-       'Ǥ' => 'ǥ',
-       'Ǧ' => 'ǧ',
-       'Ǩ' => 'ǩ',
-       'Ǫ' => 'ǫ',
-       'Ǭ' => 'ǭ',
-       'Ǯ' => 'ǯ',
-       'DZ' => 'dz',
-       'Dz' => 'dz',
-       'Ǵ' => 'ǵ',
-       'Ƕ' => 'ƕ',
-       'Ƿ' => 'ƿ',
-       'Ǹ' => 'ǹ',
-       'Ǻ' => 'ǻ',
-       'Ǽ' => 'ǽ',
-       'Ǿ' => 'ǿ',
-       'Ȁ' => 'ȁ',
-       'Ȃ' => 'ȃ',
-       'Ȅ' => 'ȅ',
-       'Ȇ' => 'ȇ',
-       'Ȉ' => 'ȉ',
-       'Ȋ' => 'ȋ',
-       'Ȍ' => 'ȍ',
-       'Ȏ' => 'ȏ',
-       'Ȑ' => 'ȑ',
-       'Ȓ' => 'ȓ',
-       'Ȕ' => 'ȕ',
-       'Ȗ' => 'ȗ',
-       'Ș' => 'ș',
-       'Ț' => 'ț',
-       'Ȝ' => 'ȝ',
-       'Ȟ' => 'ȟ',
-       'Ƞ' => 'ƞ',
-       'Ȣ' => 'ȣ',
-       'Ȥ' => 'ȥ',
-       'Ȧ' => 'ȧ',
-       'Ȩ' => 'ȩ',
-       'Ȫ' => 'ȫ',
-       'Ȭ' => 'ȭ',
-       'Ȯ' => 'ȯ',
-       'Ȱ' => 'ȱ',
-       'Ȳ' => 'ȳ',
-       'Ⱥ' => 'ⱥ',
-       'Ȼ' => 'ȼ',
-       'Ƚ' => 'ƚ',
-       'Ⱦ' => 'ⱦ',
-       'Ɂ' => 'ɂ',
-       'Ƀ' => 'ƀ',
-       'Ʉ' => 'ʉ',
-       'Ʌ' => 'ʌ',
-       'Ɇ' => 'ɇ',
-       'Ɉ' => 'ɉ',
-       'Ɋ' => 'ɋ',
-       'Ɍ' => 'ɍ',
-       'Ɏ' => 'ɏ',
-       'Ͱ' => 'ͱ',
-       'Ͳ' => 'ͳ',
-       'Ͷ' => 'ͷ',
-       'Ά' => 'ά',
-       'Έ' => 'έ',
-       'Ή' => 'ή',
-       'Ί' => 'ί',
-       'Ό' => 'ό',
-       'Ύ' => 'ύ',
-       'Ώ' => 'ώ',
-       'Α' => 'α',
-       'Β' => 'β',
-       'Γ' => 'γ',
-       'Δ' => 'δ',
-       'Ε' => 'ε',
-       'Ζ' => 'ζ',
-       'Η' => 'η',
-       'Θ' => 'θ',
-       'Ι' => 'ι',
-       'Κ' => 'κ',
-       'Λ' => 'λ',
-       'Μ' => 'μ',
-       'Ν' => 'ν',
-       'Ξ' => 'ξ',
-       'Ο' => 'ο',
-       'Π' => 'π',
-       'Ρ' => 'ρ',
-       'Σ' => 'σ',
-       'Τ' => 'τ',
-       'Υ' => 'υ',
-       'Φ' => 'φ',
-       'Χ' => 'χ',
-       'Ψ' => 'ψ',
-       'Ω' => 'ω',
-       'Ϊ' => 'ϊ',
-       'Ϋ' => 'ϋ',
-       'Ϗ' => 'ϗ',
-       'Ϙ' => 'ϙ',
-       'Ϛ' => 'ϛ',
-       'Ϝ' => 'ϝ',
-       'Ϟ' => 'ϟ',
-       'Ϡ' => 'ϡ',
-       'Ϣ' => 'ϣ',
-       'Ϥ' => 'ϥ',
-       'Ϧ' => 'ϧ',
-       'Ϩ' => 'ϩ',
-       'Ϫ' => 'ϫ',
-       'Ϭ' => 'ϭ',
-       'Ϯ' => 'ϯ',
-       'ϴ' => 'θ',
-       'Ϸ' => 'ϸ',
-       'Ϲ' => 'ϲ',
-       'Ϻ' => 'ϻ',
-       'Ͻ' => 'ͻ',
-       'Ͼ' => 'ͼ',
-       'Ͽ' => 'ͽ',
-       'Ѐ' => 'ѐ',
-       'Ё' => 'ё',
-       'Ђ' => 'ђ',
-       'Ѓ' => 'ѓ',
-       'Є' => 'є',
-       'Ѕ' => 'ѕ',
-       'І' => 'і',
-       'Ї' => 'ї',
-       'Ј' => 'ј',
-       'Љ' => 'љ',
-       'Њ' => 'њ',
-       'Ћ' => 'ћ',
-       'Ќ' => 'ќ',
-       'Ѝ' => 'ѝ',
-       'Ў' => 'ў',
-       'Џ' => 'џ',
-       'А' => 'а',
-       'Б' => 'б',
-       'В' => 'в',
-       'Г' => 'г',
-       'Д' => 'д',
-       'Е' => 'е',
-       'Ж' => 'ж',
-       'З' => 'з',
-       'И' => 'и',
-       'Й' => 'й',
-       'К' => 'к',
-       'Л' => 'л',
-       'М' => 'м',
-       'Н' => 'н',
-       'О' => 'о',
-       'П' => 'п',
-       'Р' => 'р',
-       'С' => 'с',
-       'Т' => 'т',
-       'У' => 'у',
-       'Ф' => 'ф',
-       'Х' => 'х',
-       'Ц' => 'ц',
-       'Ч' => 'ч',
-       'Ш' => 'ш',
-       'Щ' => 'щ',
-       'Ъ' => 'ъ',
-       'Ы' => 'ы',
-       'Ь' => 'ь',
-       'Э' => 'э',
-       'Ю' => 'ю',
-       'Я' => 'я',
-       'Ѡ' => 'ѡ',
-       'Ѣ' => 'ѣ',
-       'Ѥ' => 'ѥ',
-       'Ѧ' => 'ѧ',
-       'Ѩ' => 'ѩ',
-       'Ѫ' => 'ѫ',
-       'Ѭ' => 'ѭ',
-       'Ѯ' => 'ѯ',
-       'Ѱ' => 'ѱ',
-       'Ѳ' => 'ѳ',
-       'Ѵ' => 'ѵ',
-       'Ѷ' => 'ѷ',
-       'Ѹ' => 'ѹ',
-       'Ѻ' => 'ѻ',
-       'Ѽ' => 'ѽ',
-       'Ѿ' => 'ѿ',
-       'Ҁ' => 'ҁ',
-       'Ҋ' => 'ҋ',
-       'Ҍ' => 'ҍ',
-       'Ҏ' => 'ҏ',
-       'Ґ' => 'ґ',
-       'Ғ' => 'ғ',
-       'Ҕ' => 'ҕ',
-       'Җ' => 'җ',
-       'Ҙ' => 'ҙ',
-       'Қ' => 'қ',
-       'Ҝ' => 'ҝ',
-       'Ҟ' => 'ҟ',
-       'Ҡ' => 'ҡ',
-       'Ң' => 'ң',
-       'Ҥ' => 'ҥ',
-       'Ҧ' => 'ҧ',
-       'Ҩ' => 'ҩ',
-       'Ҫ' => 'ҫ',
-       'Ҭ' => 'ҭ',
-       'Ү' => 'ү',
-       'Ұ' => 'ұ',
-       'Ҳ' => 'ҳ',
-       'Ҵ' => 'ҵ',
-       'Ҷ' => 'ҷ',
-       'Ҹ' => 'ҹ',
-       'Һ' => 'һ',
-       'Ҽ' => 'ҽ',
-       'Ҿ' => 'ҿ',
-       'Ӏ' => 'ӏ',
-       'Ӂ' => 'ӂ',
-       'Ӄ' => 'ӄ',
-       'Ӆ' => 'ӆ',
-       'Ӈ' => 'ӈ',
-       'Ӊ' => 'ӊ',
-       'Ӌ' => 'ӌ',
-       'Ӎ' => 'ӎ',
-       'Ӑ' => 'ӑ',
-       'Ӓ' => 'ӓ',
-       'Ӕ' => 'ӕ',
-       'Ӗ' => 'ӗ',
-       'Ә' => 'ә',
-       'Ӛ' => 'ӛ',
-       'Ӝ' => 'ӝ',
-       'Ӟ' => 'ӟ',
-       'Ӡ' => 'ӡ',
-       'Ӣ' => 'ӣ',
-       'Ӥ' => 'ӥ',
-       'Ӧ' => 'ӧ',
-       'Ө' => 'ө',
-       'Ӫ' => 'ӫ',
-       'Ӭ' => 'ӭ',
-       'Ӯ' => 'ӯ',
-       'Ӱ' => 'ӱ',
-       'Ӳ' => 'ӳ',
-       'Ӵ' => 'ӵ',
-       'Ӷ' => 'ӷ',
-       'Ӹ' => 'ӹ',
-       'Ӻ' => 'ӻ',
-       'Ӽ' => 'ӽ',
-       'Ӿ' => 'ӿ',
-       'Ԁ' => 'ԁ',
-       'Ԃ' => 'ԃ',
-       'Ԅ' => 'ԅ',
-       'Ԇ' => 'ԇ',
-       'Ԉ' => 'ԉ',
-       'Ԋ' => 'ԋ',
-       'Ԍ' => 'ԍ',
-       'Ԏ' => 'ԏ',
-       'Ԑ' => 'ԑ',
-       'Ԓ' => 'ԓ',
-       'Ԕ' => 'ԕ',
-       'Ԗ' => 'ԗ',
-       'Ԙ' => 'ԙ',
-       'Ԛ' => 'ԛ',
-       'Ԝ' => 'ԝ',
-       'Ԟ' => 'ԟ',
-       'Ԡ' => 'ԡ',
-       'Ԣ' => 'ԣ',
-       'Ԥ' => 'ԥ',
-       'Ԧ' => 'ԧ',
-       'Ա' => 'ա',
-       'Բ' => 'բ',
-       'Գ' => 'գ',
-       'Դ' => 'դ',
-       'Ե' => 'ե',
-       'Զ' => 'զ',
-       'Է' => 'է',
-       'Ը' => 'ը',
-       'Թ' => 'թ',
-       'Ժ' => 'ժ',
-       'Ի' => 'ի',
-       'Լ' => 'լ',
-       'Խ' => 'խ',
-       'Ծ' => 'ծ',
-       'Կ' => 'կ',
-       'Հ' => 'հ',
-       'Ձ' => 'ձ',
-       'Ղ' => 'ղ',
-       'Ճ' => 'ճ',
-       'Մ' => 'մ',
-       'Յ' => 'յ',
-       'Ն' => 'ն',
-       'Շ' => 'շ',
-       'Ո' => 'ո',
-       'Չ' => 'չ',
-       'Պ' => 'պ',
-       'Ջ' => 'ջ',
-       'Ռ' => 'ռ',
-       'Ս' => 'ս',
-       'Վ' => 'վ',
-       'Տ' => 'տ',
-       'Ր' => 'ր',
-       'Ց' => 'ց',
-       'Ւ' => 'ւ',
-       'Փ' => 'փ',
-       'Ք' => 'ք',
-       'Օ' => 'օ',
-       'Ֆ' => 'ֆ',
-       'Ⴀ' => 'ⴀ',
-       'Ⴁ' => 'ⴁ',
-       'Ⴂ' => 'ⴂ',
-       'Ⴃ' => 'ⴃ',
-       'Ⴄ' => 'ⴄ',
-       'Ⴅ' => 'ⴅ',
-       'Ⴆ' => 'ⴆ',
-       'Ⴇ' => 'ⴇ',
-       'Ⴈ' => 'ⴈ',
-       'Ⴉ' => 'ⴉ',
-       'Ⴊ' => 'ⴊ',
-       'Ⴋ' => 'ⴋ',
-       'Ⴌ' => 'ⴌ',
-       'Ⴍ' => 'ⴍ',
-       'Ⴎ' => 'ⴎ',
-       'Ⴏ' => 'ⴏ',
-       'Ⴐ' => 'ⴐ',
-       'Ⴑ' => 'ⴑ',
-       'Ⴒ' => 'ⴒ',
-       'Ⴓ' => 'ⴓ',
-       'Ⴔ' => 'ⴔ',
-       'Ⴕ' => 'ⴕ',
-       'Ⴖ' => 'ⴖ',
-       'Ⴗ' => 'ⴗ',
-       'Ⴘ' => 'ⴘ',
-       'Ⴙ' => 'ⴙ',
-       'Ⴚ' => 'ⴚ',
-       'Ⴛ' => 'ⴛ',
-       'Ⴜ' => 'ⴜ',
-       'Ⴝ' => 'ⴝ',
-       'Ⴞ' => 'ⴞ',
-       'Ⴟ' => 'ⴟ',
-       'Ⴠ' => 'ⴠ',
-       'Ⴡ' => 'ⴡ',
-       'Ⴢ' => 'ⴢ',
-       'Ⴣ' => 'ⴣ',
-       'Ⴤ' => 'ⴤ',
-       'Ⴥ' => 'ⴥ',
-       'Ḁ' => 'ḁ',
-       'Ḃ' => 'ḃ',
-       'Ḅ' => 'ḅ',
-       'Ḇ' => 'ḇ',
-       'Ḉ' => 'ḉ',
-       'Ḋ' => 'ḋ',
-       'Ḍ' => 'ḍ',
-       'Ḏ' => 'ḏ',
-       'Ḑ' => 'ḑ',
-       'Ḓ' => 'ḓ',
-       'Ḕ' => 'ḕ',
-       'Ḗ' => 'ḗ',
-       'Ḙ' => 'ḙ',
-       'Ḛ' => 'ḛ',
-       'Ḝ' => 'ḝ',
-       'Ḟ' => 'ḟ',
-       'Ḡ' => 'ḡ',
-       'Ḣ' => 'ḣ',
-       'Ḥ' => 'ḥ',
-       'Ḧ' => 'ḧ',
-       'Ḩ' => 'ḩ',
-       'Ḫ' => 'ḫ',
-       'Ḭ' => 'ḭ',
-       'Ḯ' => 'ḯ',
-       'Ḱ' => 'ḱ',
-       'Ḳ' => 'ḳ',
-       'Ḵ' => 'ḵ',
-       'Ḷ' => 'ḷ',
-       'Ḹ' => 'ḹ',
-       'Ḻ' => 'ḻ',
-       'Ḽ' => 'ḽ',
-       'Ḿ' => 'ḿ',
-       'Ṁ' => 'ṁ',
-       'Ṃ' => 'ṃ',
-       'Ṅ' => 'ṅ',
-       'Ṇ' => 'ṇ',
-       'Ṉ' => 'ṉ',
-       'Ṋ' => 'ṋ',
-       'Ṍ' => 'ṍ',
-       'Ṏ' => 'ṏ',
-       'Ṑ' => 'ṑ',
-       'Ṓ' => 'ṓ',
-       'Ṕ' => 'ṕ',
-       'Ṗ' => 'ṗ',
-       'Ṙ' => 'ṙ',
-       'Ṛ' => 'ṛ',
-       'Ṝ' => 'ṝ',
-       'Ṟ' => 'ṟ',
-       'Ṡ' => 'ṡ',
-       'Ṣ' => 'ṣ',
-       'Ṥ' => 'ṥ',
-       'Ṧ' => 'ṧ',
-       'Ṩ' => 'ṩ',
-       'Ṫ' => 'ṫ',
-       'Ṭ' => 'ṭ',
-       'Ṯ' => 'ṯ',
-       'Ṱ' => 'ṱ',
-       'Ṳ' => 'ṳ',
-       'Ṵ' => 'ṵ',
-       'Ṷ' => 'ṷ',
-       'Ṹ' => 'ṹ',
-       'Ṻ' => 'ṻ',
-       'Ṽ' => 'ṽ',
-       'Ṿ' => 'ṿ',
-       'Ẁ' => 'ẁ',
-       'Ẃ' => 'ẃ',
-       'Ẅ' => 'ẅ',
-       'Ẇ' => 'ẇ',
-       'Ẉ' => 'ẉ',
-       'Ẋ' => 'ẋ',
-       'Ẍ' => 'ẍ',
-       'Ẏ' => 'ẏ',
-       'Ẑ' => 'ẑ',
-       'Ẓ' => 'ẓ',
-       'Ẕ' => 'ẕ',
-       'ẞ' => 'ß',
-       'Ạ' => 'ạ',
-       'Ả' => 'ả',
-       'Ấ' => 'ấ',
-       'Ầ' => 'ầ',
-       'Ẩ' => 'ẩ',
-       'Ẫ' => 'ẫ',
-       'Ậ' => 'ậ',
-       'Ắ' => 'ắ',
-       'Ằ' => 'ằ',
-       'Ẳ' => 'ẳ',
-       'Ẵ' => 'ẵ',
-       'Ặ' => 'ặ',
-       'Ẹ' => 'ẹ',
-       'Ẻ' => 'ẻ',
-       'Ẽ' => 'ẽ',
-       'Ế' => 'ế',
-       'Ề' => 'ề',
-       'Ể' => 'ể',
-       'Ễ' => 'ễ',
-       'Ệ' => 'ệ',
-       'Ỉ' => 'ỉ',
-       'Ị' => 'ị',
-       'Ọ' => 'ọ',
-       'Ỏ' => 'ỏ',
-       'Ố' => 'ố',
-       'Ồ' => 'ồ',
-       'Ổ' => 'ổ',
-       'Ỗ' => 'ỗ',
-       'Ộ' => 'ộ',
-       'Ớ' => 'ớ',
-       'Ờ' => 'ờ',
-       'Ở' => 'ở',
-       'Ỡ' => 'ỡ',
-       'Ợ' => 'ợ',
-       'Ụ' => 'ụ',
-       'Ủ' => 'ủ',
-       'Ứ' => 'ứ',
-       'Ừ' => 'ừ',
-       'Ử' => 'ử',
-       'Ữ' => 'ữ',
-       'Ự' => 'ự',
-       'Ỳ' => 'ỳ',
-       'Ỵ' => 'ỵ',
-       'Ỷ' => 'ỷ',
-       'Ỹ' => 'ỹ',
-       'Ỻ' => 'ỻ',
-       'Ỽ' => 'ỽ',
-       'Ỿ' => 'ỿ',
-       'Ἀ' => 'ἀ',
-       'Ἁ' => 'ἁ',
-       'Ἂ' => 'ἂ',
-       'Ἃ' => 'ἃ',
-       'Ἄ' => 'ἄ',
-       'Ἅ' => 'ἅ',
-       'Ἆ' => 'ἆ',
-       'Ἇ' => 'ἇ',
-       'Ἐ' => 'ἐ',
-       'Ἑ' => 'ἑ',
-       'Ἒ' => 'ἒ',
-       'Ἓ' => 'ἓ',
-       'Ἔ' => 'ἔ',
-       'Ἕ' => 'ἕ',
-       'Ἠ' => 'ἠ',
-       'Ἡ' => 'ἡ',
-       'Ἢ' => 'ἢ',
-       'Ἣ' => 'ἣ',
-       'Ἤ' => 'ἤ',
-       'Ἥ' => 'ἥ',
-       'Ἦ' => 'ἦ',
-       'Ἧ' => 'ἧ',
-       'Ἰ' => 'ἰ',
-       'Ἱ' => 'ἱ',
-       'Ἲ' => 'ἲ',
-       'Ἳ' => 'ἳ',
-       'Ἴ' => 'ἴ',
-       'Ἵ' => 'ἵ',
-       'Ἶ' => 'ἶ',
-       'Ἷ' => 'ἷ',
-       'Ὀ' => 'ὀ',
-       'Ὁ' => 'ὁ',
-       'Ὂ' => 'ὂ',
-       'Ὃ' => 'ὃ',
-       'Ὄ' => 'ὄ',
-       'Ὅ' => 'ὅ',
-       'Ὑ' => 'ὑ',
-       'Ὓ' => 'ὓ',
-       'Ὕ' => 'ὕ',
-       'Ὗ' => 'ὗ',
-       'Ὠ' => 'ὠ',
-       'Ὡ' => 'ὡ',
-       'Ὢ' => 'ὢ',
-       'Ὣ' => 'ὣ',
-       'Ὤ' => 'ὤ',
-       'Ὥ' => 'ὥ',
-       'Ὦ' => 'ὦ',
-       'Ὧ' => 'ὧ',
-       'ᾈ' => 'ᾀ',
-       'ᾉ' => 'ᾁ',
-       'ᾊ' => 'ᾂ',
-       'ᾋ' => 'ᾃ',
-       'ᾌ' => 'ᾄ',
-       'ᾍ' => 'ᾅ',
-       'ᾎ' => 'ᾆ',
-       'ᾏ' => 'ᾇ',
-       'ᾘ' => 'ᾐ',
-       'ᾙ' => 'ᾑ',
-       'ᾚ' => 'ᾒ',
-       'ᾛ' => 'ᾓ',
-       'ᾜ' => 'ᾔ',
-       'ᾝ' => 'ᾕ',
-       'ᾞ' => 'ᾖ',
-       'ᾟ' => 'ᾗ',
-       'ᾨ' => 'ᾠ',
-       'ᾩ' => 'ᾡ',
-       'ᾪ' => 'ᾢ',
-       'ᾫ' => 'ᾣ',
-       'ᾬ' => 'ᾤ',
-       'ᾭ' => 'ᾥ',
-       'ᾮ' => 'ᾦ',
-       'ᾯ' => 'ᾧ',
-       'Ᾰ' => 'ᾰ',
-       'Ᾱ' => 'ᾱ',
-       'Ὰ' => 'ὰ',
-       'Ά' => 'ά',
-       'ᾼ' => 'ᾳ',
-       'Ὲ' => 'ὲ',
-       'Έ' => 'έ',
-       'Ὴ' => 'ὴ',
-       'Ή' => 'ή',
-       'ῌ' => 'ῃ',
-       'Ῐ' => 'ῐ',
-       'Ῑ' => 'ῑ',
-       'Ὶ' => 'ὶ',
-       'Ί' => 'ί',
-       'Ῠ' => 'ῠ',
-       'Ῡ' => 'ῡ',
-       'Ὺ' => 'ὺ',
-       'Ύ' => 'ύ',
-       'Ῥ' => 'ῥ',
-       'Ὸ' => 'ὸ',
-       'Ό' => 'ό',
-       'Ὼ' => 'ὼ',
-       'Ώ' => 'ώ',
-       'ῼ' => 'ῳ',
-       'Ω' => 'ω',
-       'K' => 'k',
-       'Å' => 'å',
-       'Ⅎ' => 'ⅎ',
-       'Ⅰ' => 'ⅰ',
-       'Ⅱ' => 'ⅱ',
-       'Ⅲ' => 'ⅲ',
-       'Ⅳ' => 'ⅳ',
-       'Ⅴ' => 'ⅴ',
-       'Ⅵ' => 'ⅵ',
-       'Ⅶ' => 'ⅶ',
-       'Ⅷ' => 'ⅷ',
-       'Ⅸ' => 'ⅸ',
-       'Ⅹ' => 'ⅹ',
-       'Ⅺ' => 'ⅺ',
-       'Ⅻ' => 'ⅻ',
-       'Ⅼ' => 'ⅼ',
-       'Ⅽ' => 'ⅽ',
-       'Ⅾ' => 'ⅾ',
-       'Ⅿ' => 'ⅿ',
-       'Ↄ' => 'ↄ',
-       'Ⓐ' => 'ⓐ',
-       'Ⓑ' => 'ⓑ',
-       'Ⓒ' => 'ⓒ',
-       'Ⓓ' => 'ⓓ',
-       'Ⓔ' => 'ⓔ',
-       'Ⓕ' => 'ⓕ',
-       'Ⓖ' => 'ⓖ',
-       'Ⓗ' => 'ⓗ',
-       'Ⓘ' => 'ⓘ',
-       'Ⓙ' => 'ⓙ',
-       'Ⓚ' => 'ⓚ',
-       'Ⓛ' => 'ⓛ',
-       'Ⓜ' => 'ⓜ',
-       'Ⓝ' => 'ⓝ',
-       'Ⓞ' => 'ⓞ',
-       'Ⓟ' => 'ⓟ',
-       'Ⓠ' => 'ⓠ',
-       'Ⓡ' => 'ⓡ',
-       'Ⓢ' => 'ⓢ',
-       'Ⓣ' => 'ⓣ',
-       'Ⓤ' => 'ⓤ',
-       'Ⓥ' => 'ⓥ',
-       'Ⓦ' => 'ⓦ',
-       'Ⓧ' => 'ⓧ',
-       'Ⓨ' => 'ⓨ',
-       'Ⓩ' => 'ⓩ',
-       'Ⰰ' => 'ⰰ',
-       'Ⰱ' => 'ⰱ',
-       'Ⰲ' => 'ⰲ',
-       'Ⰳ' => 'ⰳ',
-       'Ⰴ' => 'ⰴ',
-       'Ⰵ' => 'ⰵ',
-       'Ⰶ' => 'ⰶ',
-       'Ⰷ' => 'ⰷ',
-       'Ⰸ' => 'ⰸ',
-       'Ⰹ' => 'ⰹ',
-       'Ⰺ' => 'ⰺ',
-       'Ⰻ' => 'ⰻ',
-       'Ⰼ' => 'ⰼ',
-       'Ⰽ' => 'ⰽ',
-       'Ⰾ' => 'ⰾ',
-       'Ⰿ' => 'ⰿ',
-       'Ⱀ' => 'ⱀ',
-       'Ⱁ' => 'ⱁ',
-       'Ⱂ' => 'ⱂ',
-       'Ⱃ' => 'ⱃ',
-       'Ⱄ' => 'ⱄ',
-       'Ⱅ' => 'ⱅ',
-       'Ⱆ' => 'ⱆ',
-       'Ⱇ' => 'ⱇ',
-       'Ⱈ' => 'ⱈ',
-       'Ⱉ' => 'ⱉ',
-       'Ⱊ' => 'ⱊ',
-       'Ⱋ' => 'ⱋ',
-       'Ⱌ' => 'ⱌ',
-       'Ⱍ' => 'ⱍ',
-       'Ⱎ' => 'ⱎ',
-       'Ⱏ' => 'ⱏ',
-       'Ⱐ' => 'ⱐ',
-       'Ⱑ' => 'ⱑ',
-       'Ⱒ' => 'ⱒ',
-       'Ⱓ' => 'ⱓ',
-       'Ⱔ' => 'ⱔ',
-       'Ⱕ' => 'ⱕ',
-       'Ⱖ' => 'ⱖ',
-       'Ⱗ' => 'ⱗ',
-       'Ⱘ' => 'ⱘ',
-       'Ⱙ' => 'ⱙ',
-       'Ⱚ' => 'ⱚ',
-       'Ⱛ' => 'ⱛ',
-       'Ⱜ' => 'ⱜ',
-       'Ⱝ' => 'ⱝ',
-       'Ⱞ' => 'ⱞ',
-       'Ⱡ' => 'ⱡ',
-       'Ɫ' => 'ɫ',
-       'Ᵽ' => 'ᵽ',
-       'Ɽ' => 'ɽ',
-       'Ⱨ' => 'ⱨ',
-       'Ⱪ' => 'ⱪ',
-       'Ⱬ' => 'ⱬ',
-       'Ɑ' => 'ɑ',
-       'Ɱ' => 'ɱ',
-       'Ɐ' => 'ɐ',
-       'Ɒ' => 'ɒ',
-       'Ⱳ' => 'ⱳ',
-       'Ⱶ' => 'ⱶ',
-       'Ȿ' => 'ȿ',
-       'Ɀ' => 'ɀ',
-       'Ⲁ' => 'ⲁ',
-       'Ⲃ' => 'ⲃ',
-       'Ⲅ' => 'ⲅ',
-       'Ⲇ' => 'ⲇ',
-       'Ⲉ' => 'ⲉ',
-       'Ⲋ' => 'ⲋ',
-       'Ⲍ' => 'ⲍ',
-       'Ⲏ' => 'ⲏ',
-       'Ⲑ' => 'ⲑ',
-       'Ⲓ' => 'ⲓ',
-       'Ⲕ' => 'ⲕ',
-       'Ⲗ' => 'ⲗ',
-       'Ⲙ' => 'ⲙ',
-       'Ⲛ' => 'ⲛ',
-       'Ⲝ' => 'ⲝ',
-       'Ⲟ' => 'ⲟ',
-       'Ⲡ' => 'ⲡ',
-       'Ⲣ' => 'ⲣ',
-       'Ⲥ' => 'ⲥ',
-       'Ⲧ' => 'ⲧ',
-       'Ⲩ' => 'ⲩ',
-       'Ⲫ' => 'ⲫ',
-       'Ⲭ' => 'ⲭ',
-       'Ⲯ' => 'ⲯ',
-       'Ⲱ' => 'ⲱ',
-       'Ⲳ' => 'ⲳ',
-       'Ⲵ' => 'ⲵ',
-       'Ⲷ' => 'ⲷ',
-       'Ⲹ' => 'ⲹ',
-       'Ⲻ' => 'ⲻ',
-       'Ⲽ' => 'ⲽ',
-       'Ⲿ' => 'ⲿ',
-       'Ⳁ' => 'ⳁ',
-       'Ⳃ' => 'ⳃ',
-       'Ⳅ' => 'ⳅ',
-       'Ⳇ' => 'ⳇ',
-       'Ⳉ' => 'ⳉ',
-       'Ⳋ' => 'ⳋ',
-       'Ⳍ' => 'ⳍ',
-       'Ⳏ' => 'ⳏ',
-       'Ⳑ' => 'ⳑ',
-       'Ⳓ' => 'ⳓ',
-       'Ⳕ' => 'ⳕ',
-       'Ⳗ' => 'ⳗ',
-       'Ⳙ' => 'ⳙ',
-       'Ⳛ' => 'ⳛ',
-       'Ⳝ' => 'ⳝ',
-       'Ⳟ' => 'ⳟ',
-       'Ⳡ' => 'ⳡ',
-       'Ⳣ' => 'ⳣ',
-       'Ⳬ' => 'ⳬ',
-       'Ⳮ' => 'ⳮ',
-       'Ꙁ' => 'ꙁ',
-       'Ꙃ' => 'ꙃ',
-       'Ꙅ' => 'ꙅ',
-       'Ꙇ' => 'ꙇ',
-       'Ꙉ' => 'ꙉ',
-       'Ꙋ' => 'ꙋ',
-       'Ꙍ' => 'ꙍ',
-       'Ꙏ' => 'ꙏ',
-       'Ꙑ' => 'ꙑ',
-       'Ꙓ' => 'ꙓ',
-       'Ꙕ' => 'ꙕ',
-       'Ꙗ' => 'ꙗ',
-       'Ꙙ' => 'ꙙ',
-       'Ꙛ' => 'ꙛ',
-       'Ꙝ' => 'ꙝ',
-       'Ꙟ' => 'ꙟ',
-       'Ꙡ' => 'ꙡ',
-       'Ꙣ' => 'ꙣ',
-       'Ꙥ' => 'ꙥ',
-       'Ꙧ' => 'ꙧ',
-       'Ꙩ' => 'ꙩ',
-       'Ꙫ' => 'ꙫ',
-       'Ꙭ' => 'ꙭ',
-       'Ꚁ' => 'ꚁ',
-       'Ꚃ' => 'ꚃ',
-       'Ꚅ' => 'ꚅ',
-       'Ꚇ' => 'ꚇ',
-       'Ꚉ' => 'ꚉ',
-       'Ꚋ' => 'ꚋ',
-       'Ꚍ' => 'ꚍ',
-       'Ꚏ' => 'ꚏ',
-       'Ꚑ' => 'ꚑ',
-       'Ꚓ' => 'ꚓ',
-       'Ꚕ' => 'ꚕ',
-       'Ꚗ' => 'ꚗ',
-       'Ꜣ' => 'ꜣ',
-       'Ꜥ' => 'ꜥ',
-       'Ꜧ' => 'ꜧ',
-       'Ꜩ' => 'ꜩ',
-       'Ꜫ' => 'ꜫ',
-       'Ꜭ' => 'ꜭ',
-       'Ꜯ' => 'ꜯ',
-       'Ꜳ' => 'ꜳ',
-       'Ꜵ' => 'ꜵ',
-       'Ꜷ' => 'ꜷ',
-       'Ꜹ' => 'ꜹ',
-       'Ꜻ' => 'ꜻ',
-       'Ꜽ' => 'ꜽ',
-       'Ꜿ' => 'ꜿ',
-       'Ꝁ' => 'ꝁ',
-       'Ꝃ' => 'ꝃ',
-       'Ꝅ' => 'ꝅ',
-       'Ꝇ' => 'ꝇ',
-       'Ꝉ' => 'ꝉ',
-       'Ꝋ' => 'ꝋ',
-       'Ꝍ' => 'ꝍ',
-       'Ꝏ' => 'ꝏ',
-       'Ꝑ' => 'ꝑ',
-       'Ꝓ' => 'ꝓ',
-       'Ꝕ' => 'ꝕ',
-       'Ꝗ' => 'ꝗ',
-       'Ꝙ' => 'ꝙ',
-       'Ꝛ' => 'ꝛ',
-       'Ꝝ' => 'ꝝ',
-       'Ꝟ' => 'ꝟ',
-       'Ꝡ' => 'ꝡ',
-       'Ꝣ' => 'ꝣ',
-       'Ꝥ' => 'ꝥ',
-       'Ꝧ' => 'ꝧ',
-       'Ꝩ' => 'ꝩ',
-       'Ꝫ' => 'ꝫ',
-       'Ꝭ' => 'ꝭ',
-       'Ꝯ' => 'ꝯ',
-       'Ꝺ' => 'ꝺ',
-       'Ꝼ' => 'ꝼ',
-       'Ᵹ' => 'ᵹ',
-       'Ꝿ' => 'ꝿ',
-       'Ꞁ' => 'ꞁ',
-       'Ꞃ' => 'ꞃ',
-       'Ꞅ' => 'ꞅ',
-       'Ꞇ' => 'ꞇ',
-       'Ꞌ' => 'ꞌ',
-       'Ɥ' => 'ɥ',
-       'Ꞑ' => 'ꞑ',
-       'Ꞡ' => 'ꞡ',
-       'Ꞣ' => 'ꞣ',
-       'Ꞥ' => 'ꞥ',
-       'Ꞧ' => 'ꞧ',
-       'Ꞩ' => 'ꞩ',
-       'A' => 'a',
-       'B' => 'b',
-       'C' => 'c',
-       'D' => 'd',
-       'E' => 'e',
-       'F' => 'f',
-       'G' => 'g',
-       'H' => 'h',
-       'I' => 'i',
-       'J' => 'j',
-       'K' => 'k',
-       'L' => 'l',
-       'M' => 'm',
-       'N' => 'n',
-       'O' => 'o',
-       'P' => 'p',
-       'Q' => 'q',
-       'R' => 'r',
-       'S' => 's',
-       'T' => 't',
-       'U' => 'u',
-       'V' => 'v',
-       'W' => 'w',
-       'X' => 'x',
-       'Y' => 'y',
-       'Z' => 'z',
-       '𐐀' => '𐐨',
-       '𐐁' => '𐐩',
-       '𐐂' => '𐐪',
-       '𐐃' => '𐐫',
-       '𐐄' => '𐐬',
-       '𐐅' => '𐐭',
-       '𐐆' => '𐐮',
-       '𐐇' => '𐐯',
-       '𐐈' => '𐐰',
-       '𐐉' => '𐐱',
-       '𐐊' => '𐐲',
-       '𐐋' => '𐐳',
-       '𐐌' => '𐐴',
-       '𐐍' => '𐐵',
-       '𐐎' => '𐐶',
-       '𐐏' => '𐐷',
-       '𐐐' => '𐐸',
-       '𐐑' => '𐐹',
-       '𐐒' => '𐐺',
-       '𐐓' => '𐐻',
-       '𐐔' => '𐐼',
-       '𐐕' => '𐐽',
-       '𐐖' => '𐐾',
-       '𐐗' => '𐐿',
-       '𐐘' => '𐑀',
-       '𐐙' => '𐑁',
-       '𐐚' => '𐑂',
-       '𐐛' => '𐑃',
-       '𐐜' => '𐑄',
-       '𐐝' => '𐑅',
-       '𐐞' => '𐑆',
-       '𐐟' => '𐑇',
-       '𐐠' => '𐑈',
-       '𐐡' => '𐑉',
-       '𐐢' => '𐑊',
-       '𐐣' => '𐑋',
-       '𐐤' => '𐑌',
-       '𐐥' => '𐑍',
-       '𐐦' => '𐑎',
-       '𐐧' => '𐑏'
-);
diff --git a/includes/normal/Utf8CaseGenerate.php b/includes/normal/Utf8CaseGenerate.php
deleted file mode 100644 (file)
index adc3ef2..0000000
+++ /dev/null
@@ -1,112 +0,0 @@
-<?php
-/**
- * This script generates Utf8Case.php from the Unicode Character Database
- * and supplementary files.
- *
- * Copyright © 2004,2008 Brion Vibber <brion@pobox.com>
- * http://www.mediawiki.org/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup UtfNormal
- */
-
-if( PHP_SAPI != 'cli' ) {
-       die( "Run me from the command line please.\n" );
-}
-
-require_once 'UtfNormalDefines.php';
-require_once 'UtfNormalUtil.php';
-
-$in = fopen("UnicodeData.txt", "rt" );
-if( !$in ) {
-       print "Can't open UnicodeData.txt for reading.\n";
-       print "If necessary, fetch this file from the internet:\n";
-       print "http://www.unicode.org/Public/UNIDATA/UnicodeData.txt\n";
-       exit(-1);
-}
-$wikiUpperChars = array();
-$wikiLowerChars = array();
-
-print "Reading character definitions...\n";
-while( false !== ($line = fgets( $in ) ) ) {
-       $columns = explode(';', $line);
-       $codepoint = $columns[0];
-       $name = $columns[1];
-       $simpleUpper = $columns[12];
-       $simpleLower = $columns[13];
-
-       $source = codepointToUtf8( hexdec( $codepoint ) );
-       if( $simpleUpper ) {
-               $wikiUpperChars[$source] = codepointToUtf8( hexdec( $simpleUpper ) );
-       }
-       if( $simpleLower ) {
-               $wikiLowerChars[$source] = codepointToUtf8( hexdec( $simpleLower ) );
-       }
-}
-fclose( $in );
-
-$out = fopen( "Utf8Case.php", "wt" );
-if( $out ) {
-       $outUpperChars = escapeArray( $wikiUpperChars );
-       $outLowerChars = escapeArray( $wikiLowerChars );
-       $outdata = "<" . "?php
-/**
- * Simple 1:1 upper/lowercase switching arrays for utf-8 text.
- * Won't get context-sensitive things yet.
- *
- * Hack for bugs in ucfirst() and company
- *
- * These are pulled from memcached if possible, as this is faster than filling
- * up a big array manually.
- *
- * @file
- * @ingroup Language
- */
-
-/**
- * Translation array to get upper case character
- */
-\$wikiUpperChars = $outUpperChars;
-
-/**
- * Translation array to get lower case character
- */
-\$wikiLowerChars = $outLowerChars;\n";
-       fputs( $out, $outdata );
-       fclose( $out );
-       print "Wrote out Utf8Case.php\n";
-} else {
-       print "Can't create file Utf8Case.php\n";
-       exit(-1);
-}
-
-
-function escapeArray( $arr ) {
-       return "array(\n" .
-               implode( ",\n",
-                       array_map( "escapeLine",
-                               array_keys( $arr ),
-                               array_values( $arr ) ) ) .
-               "\n)";
-}
-
-function escapeLine( $key, $val ) {
-       $encKey = escapeSingleString( $key );
-       $encVal = escapeSingleString( $val );
-       return "\t'$encKey' => '$encVal'";
-}
diff --git a/includes/objectcache/DBABagOStuff.php b/includes/objectcache/DBABagOStuff.php
deleted file mode 100644 (file)
index c82b3aa..0000000
+++ /dev/null
@@ -1,307 +0,0 @@
-<?php
-/**
- * Object caching using DBA backend.
- *
- * 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 Cache
- */
-
-/**
- * Cache that uses DBA as a backend.
- * Slow due to the need to constantly open and close the file to avoid holding
- * writer locks. Intended for development use only,  as a memcached workalike
- * for systems that don't have it.
- *
- * On construction you can pass array( 'dir' => '/some/path' ); as a parameter
- * to override the default DBA files directory (wfTempDir()).
- *
- * @ingroup Cache
- */
-class DBABagOStuff extends BagOStuff {
-       var $mHandler, $mFile, $mReader, $mWriter, $mDisabled;
-
-       /**
-        * @param $params array
-        */
-       public function __construct( $params ) {
-               global $wgDBAhandler;
-
-               if ( !isset( $params['dir'] ) ) {
-                       $params['dir'] = wfTempDir();
-               }
-
-               $this->mFile = $params['dir'] . '/mw-cache-' . wfWikiID() . '.db';
-               wfDebug( __CLASS__ . ": using cache file {$this->mFile}\n" );
-               $this->mHandler = $wgDBAhandler;
-       }
-
-       /**
-        * Encode value and expiry for storage
-        * @param $value
-        * @param $expiry
-        *
-        * @return string
-        */
-       protected function encode( $value, $expiry ) {
-               # Convert to absolute time
-               $expiry = $this->convertExpiry( $expiry );
-
-               return sprintf( '%010u', intval( $expiry ) ) . ' ' . serialize( $value );
-       }
-
-       /**
-        * @param $blob string
-        * @return array list containing value first and expiry second
-        */
-       protected function decode( $blob ) {
-               if ( !is_string( $blob ) ) {
-                       return array( false, 0 );
-               } else {
-                       return array(
-                               unserialize( substr( $blob, 11 ) ),
-                               intval( substr( $blob, 0, 10 ) )
-                       );
-               }
-       }
-
-       /**
-        * @return resource
-        */
-       protected function getReader() {
-               if ( file_exists( $this->mFile ) ) {
-                       $handle = dba_open( $this->mFile, 'rl', $this->mHandler );
-               } else {
-                       $handle = $this->getWriter();
-               }
-
-               if ( !$handle ) {
-                       wfDebug( "Unable to open DBA cache file {$this->mFile}\n" );
-               }
-
-               return $handle;
-       }
-
-       /**
-        * @return resource
-        */
-       protected function getWriter() {
-               $handle = dba_open( $this->mFile, 'cl', $this->mHandler );
-
-               if ( !$handle ) {
-                       wfDebug( "Unable to open DBA cache file {$this->mFile}\n" );
-               }
-
-               return $handle;
-       }
-
-       /**
-        * @param $key string
-        * @param $casToken[optional] mixed
-        * @return mixed
-        */
-       public function get( $key, &$casToken = null ) {
-               wfProfileIn( __METHOD__ );
-               wfDebug( __METHOD__ . "($key)\n" );
-
-               $handle = $this->getReader();
-               if ( !$handle ) {
-                       wfProfileOut( __METHOD__ );
-                       return false;
-               }
-
-               $val = dba_fetch( $key, $handle );
-               list( $val, $expiry ) = $this->decode( $val );
-
-               # Must close ASAP because locks are held
-               dba_close( $handle );
-
-               if ( $val !== false && $expiry && $expiry < time() ) {
-                       # Key is expired, delete it
-                       $handle = $this->getWriter();
-                       dba_delete( $key, $handle );
-                       dba_close( $handle );
-                       wfDebug( __METHOD__ . ": $key expired\n" );
-                       $val = false;
-               }
-
-               $casToken = $val;
-
-               wfProfileOut( __METHOD__ );
-
-               return $val;
-       }
-
-       /**
-        * @param $key string
-        * @param $value mixed
-        * @param $exptime int
-        * @return bool
-        */
-       public function set( $key, $value, $exptime = 0 ) {
-               wfProfileIn( __METHOD__ );
-               wfDebug( __METHOD__ . "($key)\n" );
-
-               $blob = $this->encode( $value, $exptime );
-
-               $handle = $this->getWriter();
-               if ( !$handle ) {
-                       wfProfileOut( __METHOD__ );
-                       return false;
-               }
-
-               $ret = dba_replace( $key, $blob, $handle );
-               dba_close( $handle );
-
-               wfProfileOut( __METHOD__ );
-               return $ret;
-       }
-
-       /**
-        * @param $casToken mixed
-        * @param $key string
-        * @param $value mixed
-        * @param $exptime int
-        * @return bool
-        */
-       public function cas( $casToken, $key, $value, $exptime = 0 ) {
-               wfProfileIn( __METHOD__ );
-               wfDebug( __METHOD__ . "($key)\n" );
-
-               $blob = $this->encode( $value, $exptime );
-
-               $handle = $this->getWriter();
-               if ( !$handle ) {
-                       wfProfileOut( __METHOD__ );
-                       return false;
-               }
-
-               // DBA is locked to any other write connection, so we can safely
-               // compare the current & previous value before saving new value
-               $val = dba_fetch( $key, $handle );
-               list( $val, $exptime ) = $this->decode( $val );
-               if ( $casToken !== $val ) {
-                       dba_close( $handle );
-                       wfProfileOut( __METHOD__ );
-                       return false;
-               }
-
-               $ret = dba_replace( $key, $blob, $handle );
-               dba_close( $handle );
-
-               wfProfileOut( __METHOD__ );
-               return $ret;
-       }
-
-       /**
-        * @param $key string
-        * @param $time int
-        * @return bool
-        */
-       public function delete( $key, $time = 0 ) {
-               wfProfileIn( __METHOD__ );
-               wfDebug( __METHOD__ . "($key)\n" );
-
-               $handle = $this->getWriter();
-               if ( !$handle ) {
-                       wfProfileOut( __METHOD__ );
-                       return false;
-               }
-
-               $ret = !dba_exists( $key, $handle ) || dba_delete( $key, $handle );
-               dba_close( $handle );
-
-               wfProfileOut( __METHOD__ );
-               return $ret;
-       }
-
-       /**
-        * @param $key string
-        * @param $value mixed
-        * @param $exptime int
-        * @return bool
-        */
-       public function add( $key, $value, $exptime = 0 ) {
-               wfProfileIn( __METHOD__ );
-
-               $blob = $this->encode( $value, $exptime );
-
-               $handle = $this->getWriter();
-
-               if ( !$handle ) {
-                       wfProfileOut( __METHOD__ );
-                       return false;
-               }
-
-               $ret = dba_insert( $key, $blob, $handle );
-
-               # Insert failed, check to see if it failed due to an expired key
-               if ( !$ret ) {
-                       list( , $expiry ) = $this->decode( dba_fetch( $key, $handle ) );
-
-                       if ( $expiry && $expiry < time() ) {
-                               # Yes expired, delete and try again
-                               dba_delete( $key, $handle );
-                               $ret = dba_insert( $key, $blob, $handle );
-                               # This time if it failed then it will be handled by the caller like any other race
-                       }
-               }
-
-               dba_close( $handle );
-
-               wfProfileOut( __METHOD__ );
-               return $ret;
-       }
-
-       /**
-        * @param $key string
-        * @param $step integer
-        * @return integer|bool
-        */
-       public function incr( $key, $step = 1 ) {
-               wfProfileIn( __METHOD__ );
-
-               $handle = $this->getWriter();
-
-               if ( !$handle ) {
-                       wfProfileOut( __METHOD__ );
-                       return false;
-               }
-
-               list( $value, $expiry ) = $this->decode( dba_fetch( $key, $handle ) );
-               if ( $value !== false ) {
-                       if ( $expiry && $expiry < time() ) {
-                               # Key is expired, delete it
-                               dba_delete( $key, $handle );
-                               wfDebug( __METHOD__ . ": $key expired\n" );
-                               $value = false;
-                       } else {
-                               $value += $step;
-                               $blob = $this->encode( $value, $expiry );
-
-                               $ret = dba_replace( $key, $blob, $handle );
-                               $value = $ret ? $value : false;
-                       }
-               }
-
-               dba_close( $handle );
-
-               wfProfileOut( __METHOD__ );
-
-               return ( $value === false ) ? false : (int)$value;
-       }
-}
diff --git a/includes/objectcache/EhcacheBagOStuff.php b/includes/objectcache/EhcacheBagOStuff.php
deleted file mode 100644 (file)
index 960668f..0000000
+++ /dev/null
@@ -1,324 +0,0 @@
-<?php
-/**
- * Object caching using the Ehcache RESTful web service.
- *
- * 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 Cache
- */
-
-/**
- * Client for the Ehcache RESTful web service - http://ehcache.org/documentation/cache_server.html
- * TODO: Simplify configuration and add to the installer.
- *
- * @ingroup Cache
- */
-class EhcacheBagOStuff extends BagOStuff {
-       var $servers, $cacheName, $connectTimeout, $timeout, $curlOptions,
-               $requestData, $requestDataPos;
-
-       var $curls = array();
-
-       /**
-        * @param $params array
-        * @throws MWException
-        */
-       function __construct( $params ) {
-               if ( !defined( 'CURLOPT_TIMEOUT_MS' ) ) {
-                       throw new MWException( __CLASS__ . ' requires curl version 7.16.2 or later.' );
-               }
-               if ( !extension_loaded( 'zlib' ) ) {
-                       throw new MWException( __CLASS__ . ' requires the zlib extension' );
-               }
-               if ( !isset( $params['servers'] ) ) {
-                       throw new MWException( __METHOD__ . ': servers parameter is required' );
-               }
-               $this->servers = $params['servers'];
-               $this->cacheName = isset( $params['cache'] ) ? $params['cache'] : 'mw';
-               $this->connectTimeout = isset( $params['connectTimeout'] )
-                       ? $params['connectTimeout'] : 1;
-               $this->timeout = isset( $params['timeout'] ) ? $params['timeout'] : 1;
-               $this->curlOptions = array(
-                       CURLOPT_CONNECTTIMEOUT_MS => intval( $this->connectTimeout * 1000 ),
-                       CURLOPT_TIMEOUT_MS => intval( $this->timeout * 1000 ),
-                       CURLOPT_RETURNTRANSFER => 1,
-                       CURLOPT_CUSTOMREQUEST => 'GET',
-                       CURLOPT_POST => 0,
-                       CURLOPT_POSTFIELDS => '',
-                       CURLOPT_HTTPHEADER => array(),
-               );
-       }
-
-       /**
-        * @param $key string
-        * @param $casToken[optional] mixed
-        * @return bool|mixed
-        */
-       public function get( $key, &$casToken = null ) {
-               wfProfileIn( __METHOD__ );
-               $response = $this->doItemRequest( $key );
-               if ( !$response || $response['http_code'] == 404 ) {
-                       wfProfileOut( __METHOD__ );
-                       return false;
-               }
-               if ( $response['http_code'] >= 300 ) {
-                       wfDebug( __METHOD__ . ": GET failure, got HTTP {$response['http_code']}\n" );
-                       wfProfileOut( __METHOD__ );
-                       return false;
-               }
-               $body = $response['body'];
-               $type = $response['content_type'];
-               if ( $type == 'application/vnd.php.serialized+deflate' ) {
-                       $body = gzinflate( $body );
-                       if ( !$body ) {
-                               wfDebug( __METHOD__ . ": error inflating $key\n" );
-                               wfProfileOut( __METHOD__ );
-                               return false;
-                       }
-                       $data = unserialize( $body );
-               } elseif ( $type == 'application/vnd.php.serialized' ) {
-                       $data = unserialize( $body );
-               } else {
-                       wfDebug( __METHOD__ . ": unknown content type \"$type\"\n" );
-                       wfProfileOut( __METHOD__ );
-                       return false;
-               }
-
-               $casToken = $body;
-
-               wfProfileOut( __METHOD__ );
-               return $data;
-       }
-
-       /**
-        * @param $key string
-        * @param $value mixed
-        * @param $expiry int
-        * @return bool
-        */
-       public function set( $key, $value, $expiry = 0 ) {
-               wfProfileIn( __METHOD__ );
-               $expiry = $this->convertExpiry( $expiry );
-               $ttl = $expiry ? $expiry - time() : 2147483647;
-               $blob = serialize( $value );
-               if ( strlen( $blob ) > 100 ) {
-                       $blob = gzdeflate( $blob );
-                       $contentType = 'application/vnd.php.serialized+deflate';
-               } else {
-                       $contentType = 'application/vnd.php.serialized';
-               }
-
-               $code = $this->attemptPut( $key, $blob, $contentType, $ttl );
-
-               if ( $code == 404 ) {
-                       // Maybe the cache does not exist yet, let's try creating it
-                       if ( !$this->createCache( $key ) ) {
-                               wfDebug( __METHOD__ . ": cache creation failed\n" );
-                               wfProfileOut( __METHOD__ );
-                               return false;
-                       }
-                       $code = $this->attemptPut( $key, $blob, $contentType, $ttl );
-               }
-
-               $result = false;
-               if ( !$code ) {
-                       wfDebug( __METHOD__ . ": PUT failure for key $key\n" );
-               } elseif ( $code >= 300 ) {
-                       wfDebug( __METHOD__ . ": PUT failure for key $key: HTTP $code\n" );
-               } else {
-                       $result = true;
-               }
-
-               wfProfileOut( __METHOD__ );
-               return $result;
-       }
-
-       /**
-        * @param $casToken mixed
-        * @param $key string
-        * @param $value mixed
-        * @param $exptime int
-        * @return bool
-        */
-       public function cas( $casToken, $key, $value, $exptime = 0 ) {
-               // Not sure if we can implement CAS for ehcache. There appears to be CAS-support per
-               // http://ehcache.org/documentation/get-started/consistency-options#cas-cache-operations,
-               // but I can't find any docs for our current implementation.
-               throw new MWException( "CAS is not implemented in " . __CLASS__ );
-       }
-
-       /**
-        * @param $key string
-        * @param $time int
-        * @return bool
-        */
-       public function delete( $key, $time = 0 ) {
-               wfProfileIn( __METHOD__ );
-               $response = $this->doItemRequest( $key,
-                       array( CURLOPT_CUSTOMREQUEST => 'DELETE' ) );
-               $code = isset( $response['http_code'] ) ? $response['http_code'] : 0;
-               if ( !$response || ( $code != 404 && $code >= 300 ) ) {
-                       wfDebug( __METHOD__ . ": DELETE failure for key $key\n" );
-                       $result = false;
-               } else {
-                       $result = true;
-               }
-               wfProfileOut( __METHOD__ );
-               return $result;
-       }
-
-       /**
-        * @see BagOStuff::merge()
-        * @return bool success
-        */
-       public function merge( $key, closure $callback, $exptime = 0, $attempts = 10 ) {
-               return $this->mergeViaLock( $key, $callback, $exptime, $attempts );
-       }
-
-       /**
-        * @param $key string
-        * @return string
-        */
-       protected function getCacheUrl( $key ) {
-               if ( count( $this->servers ) == 1 ) {
-                       $server = reset( $this->servers );
-               } else {
-                       // Use consistent hashing
-                       $hashes = array();
-                       foreach ( $this->servers as $server ) {
-                               $hashes[$server] = md5( $server . '/' . $key );
-                       }
-                       asort( $hashes );
-                       reset( $hashes );
-                       $server = key( $hashes );
-               }
-               return "http://$server/ehcache/rest/{$this->cacheName}";
-       }
-
-       /**
-        * Get a cURL handle for the given cache URL.
-        * We cache the handles to allow keepalive.
-        */
-       protected function getCurl( $cacheUrl ) {
-               if ( !isset( $this->curls[$cacheUrl] ) ) {
-                       $this->curls[$cacheUrl] = curl_init();
-               }
-               return $this->curls[$cacheUrl];
-       }
-
-       /**
-        * @param $key string
-        * @param $data
-        * @param $type
-        * @param $ttl
-        * @return int
-        */
-       protected function attemptPut( $key, $data, $type, $ttl ) {
-               // In initial benchmarking, it was 30 times faster to use CURLOPT_POST
-               // than CURLOPT_UPLOAD with CURLOPT_READFUNCTION. This was because
-               // CURLOPT_UPLOAD was pushing the request headers first, then waiting
-               // for an ACK packet, then sending the data, whereas CURLOPT_POST just
-               // sends the headers and the data in a single send().
-               $response = $this->doItemRequest( $key,
-                       array(
-                               CURLOPT_POST => 1,
-                               CURLOPT_CUSTOMREQUEST => 'PUT',
-                               CURLOPT_POSTFIELDS => $data,
-                               CURLOPT_HTTPHEADER => array(
-                                       'Content-Type: ' . $type,
-                                       'ehcacheTimeToLiveSeconds: ' . $ttl
-                               )
-                       )
-               );
-               if ( !$response ) {
-                       return 0;
-               } else {
-                       return $response['http_code'];
-               }
-       }
-
-       /**
-        * @param $key string
-        * @return bool
-        */
-       protected function createCache( $key ) {
-               wfDebug( __METHOD__ . ": creating cache for $key\n" );
-               $response = $this->doCacheRequest( $key,
-                       array(
-                               CURLOPT_POST => 1,
-                               CURLOPT_CUSTOMREQUEST => 'PUT',
-                               CURLOPT_POSTFIELDS => '',
-                       ) );
-               if ( !$response ) {
-                       wfDebug( __CLASS__ . ": failed to create cache for $key\n" );
-                       return false;
-               }
-               return ( $response['http_code'] == 201 /* created */
-                       || $response['http_code'] == 409 /* already there */ );
-       }
-
-       /**
-        * @param $key string
-        * @param $curlOptions array
-        * @return array|bool|mixed
-        */
-       protected function doCacheRequest( $key, $curlOptions = array() ) {
-               $cacheUrl = $this->getCacheUrl( $key );
-               $curl = $this->getCurl( $cacheUrl );
-               return $this->doRequest( $curl, $cacheUrl, $curlOptions );
-       }
-
-       /**
-        * @param $key string
-        * @param $curlOptions array
-        * @return array|bool|mixed
-        */
-       protected function doItemRequest( $key, $curlOptions = array() ) {
-               $cacheUrl = $this->getCacheUrl( $key );
-               $curl = $this->getCurl( $cacheUrl );
-               $url = $cacheUrl . '/' . rawurlencode( $key );
-               return $this->doRequest( $curl, $url, $curlOptions );
-       }
-
-       /**
-        * @param $curl
-        * @param $url string
-        * @param $curlOptions array
-        * @return array|bool|mixed
-        * @throws MWException
-        */
-       protected function doRequest( $curl, $url, $curlOptions = array() ) {
-               if ( array_diff_key( $curlOptions, $this->curlOptions ) ) {
-                       // var_dump( array_diff_key( $curlOptions, $this->curlOptions ) );
-                       throw new MWException( __METHOD__ . ": to prevent options set in one doRequest() " .
-                               "call from affecting subsequent doRequest() calls, only options listed " .
-                               "in \$this->curlOptions may be specified in the \$curlOptions parameter." );
-               }
-               $curlOptions += $this->curlOptions;
-               $curlOptions[CURLOPT_URL] = $url;
-
-               curl_setopt_array( $curl, $curlOptions );
-               $result = curl_exec( $curl );
-               if ( $result === false ) {
-                       wfDebug( __CLASS__ . ": curl error: " . curl_error( $curl ) . "\n" );
-                       return false;
-               }
-               $info = curl_getinfo( $curl );
-               $info['body'] = $result;
-               return $info;
-       }
-}
index 6206057..0a945a9 100644 (file)
@@ -78,10 +78,3 @@ class EmptyBagOStuff extends BagOStuff {
                return true;
        }
 }
-
-/**
- * Backwards compatibility alias for EmptyBagOStuff
- * @deprecated since 1.18
- */
-class FakeMemCachedClient extends EmptyBagOStuff {
-}
index d061eff..bc5167d 100644 (file)
@@ -64,7 +64,7 @@ class HashBagOStuff extends BagOStuff {
                        return false;
                }
 
-               $casToken = $this->bag[$key][0];
+               $casToken = serialize( $this->bag[$key][0] );
 
                return $this->bag[$key][0];
        }
@@ -88,7 +88,7 @@ class HashBagOStuff extends BagOStuff {
         * @return bool
         */
        function cas( $casToken, $key, $value, $exptime = 0 ) {
-               if ( $this->get( $key ) === $casToken ) {
+               if ( serialize( $this->get( $key ) ) === $casToken ) {
                        return $this->set( $key, $value, $exptime );
                }
 
index adcf762..3c97480 100644 (file)
@@ -79,12 +79,13 @@ class RedisBagOStuff extends BagOStuff {
                        return false;
                }
                try {
-                       $result = $this->unserialize( $conn->get( $key ) );
+                       $value = $conn->get( $key );
+                       $casToken = $value;
+                       $result = $this->unserialize( $value );
                } catch ( RedisException $e ) {
                        $result = false;
                        $this->handleException( $server, $conn, $e );
                }
-               $casToken = $result;
 
                $this->logRequest( 'get', $key, $server, $result );
                return $result;
@@ -125,7 +126,7 @@ class RedisBagOStuff extends BagOStuff {
                try {
                        $conn->watch( $key );
 
-                       if ( $this->get( $key ) !== $casToken ) {
+                       if ( $this->serialize( $this->get( $key ) ) !== $casToken ) {
                                $conn->unwatch();
                                return false;
                        }
index 250442c..3966b9e 100644 (file)
@@ -387,7 +387,7 @@ class CoreParserFunctions {
 
                if ( !$wgRestrictDisplayTitle ) {
                        $parser->mOutput->setDisplayTitle( $text );
-               } elseif ( $title instanceof Title && $title->getFragment() == '' && $title->equals( $parser->mTitle ) ) {
+               } elseif ( $title instanceof Title && !$title->hasFragment() && $title->equals( $parser->mTitle ) ) {
                        $parser->mOutput->setDisplayTitle( $text );
                }
 
@@ -402,11 +402,12 @@ class CoreParserFunctions {
         * @return boolean true on successful match
         */
        private static function matchAgainstMagicword( $magicword, $value ) {
-               if ( strval( $value ) === '' ) {
+               $value = trim( strval( $value ) );
+               if ( $value === '' ) {
                        return false;
                }
                $mwObject = MagicWord::get( $magicword );
-               return $mwObject->match( $value );
+               return $mwObject->matchStartToEnd( $value );
        }
 
        static function formatRaw( $num, $raw ) {
@@ -678,12 +679,6 @@ class CoreParserFunctions {
         * Return the size of the given page, or 0 if it's nonexistent.  This is an
         * expensive parser function and can't be called too many times per page.
         *
-        * @todo FIXME: Title::getLength() documentation claims that it adds things
-        *   to the link cache, so the local cache here should be unnecessary, but
-        *   in fact calling getLength() repeatedly for the same $page does seem to
-        *   run one query for each call?
-        * @todo Document parameters
-        *
         * @param $parser Parser
         * @param $page String Name of page to check (Default: empty string)
         * @param $raw String Should number be human readable with commas or just number
@@ -703,7 +698,10 @@ class CoreParserFunctions {
        }
 
        /**
-        * Returns the requested protection level for the current page
+        * Returns the requested protection level for the current page. This
+        * is an expensive parser function and can't be called too many times
+        * per page, unless the protection levels for the given title have
+        * already been retrieved
         *
         * @param Parser $parser
         * @param string $type
@@ -716,10 +714,13 @@ class CoreParserFunctions {
                if ( !( $titleObject instanceof Title ) ) {
                        $titleObject = $parser->mTitle;
                }
-               $restrictions = $titleObject->getRestrictions( strtolower( $type ) );
-               # Title::getRestrictions returns an array, its possible it may have
-               # multiple values in the future
-               return implode( $restrictions, ',' );
+               if ( $titleObject->areRestrictionsLoaded() || $parser->incrementExpensiveFunctionCount() ) {
+                       $restrictions = $titleObject->getRestrictions( strtolower( $type ) );
+                       # Title::getRestrictions returns an array, its possible it may have
+                       # multiple values in the future
+                       return implode( $restrictions, ',' );
+               }
+               return '';
        }
 
        /**
@@ -985,10 +986,34 @@ class CoreParserFunctions {
                // Use title from parser to have correct pageid after edit
                if ( $t->equals( $parser->getTitle() ) ) {
                        $t = $parser->getTitle();
+                       return $t->getArticleID();
+               }
+
+               // These can't have ids
+               if ( !$t->canExist() || $t->isExternal() ) {
+                       return 0;
+               }
+
+               // Check the link cache, maybe something already looked it up.
+               $linkCache = LinkCache::singleton();
+               $pdbk = $t->getPrefixedDBkey();
+               $id = $linkCache->getGoodLinkID( $pdbk );
+               if ( $id != 0 ) {
+                       $parser->mOutput->addLink( $t, $id );
+                       return $id;
+               }
+               if ( $linkCache->isBadLink( $pdbk ) ) {
+                       $parser->mOutput->addLink( $t, 0 );
+                       return $id;
                }
-               // fetch pageid from cache/database and return the value
-               $pageid = $t->getArticleID();
-               return $pageid ? $pageid : '';
+
+               // We need to load it from the DB, so mark expensive
+               if ( $parser->incrementExpensiveFunctionCount() ) {
+                       $id = $t->getArticleID();
+                       $parser->mOutput->addLink( $t, $id );
+                       return $id;
+               }
+               return null;
        }
 
        /**
@@ -1122,7 +1147,8 @@ class CoreParserFunctions {
        /**
         * Returns the sources of any cascading protection acting on a specified page.
         * Pages will not return their own title unless they transclude themselves.
-        * This is an expensive parser function and can't be called too many times per page.
+        * This is an expensive parser function and can't be called too many times per page,
+        * unless cascading protection sources for the page have already been loaded.
         *
         * @param Parser $parser
         * @param string $title
@@ -1135,15 +1161,17 @@ class CoreParserFunctions {
                if ( !( $titleObject instanceof Title ) ) {
                        $titleObject = $parser->mTitle;
                }
-               $names = array();
-               if ( $parser->incrementExpensiveFunctionCount() ) {
+               if ( $titleObject->areCascadeProtectionSourcesLoaded()
+                       || $parser->incrementExpensiveFunctionCount()
+               ) {
+                       $names = array();
                        $sources = $titleObject->getCascadeProtectionSources();
                        foreach ( $sources[0] as $sourceTitle ) {
                                $names[] = $sourceTitle->getPrefixedText();
                        }
+                       return implode( $names, '|' );
                }
-
-               return implode( $names, '|' );
+               return '';
        }
 
 }
index 40c0a89..0e7c76f 100644 (file)
@@ -501,7 +501,7 @@ class LinkHolderArray {
                                // Self-link checking for mixed/different variant titles. At this point, we
                                // already know the exact title does not exist, so the link cannot be to a
                                // variant of the current title that exists as a separate page.
-                               if ( $variantTitle->equals( $parentTitle ) && $title->getFragment() === '' ) {
+                               if ( $variantTitle->equals( $parentTitle ) && !$title->hasFragment() ) {
                                        $this->internals[$ns][$index]['selflink'] = true;
                                        continue 2;
                                }
index cdf5e98..9157619 100644 (file)
@@ -710,7 +710,7 @@ class Parser {
                        $t = Title::newFromText( 'NO TITLE' );
                }
 
-               if ( strval( $t->getFragment() ) !== '' ) {
+               if ( $t->hasFragment() ) {
                        # Strip the fragment to avoid various odd effects
                        $this->mTitle = clone $t;
                        $this->mTitle->setFragment( '' );
@@ -1988,7 +1988,7 @@ class Parser {
                        }
 
                        $ns = $nt->getNamespace();
-                       $iw = $nt->getInterWiki();
+                       $iw = $nt->getInterwiki();
                        wfProfileOut( __METHOD__ . "-title" );
 
                        if ( $might_be_img ) { # if this is actually an invalid link
@@ -2120,7 +2120,7 @@ class Parser {
                        # Self-link checking. For some languages, variants of the title are checked in
                        # LinkHolderArray::doVariants() to allow batching the existence checks necessary
                        # for linking to a different variant.
-                       if ( $ns != NS_SPECIAL && $nt->equals( $this->mTitle ) && $nt->getFragment() === '' ) {
+                       if ( $ns != NS_SPECIAL && $nt->equals( $this->mTitle ) && !$nt->hasFragment() ) {
                                $s .= $prefix . Linker::makeSelfLinkObj( $nt, $text, '', $trail );
                                continue;
                        }
index c4e9a1c..2ab1d89 100644 (file)
@@ -255,16 +255,6 @@ class ParserOptions {
        function getUser()                          { return $this->mUser; }
        function getPreSaveTransform()              { return $this->mPreSaveTransform; }
 
-       /**
-        * @param $title Title
-        * @return Skin
-        * @deprecated since 1.18 Use Linker::* instead
-        */
-       function getSkin( $title = null ) {
-               wfDeprecated( __METHOD__, '1.18' );
-               return new DummyLinker;
-       }
-
        function getDateFormat() {
                $this->optionUsed( 'dateformat' );
                if ( !isset( $this->mDateFormat ) ) {
index 32b16aa..dbfab34 100644 (file)
@@ -206,6 +206,9 @@ class MWTidy {
                $process = proc_open(
                        "$wgTidyBin -config $wgTidyConf $wgTidyOpts$opts", $descriptorspec, $pipes );
 
+               //NOTE: At least on linux, the process will be created even if tidy is not installed.
+               //      This means that missing tidy will be treated as a validation failure.
+
                if ( is_resource( $process ) ) {
                        // Theoretically, this style of communication could cause a deadlock
                        // here. If the stdout buffer fills up, then writes to stdin could
index 063cb90..98d3f02 100644 (file)
  *
  * @since 1.22
  */
+class JSONRCFeedFormatter extends MachineReadableRCFeedFormatter {
 
-class JSONRCFeedFormatter implements RCFeedFormatter {
-       /**
-        * Generates a notification that can be easily interpreted by a machine.
-        * @see RCFeedFormatter::getLine
-        */
-       public function getLine( array $feed, RecentChange $rc, $actionComment ) {
-               global $wgCanonicalServer, $wgScriptPath, $wgDBname;
-               $attrib = $rc->getAttributes();
-
-               $packet = array(
-                       // Usually, RC ID is exposed only for patrolling purposes,
-                       // but there is no real reason not to expose it in other cases,
-                       // and I can see how this may be potentially useful for clients.
-                       'id' => $attrib['rc_id'],
-                       'type' => $attrib['rc_type'],
-                       'namespace' => $rc->getTitle()->getNamespace(),
-                       'title' => $rc->getTitle()->getPrefixedText(),
-                       'comment' => $attrib['rc_comment'],
-                       'timestamp' => (int)wfTimestamp( TS_UNIX, $attrib['rc_timestamp'] ),
-                       'user' => $attrib['rc_user_text'],
-                       'bot' => (bool)$attrib['rc_bot'],
-               );
-
-               if ( isset( $feed['channel'] ) ) {
-                       $packet['channel'] = $feed['channel'];
-               }
-
-               $type = $attrib['rc_type'];
-               if ( $type == RC_EDIT || $type == RC_NEW ) {
-                       global $wgUseRCPatrol, $wgUseNPPatrol;
-
-                       $packet['minor'] = $attrib['rc_minor'];
-                       if ( $wgUseRCPatrol || ( $type == RC_NEW && $wgUseNPPatrol ) ) {
-                               $packet['patrolled'] = $attrib['rc_patrolled'];
-                       }
-               }
-
-               switch ( $type ) {
-                       case RC_EDIT:
-                               $packet['length'] = array( 'old' => $attrib['rc_old_len'], 'new' => $attrib['rc_new_len'] );
-                               $packet['revision'] = array( 'old' => $attrib['rc_last_oldid'], 'new' => $attrib['rc_this_oldid'] );
-                               break;
-
-                       case RC_NEW:
-                               $packet['length'] = array( 'old' => null, 'new' => $attrib['rc_new_len'] );
-                               $packet['revision'] = array( 'old' => null, 'new' => $attrib['rc_this_oldid'] );
-                               break;
-
-                       case RC_LOG:
-                               $packet['log_type'] = $attrib['rc_log_type'];
-                               $packet['log_action'] = $attrib['rc_log_action'];
-                               if ( $attrib['rc_params'] ) {
-                                       wfSuppressWarnings();
-                                       $params = unserialize( $attrib['rc_params'] );
-                                       wfRestoreWarnings();
-                                       if (
-                                               // If it's an actual serialised false...
-                                               $attrib['rc_params'] == serialize( false ) ||
-                                               // Or if we did not get false back when trying to unserialise
-                                               $params !== false
-                                       ) {
-                                               // From ApiQueryLogEvents::addLogParams
-                                               $logParams = array();
-                                               // Keys like "4::paramname" can't be used for output so we change them to "paramname"
-                                               foreach ( $params as $key => $value ) {
-                                                       if ( strpos( $key, ':' ) === false ) {
-                                                               $logParams[$key] = $value;
-                                                               continue;
-                                                       }
-                                                       $logParam = explode( ':', $key, 3 );
-                                                       $logParams[$logParam[2]] = $value;
-                                               }
-                                               $packet['log_params'] = $logParams;
-                                       } else {
-                                               $packet['log_params'] = explode( "\n", $attrib['rc_params'] );
-                                       }
-                               }
-                               $packet['log_action_comment'] = $actionComment;
-                               break;
-               }
-
-               $packet['server_url'] = $wgCanonicalServer;
-               $packet['server_script_path'] = $wgScriptPath ?: '/';
-               $packet['wiki'] = $wgDBname;
-
+       protected function formatArray( array $packet ) {
                return FormatJson::encode( $packet );
        }
 }
diff --git a/includes/rcfeed/MachineReadableRCFeedFormatter.php b/includes/rcfeed/MachineReadableRCFeedFormatter.php
new file mode 100644 (file)
index 0000000..9321f52
--- /dev/null
@@ -0,0 +1,128 @@
+<?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
+ */
+
+/**
+ * Abstract class so there can be multiple formatters outputting the same data
+ *
+ * @since 1.23
+ */
+abstract class MachineReadableRCFeedFormatter implements RCFeedFormatter {
+
+       /**
+        * Take the packet and return the formatted string
+        * @param array $packet
+        * @return string
+        */
+       abstract protected function formatArray( array $packet );
+
+       /**
+        * Generates a notification that can be easily interpreted by a machine.
+        * @see RCFeedFormatter::getLine
+        */
+       public function getLine( array $feed, RecentChange $rc, $actionComment ) {
+               global $wgCanonicalServer, $wgScriptPath;
+               $attrib = $rc->getAttributes();
+
+               $packet = array(
+                       // Usually, RC ID is exposed only for patrolling purposes,
+                       // but there is no real reason not to expose it in other cases,
+                       // and I can see how this may be potentially useful for clients.
+                       'id' => $attrib['rc_id'],
+                       'type' => $attrib['rc_type'],
+                       'namespace' => $rc->getTitle()->getNamespace(),
+                       'title' => $rc->getTitle()->getPrefixedText(),
+                       'comment' => $attrib['rc_comment'],
+                       'timestamp' => (int)wfTimestamp( TS_UNIX, $attrib['rc_timestamp'] ),
+                       'user' => $attrib['rc_user_text'],
+                       'bot' => (bool)$attrib['rc_bot'],
+               );
+
+               if ( isset( $feed['channel'] ) ) {
+                       $packet['channel'] = $feed['channel'];
+               }
+
+               $type = $attrib['rc_type'];
+               if ( $type == RC_EDIT || $type == RC_NEW ) {
+                       global $wgUseRCPatrol, $wgUseNPPatrol;
+
+                       $packet['minor'] = $attrib['rc_minor'];
+                       if ( $wgUseRCPatrol || ( $type == RC_NEW && $wgUseNPPatrol ) ) {
+                               $packet['patrolled'] = $attrib['rc_patrolled'];
+                       }
+               }
+
+               switch ( $type ) {
+                       case RC_EDIT:
+                               $packet['length'] = array(
+                                       'old' => $attrib['rc_old_len'],
+                                       'new' => $attrib['rc_new_len']
+                               );
+                               $packet['revision'] = array(
+                                       'old' => $attrib['rc_last_oldid'],
+                                       'new' => $attrib['rc_this_oldid']
+                               );
+                               break;
+
+                       case RC_NEW:
+                               $packet['length'] = array( 'old' => null, 'new' => $attrib['rc_new_len'] );
+                               $packet['revision'] = array( 'old' => null, 'new' => $attrib['rc_this_oldid'] );
+                               break;
+
+                       case RC_LOG:
+                               $packet['log_type'] = $attrib['rc_log_type'];
+                               $packet['log_action'] = $attrib['rc_log_action'];
+                               if ( $attrib['rc_params'] ) {
+                                       wfSuppressWarnings();
+                                       $params = unserialize( $attrib['rc_params'] );
+                                       wfRestoreWarnings();
+                                       if (
+                                               // If it's an actual serialised false...
+                                               $attrib['rc_params'] == serialize( false ) ||
+                                               // Or if we did not get false back when trying to unserialise
+                                               $params !== false
+                                       ) {
+                                               // From ApiQueryLogEvents::addLogParams
+                                               $logParams = array();
+                                               // Keys like "4::paramname" can't be used for output so we change them to "paramname"
+                                               foreach ( $params as $key => $value ) {
+                                                       if ( strpos( $key, ':' ) === false ) {
+                                                               $logParams[$key] = $value;
+                                                               continue;
+                                                       }
+                                                       $logParam = explode( ':', $key, 3 );
+                                                       $logParams[$logParam[2]] = $value;
+                                               }
+                                               $packet['log_params'] = $logParams;
+                                       } else {
+                                               $packet['log_params'] = explode( "\n", $attrib['rc_params'] );
+                                       }
+                               }
+                               $packet['log_action_comment'] = $actionComment;
+                               break;
+               }
+
+               $packet['server_url'] = $wgCanonicalServer;
+               $packet['server_script_path'] = $wgScriptPath ?: '/';
+               $packet['wiki'] = wfWikiID();
+
+               return $this->formatArray( $packet );
+       }
+}
diff --git a/includes/rcfeed/XMLRCFeedFormatter.php b/includes/rcfeed/XMLRCFeedFormatter.php
new file mode 100644 (file)
index 0000000..d572426
--- /dev/null
@@ -0,0 +1,30 @@
+<?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
+ */
+
+/**
+ * @since 1.23
+ */
+class XMLRCFeedFormatter extends MachineReadableRCFeedFormatter {
+
+       protected function formatArray( array $packet ) {
+               return ApiFormatXml::recXmlPrint( 'recentchange', $packet, 0 );
+       }
+}
index 08b1ac1..b6c9cec 100644 (file)
@@ -716,7 +716,9 @@ class ResourceLoader {
                $states = array();
 
                if ( !count( $modules ) && !count( $missing ) ) {
-                       return '/* No modules requested. Max made me put this here */';
+                       return "/* This file is the Web entry point for MediaWiki's ResourceLoader:
+   <https://www.mediawiki.org/wiki/ResourceLoader>. In this request,
+   no modules were requested. Max made me put this here. */";
                }
 
                wfProfileIn( __METHOD__ );
index a9d1076..424afce 100644 (file)
@@ -77,12 +77,6 @@ class ResourceLoaderUserCSSPrefsModule extends ResourceLoaderModule {
                if ( $options['justify'] ) {
                        $rules[] = "#article, #bodyContent, #mw_content { text-align: justify; }\n";
                }
-               if ( !$options['showtoc'] ) {
-                       $rules[] = "#toc { display: none; }\n";
-               }
-               if ( !$options['editsection'] ) {
-                       $rules[] = ".mw-editsection { display: none; }\n";
-               }
                if ( $options['editfont'] !== 'default' ) {
                        // Double-check that $options['editfont'] consists of safe characters only
                        if ( preg_match( '/^[a-zA-Z0-9_, -]+$/', $options['editfont'] ) ) {
diff --git a/includes/search/SearchDatabase.php b/includes/search/SearchDatabase.php
new file mode 100644 (file)
index 0000000..e3aafe8
--- /dev/null
@@ -0,0 +1,46 @@
+<?php
+/**
+ * Database search engine
+ *
+ * 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 Search
+ */
+
+/**
+ * Base search engine base class for database-backed searches
+ * @ingroup Search
+ * @since 1.23
+ */
+class SearchDatabase extends SearchEngine {
+       /**
+        * @var DatabaseBase Slave database for reading from for results
+        */
+       protected $db;
+
+       /**
+        * Constructor
+        * @param DatabaseBase $db The database to search from
+        */
+       public function __construct( DatabaseBase $db = null ) {
+               if ( $db ) {
+                       $this->db = $db;
+               } else {
+                       $this->db = wfGetDB( DB_SLAVE );
+               }
+       }
+}
index 94d39a5..33fcd8c 100644 (file)
@@ -41,19 +41,6 @@ class SearchEngine {
        /// Feature values
        protected $features = array();
 
-       /**
-        * @var DatabaseBase
-        */
-       protected $db;
-
-       function __construct( $db = null ) {
-               if ( $db ) {
-                       $this->db = $db;
-               } else {
-                       $this->db = wfGetDB( DB_SLAVE );
-               }
-       }
-
        /**
         * Perform a full text search query and return a result set.
         * If title searches are not supported or disabled, return null.
@@ -762,18 +749,22 @@ class SearchResult {
        /**
         * @var Revision
         */
-       var $mRevision = null;
-       var $mImage = null;
+       protected $mRevision = null;
+
+       /**
+        * @var File
+        */
+       protected $mImage = null;
 
        /**
         * @var Title
         */
-       var $mTitle;
+       protected $mTitle;
 
        /**
         * @var String
         */
-       var $mText;
+       protected $mText;
 
        /**
         * Return a new SearchResult and initializes it with a title.
@@ -840,10 +831,7 @@ class SearchResult {
         * @return Boolean
         */
        function isBrokenTitle() {
-               if ( is_null( $this->mTitle ) ) {
-                       return true;
-               }
-               return false;
+               return is_null( $this->mTitle );
        }
 
        /**
@@ -862,6 +850,14 @@ class SearchResult {
                return $this->mTitle;
        }
 
+       /**
+        * Get the file for this page, if one exists
+        * @return File|null
+        */
+       function getFile() {
+               return $this->mImage;
+       }
+
        /**
         * @return float|null if not supported
         */
@@ -979,6 +975,13 @@ class SearchResult {
        function getInterwikiPrefix() {
                return '';
        }
+
+       /**
+        * Did this match file contents (eg: PDF/DJVU)?
+        */
+       function isFileMatch() {
+               return false;
+       }
 }
 /**
  * A SearchResultSet wrapper for SearchEngine::getNearMatch
index cbc1a7a..15b5f1c 100644 (file)
  * Search engine hook base class for Mssql (ConText).
  * @ingroup Search
  */
-class SearchMssql extends SearchEngine {
-
-       /**
-        * Creates an instance of this class
-        * @param $db DatabaseMssql: database object
-        */
-       function __construct( $db ) {
-               parent::__construct( $db );
-       }
-
+class SearchMssql extends SearchDatabase {
        /**
         * Perform a full text search query and return a result set.
         *
index b2bc1c2..aec6a01 100644 (file)
  * Search engine hook for MySQL 4+
  * @ingroup Search
  */
-class SearchMySQL extends SearchEngine {
+class SearchMySQL extends SearchDatabase {
        var $strictMatching = true;
        static $mMinSearchLength;
 
-       /**
-        * Creates an instance of this class
-        * @param $db DatabaseMysql: database object
-        */
-       function __construct( $db ) {
-               parent::__construct( $db );
-       }
-
        /**
         * Parse the user's query and transform it into an SQL fragment which will
         * become part of a WHERE clause
index a847965..cea17d2 100644 (file)
@@ -28,7 +28,7 @@
  * Search engine hook base class for Oracle (ConText).
  * @ingroup Search
  */
-class SearchOracle extends SearchEngine {
+class SearchOracle extends SearchDatabase {
 
        private $reservedWords = array(
                'ABOUT' => 1,
@@ -59,14 +59,6 @@ class SearchOracle extends SearchEngine {
                'WITHIN' => 1,
        );
 
-       /**
-        * Creates an instance of this class
-        * @param $db DatabasePostgres: database object
-        */
-       function __construct( $db ) {
-               parent::__construct( $db );
-       }
-
        /**
         * Perform a full text search query and return a result set.
         *
index 7f19ed1..c9f5466 100644 (file)
  * Search engine hook base class for Postgres
  * @ingroup Search
  */
-class SearchPostgres extends SearchEngine {
-
-       /**
-        * @var DatabasePostgres
-        */
-       protected $db;
-       /**
-        * Creates an instance of this class
-        * @param $db DatabaseSqlite: database object
-        */
-       function __construct( $db ) {
-               parent::__construct( $db );
-       }
-
+class SearchPostgres extends SearchDatabase {
        /**
         * Perform a full text search query via tsearch2 and return a result set.
         * Currently searches a page's current title (page.page_title) and
index 554181f..ebff68e 100644 (file)
  * Search engine hook for SQLite
  * @ingroup Search
  */
-class SearchSqlite extends SearchEngine {
-
-       /**
-        * @var DatabaseSqlite
-        */
-       protected $db;
-
-       /**
-        * Creates an instance of this class
-        * @param $db DatabaseSqlite: database object
-        */
-       function __construct( $db ) {
-               parent::__construct( $db );
-       }
-
+class SearchSqlite extends SearchDatabase {
        /**
         * Whether fulltext search is supported by current schema
         * @return Boolean
diff --git a/includes/specialpage/ChangesListSpecialPage.php b/includes/specialpage/ChangesListSpecialPage.php
new file mode 100644 (file)
index 0000000..d5ec18c
--- /dev/null
@@ -0,0 +1,293 @@
+<?php
+/**
+ * Special page which uses a ChangesList to show query results.
+ *
+ * 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 SpecialPage
+ */
+
+/**
+ * Special page which uses a ChangesList to show query results.
+ * @todo Way too many public functions, most of them should be protected
+ *
+ * @ingroup SpecialPage
+ */
+abstract class ChangesListSpecialPage extends SpecialPage {
+       var $rcSubpage, $rcOptions; // @todo Rename these, make protected
+       protected $customFilters;
+
+       /**
+        * Main execution point
+        * @todo This should totally do things
+        *
+        * @param string $subpage
+        */
+       public function execute( $subpage ) {
+               $this->rcSubpage = $subpage;
+               throw new MWException( "Not implemented" );
+       }
+
+       /**
+        * Get the current FormOptions for this request
+        * @todo Not called by anything, should be called by execute()
+        *
+        * @return FormOptions
+        */
+       public function getOptions() {
+               if ( $this->rcOptions === null ) {
+                       $this->rcOptions = $this->setup( $this->rcSubpage );
+               }
+
+               return $this->rcOptions;
+       }
+
+       /**
+        * Create a FormOptions object with options as specified by the user
+        *
+        * @param array $parameters
+        *
+        * @return FormOptions
+        */
+       public function setup( $parameters ) {
+               $opts = $this->getDefaultOptions();
+               foreach ( $this->getCustomFilters() as $key => $params ) {
+                       $opts->add( $key, $params['default'] );
+               }
+
+               $opts = $this->fetchOptionsFromRequest( $opts );
+
+               // Give precedence to subpage syntax
+               if ( $parameters !== null ) {
+                       $this->parseParameters( $parameters, $opts );
+               }
+
+               $this->validateOptions( $opts );
+
+               return $opts;
+       }
+
+       /**
+        * Get a FormOptions object containing the default options. By default returns some basic options,
+        * you might not call parent method and discard them.
+        *
+        * @return FormOptions
+        */
+       public function getDefaultOptions() {
+               $opts = new FormOptions();
+
+               $opts->add( 'namespace', '', FormOptions::INTNULL );
+               $opts->add( 'invert', false );
+               $opts->add( 'associated', false );
+
+               return $opts;
+       }
+
+       /**
+        * Get custom show/hide filters
+        *
+        * @return array Map of filter URL param names to properties (msg/default)
+        */
+       protected function getCustomFilters() {
+               // @todo Fire a Special{$this->getName()}Filters hook here
+               return array();
+       }
+
+       /**
+        * Fetch values for a FormOptions object from the WebRequest associated with this instance.
+        *
+        * Intended for subclassing, e.g. to add a backwards-compatibility layer.
+        *
+        * @param FormOptions $parameters
+        * @return FormOptions
+        */
+       protected function fetchOptionsFromRequest( $opts ) {
+               $opts->fetchValuesFromRequest( $this->getRequest() );
+               return $opts;
+       }
+
+       /**
+        * Process $par and put options found in $opts. Used when including the page.
+        *
+        * @param string $par
+        * @param FormOptions $opts
+        */
+       public function parseParameters( $par, FormOptions $opts ) {
+               // nothing by default
+       }
+
+       /**
+        * Validate a FormOptions object generated by getDefaultOptions() with values already populated.
+        *
+        * @param FormOptions $opts
+        */
+       public function validateOptions( FormOptions $opts ) {
+               // nothing by default
+       }
+
+       /**
+        * Return an array of conditions depending of options set in $opts
+        * @todo This should build some basic conditions here…
+        * @todo Not called by anything, should be called by execute()
+        *
+        * @param FormOptions $opts
+        * @return array
+        */
+       abstract public function buildMainQueryConds( FormOptions $opts );
+
+       /**
+        * Process the query
+        * @todo This should build some basic processing here…
+        * @todo Not called by anything, should be called by execute()
+        *
+        * @param array $conds
+        * @param FormOptions $opts
+        * @return bool|ResultWrapper Result or false (for Recentchangeslinked only)
+        */
+       abstract public function doMainQuery( $conds, $opts );
+
+       /**
+        * Send output to the OutputPage object, only called if not used feeds
+        * @todo This should do most, if not all, of the outputting now done by subclasses
+        * @todo Not called by anything, should be called by execute()
+        *
+        * @param array $rows Database rows
+        * @param FormOptions $opts
+        */
+       abstract public function webOutput( $rows, $opts );
+
+       /**
+        * Return the text to be displayed above the changes
+        * @todo Not called by anything, should be called by webOutput()
+        *
+        * @param FormOptions $opts
+        * @return string XHTML
+        */
+       public function doHeader( $opts ) {
+               $this->setTopText( $opts );
+
+               // @todo Lots of stuff should be done here.
+
+               $this->setBottomText( $opts );
+       }
+
+       /**
+        * Send the text to be displayed before the options. Should use $this->getOutput()->addWikiText()
+        * or similar methods to print the text.
+        *
+        * @param FormOptions $opts
+        */
+       function setTopText( FormOptions $opts ) {
+               // nothing by default
+       }
+
+       /**
+        * Send the text to be displayed after the options. Should use $this->getOutput()->addWikiText()
+        * or similar methods to print the text.
+        *
+        * @param FormOptions $opts
+        */
+       function setBottomText( FormOptions $opts ) {
+               // nothing by default
+       }
+
+       /**
+        * Get options to be displayed in a form
+        * @todo This should handle options returned by getDefaultOptions().
+        * @todo Not called by anything, should be called by something… doHeader() maybe?
+        *
+        * @param FormOptions $opts
+        * @return array
+        */
+       function getExtraOptions( $opts ) {
+               return array();
+       }
+
+       /**
+        * Return the legend displayed within the fieldset
+        * @todo This should not be static, then we can drop the parameter
+        * @todo Not called by anything, should be called by doHeader()
+        *
+        * @param $context the object available as $this in non-static functions
+        * @return string
+        */
+       public static function makeLegend( IContextSource $context ) {
+               global $wgRecentChangesFlags;
+               $user = $context->getUser();
+               # The legend showing what the letters and stuff mean
+               $legend = Xml::openElement( 'dl' ) . "\n";
+               # Iterates through them and gets the messages for both letter and tooltip
+               $legendItems = $wgRecentChangesFlags;
+               if ( !$user->useRCPatrol() ) {
+                       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;
+
+                       $legend .= Xml::element( 'dt',
+                               array( 'class' => $cssClass ), $context->msg( $letter )->text()
+                       ) . "\n";
+                       if ( $key === 'newpage' ) {
+                               $legend .= Xml::openElement( 'dd' );
+                               $legend .= $context->msg( $label )->escaped();
+                               $legend .= ' ' . $context->msg( 'recentchanges-legend-newpage' )->parse();
+                               $legend .= Xml::closeElement( 'dd' ) . "\n";
+                       } else {
+                               $legend .= Xml::element( 'dd', array(),
+                                       $context->msg( $label )->text()
+                               ) . "\n";
+                       }
+               }
+               # (+-123)
+               $legend .= Xml::tags( 'dt',
+                       array( 'class' => 'mw-plusminus-pos' ),
+                       $context->msg( 'recentchanges-legend-plusminus' )->parse()
+               ) . "\n";
+               $legend .= Xml::element(
+                       'dd',
+                       array( 'class' => 'mw-changeslist-legend-plusminus' ),
+                       $context->msg( 'recentchanges-label-plusminus' )->text()
+               ) . "\n";
+               $legend .= Xml::closeElement( 'dl' ) . "\n";
+
+               # Collapsibility
+               $legend =
+                       '<div class="mw-changeslist-legend">' .
+                               $context->msg( 'recentchanges-legend-heading' )->parse() .
+                               '<div class="mw-collapsible-content">' . $legend . '</div>' .
+                       '</div>';
+
+               return $legend;
+       }
+
+       /**
+        * Add page-specific modules.
+        * @todo Not called by anything, should be called by execute()
+        */
+       protected function addModules() {
+               $out = $this->getOutput();
+               // Styles and behavior for the legend box (see makeLegend())
+               $out->addModuleStyles( 'mediawiki.special.changeslist.legend' );
+               $out->addModules( 'mediawiki.special.changeslist.legend.js' );
+       }
+
+       protected function getGroupName() {
+               return 'changes';
+       }
+}
diff --git a/includes/specialpage/SpecialPageFactory.php b/includes/specialpage/SpecialPageFactory.php
new file mode 100644 (file)
index 0000000..792d0a6
--- /dev/null
@@ -0,0 +1,592 @@
+<?php
+/**
+ * Factory for handling the special page list and generating SpecialPage objects.
+ *
+ * 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 SpecialPage
+ * @defgroup SpecialPage SpecialPage
+ */
+
+/**
+ * Factory for handling the special page list and generating SpecialPage objects.
+ *
+ * To add a special page in an extension, add to $wgSpecialPages either
+ * an object instance or an array containing the name and constructor
+ * parameters. The latter is preferred for performance reasons.
+ *
+ * The object instantiated must be either an instance of SpecialPage or a
+ * sub-class thereof. It must have an execute() method, which sends the HTML
+ * for the special page to $wgOut. The parent class has an execute() method
+ * which distributes the call to the historical global functions. Additionally,
+ * execute() also checks if the user has the necessary access privileges
+ * and bails out if not.
+ *
+ * To add a core special page, use the similar static list in
+ * SpecialPageFactory::$list. To remove a core static special page at runtime, use
+ * a SpecialPage_initList hook.
+ *
+ * @ingroup SpecialPage
+ * @since 1.17
+ */
+class SpecialPageFactory {
+       /**
+        * List of special page names to the subclass of SpecialPage which handles them.
+        */
+       private static $list = array(
+               // Maintenance Reports
+               'BrokenRedirects'           => 'BrokenRedirectsPage',
+               'Deadendpages'              => 'DeadendpagesPage',
+               'DoubleRedirects'           => 'DoubleRedirectsPage',
+               'Longpages'                 => 'LongpagesPage',
+               'Ancientpages'              => 'AncientpagesPage',
+               'Lonelypages'               => 'LonelypagesPage',
+               'Fewestrevisions'           => 'FewestrevisionsPage',
+               'Withoutinterwiki'          => 'WithoutinterwikiPage',
+               'Protectedpages'            => 'SpecialProtectedpages',
+               'Protectedtitles'           => 'SpecialProtectedtitles',
+               'Shortpages'                => 'ShortpagesPage',
+               'Uncategorizedcategories'   => 'UncategorizedcategoriesPage',
+               'Uncategorizedimages'       => 'UncategorizedimagesPage',
+               'Uncategorizedpages'        => 'UncategorizedpagesPage',
+               'Uncategorizedtemplates'    => 'UncategorizedtemplatesPage',
+               'Unusedcategories'          => 'UnusedcategoriesPage',
+               'Unusedimages'              => 'UnusedimagesPage',
+               'Unusedtemplates'           => 'UnusedtemplatesPage',
+               'Unwatchedpages'            => 'UnwatchedpagesPage',
+               'Wantedcategories'          => 'WantedcategoriesPage',
+               'Wantedfiles'               => 'WantedfilesPage',
+               'Wantedpages'               => 'WantedpagesPage',
+               'Wantedtemplates'           => 'WantedtemplatesPage',
+
+               // List of pages
+               'Allpages'                  => 'SpecialAllpages',
+               'Prefixindex'               => 'SpecialPrefixindex',
+               'Categories'                => 'SpecialCategories',
+               'Listredirects'             => 'ListredirectsPage',
+               'PagesWithProp'             => 'SpecialPagesWithProp',
+
+               // Login/create account
+               'Userlogin'                 => 'LoginForm',
+               'CreateAccount'             => 'SpecialCreateAccount',
+
+               // Users and rights
+               'Block'                     => 'SpecialBlock',
+               'Unblock'                   => 'SpecialUnblock',
+               'BlockList'                 => 'SpecialBlockList',
+               'ChangePassword'            => 'SpecialChangePassword',
+               'PasswordReset'             => 'SpecialPasswordReset',
+               'DeletedContributions'      => 'DeletedContributionsPage',
+               'Preferences'               => 'SpecialPreferences',
+               'ResetTokens'               => 'SpecialResetTokens',
+               'Contributions'             => 'SpecialContributions',
+               'Listgrouprights'           => 'SpecialListGroupRights',
+               'Listusers'                 => 'SpecialListUsers',
+               'Listadmins'                => 'SpecialListAdmins',
+               'Listbots'                  => 'SpecialListBots',
+               'Userrights'                => 'UserrightsPage',
+               'EditWatchlist'             => 'SpecialEditWatchlist',
+
+               // Recent changes and logs
+               'Newimages'                 => 'SpecialNewFiles',
+               'Log'                       => 'SpecialLog',
+               'Watchlist'                 => 'SpecialWatchlist',
+               'Newpages'                  => 'SpecialNewpages',
+               'Recentchanges'             => 'SpecialRecentChanges',
+               'Recentchangeslinked'       => 'SpecialRecentChangesLinked',
+               'Tags'                      => 'SpecialTags',
+
+               // Media reports and uploads
+               'Listfiles'                 => 'SpecialListFiles',
+               'Filepath'                  => 'SpecialFilepath',
+               'MIMEsearch'                => 'MIMEsearchPage',
+               'FileDuplicateSearch'       => 'FileDuplicateSearchPage',
+               'Upload'                    => 'SpecialUpload',
+               'UploadStash'               => 'SpecialUploadStash',
+
+               // Data and tools
+               'Statistics'                => 'SpecialStatistics',
+               'Allmessages'               => 'SpecialAllmessages',
+               'Version'                   => 'SpecialVersion',
+               'Lockdb'                    => 'SpecialLockdb',
+               'Unlockdb'                  => 'SpecialUnlockdb',
+
+               // Redirecting special pages
+               'LinkSearch'                => 'LinkSearchPage',
+               'Randompage'                => 'Randompage',
+               'RandomInCategory'          => 'SpecialRandomInCategory',
+               'Randomredirect'            => 'SpecialRandomredirect',
+
+               // High use pages
+               'Mostlinkedcategories'      => 'MostlinkedCategoriesPage',
+               'Mostimages'                => 'MostimagesPage',
+               'Mostinterwikis'            => 'MostinterwikisPage',
+               'Mostlinked'                => 'MostlinkedPage',
+               'Mostlinkedtemplates'       => 'MostlinkedTemplatesPage',
+               'Mostcategories'            => 'MostcategoriesPage',
+               'Mostrevisions'             => 'MostrevisionsPage',
+
+               // Page tools
+               'ComparePages'              => 'SpecialComparePages',
+               'Export'                    => 'SpecialExport',
+               'Import'                    => 'SpecialImport',
+               'Undelete'                  => 'SpecialUndelete',
+               'Whatlinkshere'             => 'SpecialWhatlinkshere',
+               'MergeHistory'              => 'SpecialMergeHistory',
+               'ExpandTemplates'           => 'SpecialExpandTemplates',
+
+               // Other
+               'Booksources'               => 'SpecialBookSources',
+
+               // Unlisted / redirects
+               'Blankpage'                 => 'SpecialBlankpage',
+               'Diff'                      => 'SpecialDiff',
+               'Emailuser'                 => 'SpecialEmailUser',
+               'Movepage'                  => 'MovePageForm',
+               'Mycontributions'           => 'SpecialMycontributions',
+               'Mypage'                    => 'SpecialMypage',
+               'Mytalk'                    => 'SpecialMytalk',
+               'Myuploads'                 => 'SpecialMyuploads',
+               'AllMyUploads'              => 'SpecialAllMyUploads',
+               'PermanentLink'             => 'SpecialPermanentLink',
+               'Redirect'                  => 'SpecialRedirect',
+               'Revisiondelete'            => 'SpecialRevisionDelete',
+               'Specialpages'              => 'SpecialSpecialpages',
+               'Userlogout'                => 'SpecialUserlogout',
+       );
+
+       private static $aliases;
+
+       /**
+        * Get the special page list
+        *
+        * @return array
+        */
+       static function getList() {
+               global $wgSpecialPages;
+               global $wgDisableCounters, $wgDisableInternalSearch, $wgEmailAuthentication;
+               global $wgEnableEmail, $wgEnableJavaScriptTest;
+               global $wgMiserMode;
+
+               if ( !is_object( self::$list ) ) {
+                       wfProfileIn( __METHOD__ );
+
+                       if ( !$wgDisableCounters ) {
+                               self::$list['Popularpages'] = 'PopularpagesPage';
+                       }
+
+                       if ( !$wgDisableInternalSearch ) {
+                               self::$list['Search'] = 'SpecialSearch';
+                       }
+
+                       if ( $wgEmailAuthentication ) {
+                               self::$list['Confirmemail'] = 'EmailConfirmation';
+                               self::$list['Invalidateemail'] = 'EmailInvalidation';
+                       }
+
+                       if ( $wgEnableEmail ) {
+                               self::$list['ChangeEmail'] = 'SpecialChangeEmail';
+                       }
+
+                       if ( $wgEnableJavaScriptTest ) {
+                               self::$list['JavaScriptTest'] = 'SpecialJavaScriptTest';
+                       }
+
+                       if ( !$wgMiserMode ) {
+                               self::$list['Activeusers'] = 'SpecialActiveUsers';
+                       }
+
+                       // Add extension special pages
+                       self::$list = array_merge( self::$list, $wgSpecialPages );
+
+                       // Run hooks
+                       // This hook can be used to remove undesired built-in special pages
+                       wfRunHooks( 'SpecialPage_initList', array( &self::$list ) );
+
+                       // Cast to object: func()[$key] doesn't work, but func()->$key does
+                       settype( self::$list, 'object' );
+
+                       wfProfileOut( __METHOD__ );
+               }
+               return self::$list;
+       }
+
+       /**
+        * Initialise and return the list of special page aliases.  Returns an object with
+        * properties which can be accessed $obj->pagename - each property is an array of
+        * aliases; the first in the array is the canonical alias.  All registered special
+        * pages are guaranteed to have a property entry, and for that property array to
+        * contain at least one entry (English fallbacks will be added if necessary).
+        * @return Object
+        */
+       static function getAliasList() {
+               if ( !is_object( self::$aliases ) ) {
+                       global $wgContLang;
+                       $aliases = $wgContLang->getSpecialPageAliases();
+
+                       // Objects are passed by reference by default, need to create a copy
+                       $missingPages = clone self::getList();
+
+                       self::$aliases = array();
+                       foreach ( $aliases as $realName => $aliasList ) {
+                               foreach ( $aliasList as $alias ) {
+                                       self::$aliases[$wgContLang->caseFold( $alias )] = $realName;
+                               }
+                               unset( $missingPages->$realName );
+                       }
+                       foreach ( $missingPages as $name => $stuff ) {
+                               self::$aliases[$wgContLang->caseFold( $name )] = $name;
+                       }
+
+                       // Cast to object: func()[$key] doesn't work, but func()->$key does
+                       self::$aliases = (object)self::$aliases;
+               }
+               return self::$aliases;
+       }
+
+       /**
+        * Given a special page name with a possible subpage, return an array
+        * where the first element is the special page name and the second is the
+        * subpage.
+        *
+        * @param string $alias
+        * @return array Array( String, String|null ), or array( null, null ) if the page is invalid
+        */
+       public static function resolveAlias( $alias ) {
+               global $wgContLang;
+               $bits = explode( '/', $alias, 2 );
+
+               $caseFoldedAlias = $wgContLang->caseFold( $bits[0] );
+               $caseFoldedAlias = str_replace( ' ', '_', $caseFoldedAlias );
+               if ( isset( self::getAliasList()->$caseFoldedAlias ) ) {
+                       $name = self::getAliasList()->$caseFoldedAlias;
+               } else {
+                       return array( null, null );
+               }
+
+               if ( !isset( $bits[1] ) ) { // bug 2087
+                       $par = null;
+               } else {
+                       $par = $bits[1];
+               }
+
+               return array( $name, $par );
+       }
+
+       /**
+        * Add a page to a certain display group for Special:SpecialPages
+        *
+        * @param SpecialPage|string $page
+        * @param string $group
+        * @deprecated since 1.21 Override SpecialPage::getGroupName
+        */
+       public static function setGroup( $page, $group ) {
+               wfDeprecated( __METHOD__, '1.21' );
+
+               global $wgSpecialPageGroups;
+               $name = is_object( $page ) ? $page->getName() : $page;
+               $wgSpecialPageGroups[$name] = $group;
+       }
+
+       /**
+        * Get the group that the special page belongs in on Special:SpecialPage
+        *
+        * @param SpecialPage $page
+        * @return string
+        * @deprecated since 1.21 Use SpecialPage::getFinalGroupName
+        */
+       public static function getGroup( &$page ) {
+               wfDeprecated( __METHOD__, '1.21' );
+
+               return $page->getFinalGroupName();
+       }
+
+       /**
+        * Check if a given name exist as a special page or as a special page alias
+        *
+        * @param string $name Name of a special page
+        * @return bool True if a special page exists with this name
+        */
+       public static function exists( $name ) {
+               list( $title, /*...*/ ) = self::resolveAlias( $name );
+               return property_exists( self::getList(), $title );
+       }
+
+       /**
+        * Find the object with a given name and return it (or NULL)
+        *
+        * @param string $name Special page name, may be localised and/or an alias
+        * @return SpecialPage|null SpecialPage object or null if the page doesn't exist
+        */
+       public static function getPage( $name ) {
+               list( $realName, /*...*/ ) = self::resolveAlias( $name );
+               if ( property_exists( self::getList(), $realName ) ) {
+                       $rec = self::getList()->$realName;
+                       if ( is_string( $rec ) ) {
+                               $className = $rec;
+                               return new $className;
+                       } elseif ( is_array( $rec ) ) {
+                               // @deprecated, officially since 1.18, unofficially since forever
+                               wfDebug( "Array syntax for \$wgSpecialPages is deprecated, define a subclass of SpecialPage instead." );
+                               $className = array_shift( $rec );
+                               self::getList()->$realName = MWFunction::newObj( $className, $rec );
+                       }
+                       return self::getList()->$realName;
+               } else {
+                       return null;
+               }
+       }
+
+       /**
+        * Return categorised listable special pages which are available
+        * for the current user, and everyone.
+        *
+        * @param $user User object to check permissions, $wgUser will be used if
+        *   if not provided
+        * @return array ( string => Specialpage )
+        */
+       public static function getUsablePages( User $user = null ) {
+               $pages = array();
+               if ( $user === null ) {
+                       global $wgUser;
+                       $user = $wgUser;
+               }
+               foreach ( self::getList() as $name => $rec ) {
+                       $page = self::getPage( $name );
+                       if ( $page ) { // not null
+                               $page->setContext( RequestContext::getMain() );
+                               if ( $page->isListed()
+                                       && ( !$page->isRestricted() || $page->userCanExecute( $user ) )
+                               ) {
+                                       $pages[$name] = $page;
+                               }
+                       }
+               }
+               return $pages;
+       }
+
+       /**
+        * Return categorised listable special pages for all users
+        *
+        * @return array ( string => Specialpage )
+        */
+       public static function getRegularPages() {
+               $pages = array();
+               foreach ( self::getList() as $name => $rec ) {
+                       $page = self::getPage( $name );
+                       if ( $page->isListed() && !$page->isRestricted() ) {
+                               $pages[$name] = $page;
+                       }
+               }
+               return $pages;
+       }
+
+       /**
+        * Return categorised listable special pages which are available
+        * for the current user, but not for everyone
+        *
+        * @return array ( string => Specialpage )
+        */
+       public static function getRestrictedPages() {
+               global $wgUser;
+               $pages = array();
+               foreach ( self::getList() as $name => $rec ) {
+                       $page = self::getPage( $name );
+                       if (
+                               $page->isListed()
+                               && $page->isRestricted()
+                               && $page->userCanExecute( $wgUser )
+                       ) {
+                               $pages[$name] = $page;
+                       }
+               }
+               return $pages;
+       }
+
+       /**
+        * Execute a special page path.
+        * The path may contain parameters, e.g. Special:Name/Params
+        * Extracts the special page name and call the execute method, passing the parameters
+        *
+        * Returns a title object if the page is redirected, false if there was no such special
+        * page, and true if it was successful.
+        *
+        * @param Title $title
+        * @param IContextSource $context
+        * @param bool $including Bool output is being captured for use in {{special:whatever}}
+        *
+        * @return bool
+        */
+       public static function executePath( Title &$title, IContextSource &$context, $including = false ) {
+               wfProfileIn( __METHOD__ );
+
+               // @todo FIXME: Redirects broken due to this call
+               $bits = explode( '/', $title->getDBkey(), 2 );
+               $name = $bits[0];
+               if ( !isset( $bits[1] ) ) { // bug 2087
+                       $par = null;
+               } else {
+                       $par = $bits[1];
+               }
+               $page = self::getPage( $name );
+               // Nonexistent?
+               if ( !$page ) {
+                       $context->getOutput()->setArticleRelated( false );
+                       $context->getOutput()->setRobotPolicy( 'noindex,nofollow' );
+
+                       global $wgSend404Code;
+                       if ( $wgSend404Code ) {
+                               $context->getOutput()->setStatusCode( 404 );
+                       }
+
+                       $context->getOutput()->showErrorPage( 'nosuchspecialpage', 'nospecialpagetext' );
+                       wfProfileOut( __METHOD__ );
+                       return false;
+               }
+
+               // Page exists, set the context
+               $page->setContext( $context );
+
+               if ( !$including ) {
+                       // Redirect to canonical alias for GET commands
+                       // Not for POST, we'd lose the post data, so it's best to just distribute
+                       // the request. Such POST requests are possible for old extensions that
+                       // generate self-links without being aware that their default name has
+                       // changed.
+                       if ( $name != $page->getLocalName() && !$context->getRequest()->wasPosted() ) {
+                               $query = $context->getRequest()->getQueryValues();
+                               unset( $query['title'] );
+                               $title = $page->getPageTitle( $par );
+                               $url = $title->getFullURL( $query );
+                               $context->getOutput()->redirect( $url );
+                               wfProfileOut( __METHOD__ );
+                               return $title;
+                       } else {
+                               $context->setTitle( $page->getPageTitle( $par ) );
+                       }
+
+               } elseif ( !$page->isIncludable() ) {
+                       wfProfileOut( __METHOD__ );
+                       return false;
+               }
+
+               $page->including( $including );
+
+               // Execute special page
+               $profName = 'Special:' . $page->getName();
+               wfProfileIn( $profName );
+               $page->run( $par );
+               wfProfileOut( $profName );
+               wfProfileOut( __METHOD__ );
+               return true;
+       }
+
+       /**
+        * Just like executePath() but will override global variables and execute
+        * the page in "inclusion" mode. Returns true if the execution was
+        * successful or false if there was no such special page, or a title object
+        * if it was a redirect.
+        *
+        * Also saves the current $wgTitle, $wgOut, $wgRequest, $wgUser and $wgLang
+        * variables so that the special page will get the context it'd expect on a
+        * normal request, and then restores them to their previous values after.
+        *
+        * @param Title $title
+        * @param IContextSource $context
+        * @return string HTML fragment
+        */
+       static function capturePath( Title $title, IContextSource $context ) {
+               global $wgOut, $wgTitle, $wgRequest, $wgUser, $wgLang;
+
+               // Save current globals
+               $oldTitle = $wgTitle;
+               $oldOut = $wgOut;
+               $oldRequest = $wgRequest;
+               $oldUser = $wgUser;
+               $oldLang = $wgLang;
+
+               // Set the globals to the current context
+               $wgTitle = $title;
+               $wgOut = $context->getOutput();
+               $wgRequest = $context->getRequest();
+               $wgUser = $context->getUser();
+               $wgLang = $context->getLanguage();
+
+               // The useful part
+               $ret = self::executePath( $title, $context, true );
+
+               // And restore the old globals
+               $wgTitle = $oldTitle;
+               $wgOut = $oldOut;
+               $wgRequest = $oldRequest;
+               $wgUser = $oldUser;
+               $wgLang = $oldLang;
+
+               return $ret;
+       }
+
+       /**
+        * Get the local name for a specified canonical name
+        *
+        * @param string $name
+        * @param string|bool $subpage
+        * @return string
+        */
+       static function getLocalNameFor( $name, $subpage = false ) {
+               global $wgContLang;
+               $aliases = $wgContLang->getSpecialPageAliases();
+
+               if ( isset( $aliases[$name][0] ) ) {
+                       $name = $aliases[$name][0];
+               } else {
+                       // Try harder in case someone misspelled the correct casing
+                       $found = false;
+                       foreach ( $aliases as $n => $values ) {
+                               if ( strcasecmp( $name, $n ) === 0 ) {
+                                       wfWarn( "Found alias defined for $n when searching for " .
+                                               "special page aliases for $name. Case mismatch?" );
+                                       $name = $values[0];
+                                       $found = true;
+                                       break;
+                               }
+                       }
+                       if ( !$found ) {
+                               wfWarn( "Did not find alias for special page '$name'. " .
+                                       "Perhaps no aliases are defined for it?" );
+                       }
+               }
+               if ( $subpage !== false && !is_null( $subpage ) ) {
+                       $name = "$name/$subpage";
+               }
+               return $wgContLang->ucfirst( $name );
+       }
+
+       /**
+        * Get a title for a given alias
+        *
+        * @param string $alias
+        * @return Title|null Title or null if there is no such alias
+        */
+       static function getTitleForAlias( $alias ) {
+               $name = self::resolveAlias( $alias );
+               if ( $name ) {
+                       return SpecialPage::getTitleFor( $name );
+               } else {
+                       return null;
+               }
+       }
+}
index 35d6a0c..71bb27a 100644 (file)
@@ -345,6 +345,17 @@ class AllmessagesTablePager extends TablePager {
                        case 'am_title' :
                                $title = Title::makeTitle( NS_MEDIAWIKI, $value . $this->suffix );
                                $talk = Title::makeTitle( NS_MEDIAWIKI_TALK, $value . $this->suffix );
+                               $translation = Linker::makeExternalLink(
+                                       'https://translatewiki.net/w/i.php?' . wfArrayToCgi( array(
+                                               'title' => 'Special:SearchTranslations',
+                                               'group' => 'mediawiki',
+                                               'grouppath' => 'mediawiki',
+                                               'query' => 'language:' . $this->getLanguage()->getCode() . '^25 ' .
+                                                       'messageid:"MediaWiki:' . $value . '"^10 "' .
+                                                       $this->msg ( $value )->inLanguage ( 'en' )->plain() . '"'
+                                       ) ),
+                                       $this->msg( 'allmessages-filter-translate' )->text()
+                               );
 
                                if ( $this->mCurrentRow->am_customised ) {
                                        $title = Linker::linkKnown( $title, $this->getLanguage()->lcfirst( $value ) );
@@ -369,7 +380,10 @@ class AllmessagesTablePager extends TablePager {
                                        );
                                }
 
-                               return $title . ' ' . $this->msg( 'parentheses' )->rawParams( $talk )->escaped();
+                               return $title . ' '
+                               . $this->msg( 'parentheses' )->rawParams( $talk )->escaped()
+                               . ' '
+                               . $this->msg( 'parentheses' )->rawParams( $translation )->escaped();
 
                        case 'am_default' :
                        case 'am_actual' :
index 1aa8006..d2ee0df 100644 (file)
  * @ingroup SpecialPage
  */
 class SpecialBlock extends FormSpecialPage {
-       /** The maximum number of edits a user can have and still be hidden
-        * TODO: config setting? */
-       const HIDEUSER_CONTRIBLIMIT = 1000;
-
        /** @var User user to be blocked, as passed either by parameter (url?wpTarget=Foo)
         * or as subpage (Special:Block/Foo) */
        protected $target;
@@ -602,7 +598,7 @@ class SpecialBlock extends FormSpecialPage {
         * @return Bool|String
         */
        public static function processForm( array $data, IContextSource $context ) {
-               global $wgBlockAllowsUTEdit;
+               global $wgBlockAllowsUTEdit, $wgHideUserContribLimit;
 
                $performer = $context->getUser();
 
@@ -673,10 +669,13 @@ class SpecialBlock extends FormSpecialPage {
                        } elseif ( !in_array( $data['Expiry'], array( 'infinite', 'infinity', 'indefinite' ) ) ) {
                                # Bad expiry.
                                return array( 'ipb_expiry_temp' );
-                       } elseif ( $user->getEditCount() > self::HIDEUSER_CONTRIBLIMIT ) {
+                       } elseif ( $wgHideUserContribLimit !== false
+                               && $user->getEditCount() > $wgHideUserContribLimit
+                       ) {
                                # Typically, the user should have a handful of edits.
                                # Disallow hiding users with many edits for performance.
-                               return array( 'ipb_hide_invalid' );
+                               return array( array( 'ipb_hide_invalid',
+                                       Message::numParam( $wgHideUserContribLimit ) ) );
                        } elseif ( !$data['Confirm'] ) {
                                return array( 'ipb-confirmhideuser', 'ipb-confirmaction' );
                        }
@@ -695,8 +694,9 @@ class SpecialBlock extends FormSpecialPage {
                $block->isAutoblocking( $data['AutoBlock'] );
                $block->mHideName = $data['HideUser'];
 
-               if ( !wfRunHooks( 'BlockIp', array( &$block, &$performer ) ) ) {
-                       return array( 'hookaborted' );
+               $reason = array( 'hookaborted' );
+               if ( !wfRunHooks( 'BlockIp', array( &$block, &$performer, &$reason ) ) ) {
+                       return $reason;
                }
 
                # Try to insert block. Is there a conflicting block?
index 7b6cca0..d19968f 100644 (file)
@@ -188,6 +188,6 @@ class SpecialBookSources extends SpecialPage {
        }
 
        protected function getGroupName() {
-               return 'other';
+               return 'wiki';
        }
 }
index d9ef5d7..e678259 100644 (file)
@@ -232,7 +232,7 @@ class SpecialChangeEmail extends UnlistedSpecialPage {
                $throttleCount = LoginForm::incLoginThrottle( $user->getName() );
                if ( $throttleCount === true ) {
                        $lang = $this->getLanguage();
-                       $this->error( array( 'login-throttled', $lang->formatDuration( $wgPasswordAttemptThrottle['seconds'] ) ) );
+                       $this->error( array( 'changeemail-throttled', $lang->formatDuration( $wgPasswordAttemptThrottle['seconds'] ) ) );
 
                        return false;
                }
index d54828a..484e00c 100644 (file)
@@ -205,7 +205,7 @@ class SpecialChangePassword extends FormSpecialPage {
                $throttleCount = LoginForm::incLoginThrottle( $this->mUserName );
                if ( $throttleCount === true ) {
                        $lang = $this->getLanguage();
-                       throw new PasswordError( $this->msg( 'login-throttled' )
+                       throw new PasswordError( $this->msg( 'changepassword-throttled' )
                                ->params( $lang->formatDuration( $wgPasswordAttemptThrottle['seconds'] ) )
                                ->text()
                        );
diff --git a/includes/specials/SpecialDiff.php b/includes/specials/SpecialDiff.php
new file mode 100644 (file)
index 0000000..bc0d7e3
--- /dev/null
@@ -0,0 +1,61 @@
+<?php
+/**
+ * Redirect from Special:Diff/### to index.php?diff=### and
+ * from Special:Diff/###/### to index.php?oldid=###&diff=###.
+ *
+ * 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 SpecialPage
+ */
+
+/**
+ * Redirect from Special:Diff/### to index.php?diff=### and
+ * from Special:Diff/###/### to index.php?oldid=###&diff=###.
+ *
+ * All of the following are valid usages:
+ * - [[Special:Diff/12345]] (diff of a revision with the previous one)
+ * - [[Special:Diff/12345/prev]] (diff of a revision with the previous one as well)
+ * - [[Special:Diff/12345/next]] (diff of a revision with the next one)
+ * - [[Special:Diff/12345/cur]] (diff of a revision with the latest one of that page)
+ * - [[Special:Diff/12345/98765]] (diff between arbitrary two revisions)
+ *
+ * @ingroup SpecialPage
+ * @since 1.23
+ */
+class SpecialDiff extends RedirectSpecialPage {
+       function __construct() {
+               parent::__construct( 'Diff' );
+               $this->mAllowedRedirectParams = array();
+       }
+
+       function getRedirect( $subpage ) {
+               $parts = explode( '/', $subpage );
+
+               // Try to parse the values given, generating somewhat pretty URLs if possible
+               if ( count( $parts ) === 1 ) {
+                       $this->mAddedRedirectParams['diff'] = $parts[0];
+               } elseif ( count( $parts ) === 2 ) {
+                       $this->mAddedRedirectParams['oldid'] = $parts[0];
+                       $this->mAddedRedirectParams['diff'] = $parts[1];
+               } else {
+                       // Wrong number of parameters, bail out
+                       throw new ErrorPageError( 'nopagetitle', 'nopagetext' );
+               }
+
+               return true;
+       }
+}
index b29b3f9..c054ef7 100644 (file)
@@ -467,7 +467,7 @@ class MovePageForm extends UnlistedSpecialPage {
                $nt = $this->newTitle;
 
                # don't allow moving to pages with # in
-               if ( !$nt || $nt->getFragment() != '' ) {
+               if ( !$nt || $nt->hasFragment() ) {
                        $this->showForm( array( array( 'badtitletext' ) ) );
 
                        return;
index 8a119f5..4f89c00 100644 (file)
  *
  * @ingroup SpecialPage
  */
-class SpecialRecentChanges extends SpecialPage {
-       var $rcOptions, $rcSubpage;
-       protected $customFilters;
-
+class SpecialRecentChanges extends ChangesListSpecialPage {
        /**
         * The feed format to output as (either 'rss' or 'atom'), or null if no
         * feed output was requested
@@ -42,93 +39,6 @@ class SpecialRecentChanges extends SpecialPage {
                parent::__construct( $name, $restriction );
        }
 
-       public function isIncludable() {
-               return true;
-       }
-
-       /**
-        * Get a FormOptions object containing the default options
-        *
-        * @return FormOptions
-        */
-       public function getDefaultOptions() {
-               $opts = new FormOptions();
-               $user = $this->getUser();
-
-               $opts->add( 'days', $user->getIntOption( 'rcdays' ) );
-               $opts->add( 'limit', $user->getIntOption( 'rclimit' ) );
-               $opts->add( 'from', '' );
-
-               $opts->add( 'hideminor', $user->getBoolOption( 'hideminor' ) );
-               $opts->add( 'hidebots', true );
-               $opts->add( 'hideanons', false );
-               $opts->add( 'hideliu', false );
-               $opts->add( 'hidepatrolled', $user->getBoolOption( 'hidepatrolled' ) );
-               $opts->add( 'hidemyself', false );
-
-               $opts->add( 'namespace', '', FormOptions::INTNULL );
-               $opts->add( 'invert', false );
-               $opts->add( 'associated', false );
-
-               $opts->add( 'categories', '' );
-               $opts->add( 'categories_any', false );
-               $opts->add( 'tagfilter', '' );
-
-               return $opts;
-       }
-
-       /**
-        * Create a FormOptions object with options as specified by the user
-        *
-        * @param array $parameters
-        * @return FormOptions
-        */
-       public function setup( $parameters ) {
-               global $wgFeedLimit;
-
-               $opts = $this->getDefaultOptions();
-
-               foreach ( $this->getCustomFilters() as $key => $params ) {
-                       $opts->add( $key, $params['default'] );
-               }
-
-               $opts->fetchValuesFromRequest( $this->getRequest() );
-
-               // Give precedence to subpage syntax
-               if ( $parameters !== null ) {
-                       $this->parseParameters( $parameters, $opts );
-               }
-
-               $opts->validateIntBounds( 'limit', 0, $this->feedFormat ? $wgFeedLimit : 5000 );
-
-               return $opts;
-       }
-
-       /**
-        * Get custom show/hide filters
-        *
-        * @return array Map of filter URL param names to properties (msg/default)
-        */
-       protected function getCustomFilters() {
-               if ( $this->customFilters === null ) {
-                       $this->customFilters = array();
-                       wfRunHooks( 'SpecialRecentChangesFilters', array( $this, &$this->customFilters ) );
-               }
-
-               return $this->customFilters;
-       }
-
-       /**
-        * Get the current FormOptions for this request
-        */
-       public function getOptions() {
-               if ( $this->rcOptions === null ) {
-                       $this->rcOptions = $this->setup( $this->rcSubpage );
-               }
-
-               return $this->rcOptions;
-       }
-
        /**
         * Main execution point
         *
@@ -183,25 +93,48 @@ class SpecialRecentChanges extends SpecialPage {
        }
 
        /**
-        * Return an array with a ChangesFeed object and ChannelFeed object
+        * Get a FormOptions object containing the default options
         *
-        * @param string $feedFormat Feed's format (either 'rss' or 'atom')
-        * @return array
+        * @return FormOptions
         */
-       public function getFeedObject( $feedFormat ) {
-               $changesFeed = new ChangesFeed( $feedFormat, 'rcfeed' );
-               $formatter = $changesFeed->getFeedObject(
-                       $this->msg( 'recentchanges' )->inContentLanguage()->text(),
-                       $this->msg( 'recentchanges-feed-description' )->inContentLanguage()->text(),
-                       $this->getPageTitle()->getFullURL()
-               );
+       public function getDefaultOptions() {
+               $opts = parent::getDefaultOptions();
+               $user = $this->getUser();
 
-               return array( $changesFeed, $formatter );
+               $opts->add( 'days', $user->getIntOption( 'rcdays' ) );
+               $opts->add( 'limit', $user->getIntOption( 'rclimit' ) );
+               $opts->add( 'from', '' );
+
+               $opts->add( 'hideminor', $user->getBoolOption( 'hideminor' ) );
+               $opts->add( 'hidebots', true );
+               $opts->add( 'hideanons', false );
+               $opts->add( 'hideliu', false );
+               $opts->add( 'hidepatrolled', $user->getBoolOption( 'hidepatrolled' ) );
+               $opts->add( 'hidemyself', false );
+
+               $opts->add( 'categories', '' );
+               $opts->add( 'categories_any', false );
+               $opts->add( 'tagfilter', '' );
+
+               return $opts;
+       }
+
+       /**
+        * Get custom show/hide filters
+        *
+        * @return array Map of filter URL param names to properties (msg/default)
+        */
+       protected function getCustomFilters() {
+               if ( $this->customFilters === null ) {
+                       $this->customFilters = array();
+                       wfRunHooks( 'SpecialRecentChangesFilters', array( $this, &$this->customFilters ) );
+               }
+
+               return $this->customFilters;
        }
 
        /**
-        * Process $par and put options found if $opts
-        * Mainly used when including the page
+        * Process $par and put options found in $opts. Used when including the page.
         *
         * @param string $par
         * @param FormOptions $opts
@@ -251,25 +184,9 @@ class SpecialRecentChanges extends SpecialPage {
                }
        }
 
-       /**
-        * Get last modified date, for client caching
-        * Don't use this if we are using the patrol feature, patrol changes don't
-        * update the timestamp
-        *
-        * @param string $feedFormat
-        * @return string|bool
-        */
-       public function checkLastModified( $feedFormat ) {
-               $dbr = wfGetDB( DB_SLAVE );
-               $lastmod = $dbr->selectField( 'recentchanges', 'MAX(rc_timestamp)', false, __METHOD__ );
-               if ( $feedFormat || !$this->getUser()->useRCPatrol() ) {
-                       if ( $lastmod && $this->getOutput()->checkLastModified( $lastmod ) ) {
-                               # Client cache fresh and headers sent, nothing more to do.
-                               return false;
-                       }
-               }
-
-               return $lastmod;
+       public function validateOptions( FormOptions $opts ) {
+               global $wgFeedLimit;
+               $opts->validateIntBounds( 'limit', 0, $this->feedFormat ? $wgFeedLimit : 5000 );
        }
 
        /**
@@ -517,28 +434,6 @@ class SpecialRecentChanges extends SpecialPage {
                }
        }
 
-       /**
-        * Get the query string to append to feed link URLs.
-        *
-        * @return string
-        */
-       public function getFeedQuery() {
-               global $wgFeedLimit;
-
-               $this->getOptions()->validateIntBounds( 'limit', 0, $wgFeedLimit );
-               $options = $this->getOptions()->getChangedValues();
-
-               // wfArrayToCgi() omits options set to null or false
-               foreach ( $options as &$value ) {
-                       if ( $value === false ) {
-                               $value = '0';
-                       }
-               }
-               unset( $value );
-
-               return wfArrayToCgi( $options );
-       }
-
        /**
         * Return the text to be displayed above the changes
         *
@@ -614,6 +509,27 @@ class SpecialRecentChanges extends SpecialPage {
                $this->setBottomText( $opts );
        }
 
+       /**
+        * Send the text to be displayed above the options
+        *
+        * @param FormOptions $opts Unused
+        */
+       function setTopText( FormOptions $opts ) {
+               global $wgContLang;
+
+               $message = $this->msg( 'recentchangestext' )->inContentLanguage();
+               if ( !$message->isDisabled() ) {
+                       $this->getOutput()->addWikiText(
+                               Html::rawElement( 'p',
+                                       array( 'lang' => $wgContLang->getCode(), 'dir' => $wgContLang->getDir() ),
+                                       "\n" . $message->plain() . "\n"
+                               ),
+                               /* $lineStart */ false,
+                               /* $interface */ false
+                       );
+               }
+       }
+
        /**
         * Get options to be displayed in a form
         *
@@ -647,91 +563,72 @@ class SpecialRecentChanges extends SpecialPage {
        }
 
        /**
-        * Return the legend displayed within the fieldset.
-        *
-        * This method is also called from SpecialWatchlist.
+        * Add page-specific modules.
+        */
+       protected function addModules() {
+               parent::addModules();
+               $out = $this->getOutput();
+               $out->addModules( 'mediawiki.special.recentchanges' );
+       }
+
+       /**
+        * Get last modified date, for client caching
+        * Don't use this if we are using the patrol feature, patrol changes don't
+        * update the timestamp
         *
-        * @param $context the object available as $this in non-static functions
-        * @return string
+        * @param string $feedFormat
+        * @return string|bool
         */
-       public static function makeLegend( IContextSource $context ) {
-               global $wgRecentChangesFlags;
-               $user = $context->getUser();
-               # The legend showing what the letters and stuff mean
-               $legend = Xml::openElement( 'dl' ) . "\n";
-               # Iterates through them and gets the messages for both letter and tooltip
-               $legendItems = $wgRecentChangesFlags;
-               if ( !$user->useRCPatrol() ) {
-                       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;
-
-                       $legend .= Xml::element( 'dt',
-                               array( 'class' => $cssClass ), $context->msg( $letter )->text()
-                       ) . "\n";
-                       if ( $key === 'newpage' ) {
-                               $legend .= Xml::openElement( 'dd' );
-                               $legend .= $context->msg( $label )->escaped();
-                               $legend .= ' ' . $context->msg( 'recentchanges-legend-newpage' )->parse();
-                               $legend .= Xml::closeElement( 'dd' ) . "\n";
-                       } else {
-                               $legend .= Xml::element( 'dd', array(),
-                                       $context->msg( $label )->text()
-                               ) . "\n";
+       public function checkLastModified( $feedFormat ) {
+               $dbr = wfGetDB( DB_SLAVE );
+               $lastmod = $dbr->selectField( 'recentchanges', 'MAX(rc_timestamp)', false, __METHOD__ );
+               if ( $feedFormat || !$this->getUser()->useRCPatrol() ) {
+                       if ( $lastmod && $this->getOutput()->checkLastModified( $lastmod ) ) {
+                               # Client cache fresh and headers sent, nothing more to do.
+                               return false;
                        }
                }
-               # (+-123)
-               $legend .= Xml::tags( 'dt',
-                       array( 'class' => 'mw-plusminus-pos' ),
-                       $context->msg( 'recentchanges-legend-plusminus' )->parse()
-               ) . "\n";
-               $legend .= Xml::element(
-                       'dd',
-                       array( 'class' => 'mw-changeslist-legend-plusminus' ),
-                       $context->msg( 'recentchanges-label-plusminus' )->text()
-               ) . "\n";
-               $legend .= Xml::closeElement( 'dl' ) . "\n";
-
-               # Collapsibility
-               $legend =
-                       '<div class="mw-changeslist-legend">' .
-                               $context->msg( 'recentchanges-legend-heading' )->parse() .
-                               '<div class="mw-collapsible-content">' . $legend . '</div>' .
-                       '</div>';
-
-               return $legend;
+
+               return $lastmod;
        }
 
        /**
-        * Send the text to be displayed above the options
+        * Return an array with a ChangesFeed object and ChannelFeed object
         *
-        * @param FormOptions $opts Unused
+        * @param string $feedFormat Feed's format (either 'rss' or 'atom')
+        * @return array
         */
-       function setTopText( FormOptions $opts ) {
-               global $wgContLang;
+       public function getFeedObject( $feedFormat ) {
+               $changesFeed = new ChangesFeed( $feedFormat, 'rcfeed' );
+               $formatter = $changesFeed->getFeedObject(
+                       $this->msg( 'recentchanges' )->inContentLanguage()->text(),
+                       $this->msg( 'recentchanges-feed-description' )->inContentLanguage()->text(),
+                       $this->getPageTitle()->getFullURL()
+               );
 
-               $message = $this->msg( 'recentchangestext' )->inContentLanguage();
-               if ( !$message->isDisabled() ) {
-                       $this->getOutput()->addWikiText(
-                               Html::rawElement( 'p',
-                                       array( 'lang' => $wgContLang->getCode(), 'dir' => $wgContLang->getDir() ),
-                                       "\n" . $message->plain() . "\n"
-                               ),
-                               /* $lineStart */ false,
-                               /* $interface */ false
-                       );
-               }
+               return array( $changesFeed, $formatter );
        }
 
        /**
-        * Send the text to be displayed after the options, for use in subclasses.
+        * Get the query string to append to feed link URLs.
         *
-        * @param FormOptions $opts
+        * @return string
         */
-       function setBottomText( FormOptions $opts ) {
+       public function getFeedQuery() {
+               global $wgFeedLimit;
+
+               $this->getOptions()->validateIntBounds( 'limit', 0, $wgFeedLimit );
+               $options = $this->getOptions()->getChangedValues();
+
+               // wfArrayToCgi() omits options set to null or false
+               foreach ( $options as &$value ) {
+                       if ( $value === false ) {
+                               $value = '0';
+                       }
+               }
+               unset( $value );
+
+               return wfArrayToCgi( $options );
        }
 
        /**
@@ -962,16 +859,7 @@ class SpecialRecentChanges extends SpecialPage {
                return "{$note}$rclinks<br />$rclistfrom";
        }
 
-       /**
-        * Add page-specific modules.
-        */
-       protected function addModules() {
-               $this->getOutput()->addModules( array(
-                       'mediawiki.special.recentchanges',
-               ) );
-       }
-
-       protected function getGroupName() {
-               return 'changes';
+       public function isIncludable() {
+               return true;
        }
 }
index 9a9cd13..7cc8d30 100644 (file)
@@ -44,17 +44,6 @@ class SpecialRecentChangesLinked extends SpecialRecentChanges {
                $opts['target'] = $par;
        }
 
-       public function getFeedObject( $feedFormat ) {
-               $feed = new ChangesFeed( $feedFormat, false );
-               $feedObj = $feed->getFeedObject(
-                       $this->msg( 'recentchangeslinked-title', $this->getTargetTitle()->getPrefixedText() )
-                               ->inContentLanguage()->text(),
-                       $this->msg( 'recentchangeslinked-feed' )->inContentLanguage()->text(),
-                       $this->getPageTitle()->getFullURL()
-               );
-               return array( $feed, $feedObj );
-       }
-
        public function doMainQuery( $conds, $opts ) {
                $target = $opts['target'];
                $showlinkedto = $opts['showlinkedto'];
@@ -219,6 +208,13 @@ class SpecialRecentChangesLinked extends SpecialRecentChanges {
                return $res;
        }
 
+       function setTopText( FormOptions $opts ) {
+               $target = $this->getTargetTitle();
+               if ( $target ) {
+                       $this->getOutput()->addBacklinkSubtitle( $target );
+               }
+       }
+
        /**
         * Get options to be displayed in a form
         *
@@ -238,6 +234,17 @@ class SpecialRecentChangesLinked extends SpecialRecentChanges {
                return $extraOpts;
        }
 
+       public function getFeedObject( $feedFormat ) {
+               $feed = new ChangesFeed( $feedFormat, false );
+               $feedObj = $feed->getFeedObject(
+                       $this->msg( 'recentchangeslinked-title', $this->getTargetTitle()->getPrefixedText() )
+                               ->inContentLanguage()->text(),
+                       $this->msg( 'recentchangeslinked-feed' )->inContentLanguage()->text(),
+                       $this->getPageTitle()->getFullURL()
+               );
+               return array( $feed, $feedObj );
+       }
+
        /**
         * @return Title
         */
@@ -252,11 +259,4 @@ class SpecialRecentChangesLinked extends SpecialRecentChanges {
                }
                return $this->rclTargetTitle;
        }
-
-       function setTopText( FormOptions $opts ) {
-               $target = $this->getTargetTitle();
-               if ( $target ) {
-                       $this->getOutput()->addBacklinkSubtitle( $target );
-               }
-       }
 }
index e4ca057..18e777a 100644 (file)
@@ -120,7 +120,7 @@ class SpecialSearch extends SpecialPage {
         */
        public function load() {
                $request = $this->getRequest();
-               list( $this->limit, $this->offset ) = $request->getLimitOffset( 20 );
+               list( $this->limit, $this->offset ) = $request->getLimitOffset( 20, '', 500 );
                $this->mPrefix = $request->getVal( 'prefix', '' );
 
                $user = $this->getUser();
@@ -687,9 +687,15 @@ class SpecialSearch extends SpecialPage {
                        );
                }
 
+               $fileMatch = '';
                // Include a thumbnail for media files...
                if ( $t->getNamespace() == NS_FILE ) {
-                       $img = wfFindFile( $t );
+                       $img = $result->getFile();
+                       $img = $img ?: wfFindFile( $t );
+                       if ( $result->isFileMatch() ) {
+                               $fileMatch = "<span class='searchalttitle'>" .
+                                       $this->msg( 'search-file-match' )->escaped() . "</span>";
+                       }
                        if ( $img ) {
                                $thumb = $img->transform( array( 'width' => 120, 'height' => 120 ) );
                                if ( $thumb ) {
@@ -705,7 +711,7 @@ class SpecialSearch extends SpecialPage {
                                                $thumb->toHtml( array( 'desc-link' => true ) ) .
                                                '</td>' .
                                                '<td style="vertical-align: top;">' .
-                                               $link .
+                                               "{$link} {$fileMatch}" .
                                                $extract .
                                                "<div class='mw-search-result-data'>{$score}{$desc} - {$date}{$related}</div>" .
                                                '</td>' .
@@ -724,7 +730,7 @@ class SpecialSearch extends SpecialPage {
                        &$score, &$size, &$date, &$related,
                        &$html
                ) ) ) {
-                       $html = "<li><div class='mw-search-result-heading'>{$link} {$redirect} {$section}</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";
                }
index 8e5ef58..eca1839 100644 (file)
@@ -444,12 +444,23 @@ class LoginForm extends SpecialPage {
                $u->setRealName( $this->mRealName );
 
                $abortError = '';
-               if ( !wfRunHooks( 'AbortNewAccount', array( $u, &$abortError ) ) ) {
+               $abortStatus = null;
+               if ( !wfRunHooks( 'AbortNewAccount', array( $u, &$abortError, &$abortStatus ) ) ) {
                        // Hook point to add extra creation throttles and blocks
                        wfDebug( "LoginForm::addNewAccountInternal: a hook blocked creation\n" );
-                       $abortError = new RawMessage( $abortError );
-                       $abortError->text();
-                       return Status::newFatal( $abortError );
+                       if ( $abortStatus === null ) {
+                               // Report back the old string as a raw message status.
+                               // This will report the error back as 'createaccount-hook-aborted'
+                               // with the given string as the message.
+                               // To return a different error code, return a Status object.
+                               $abortError = new Message( 'createaccount-hook-aborted', array( $abortError ) );
+                               $abortError->text();
+                               return Status::newFatal( $abortError );
+                       } else {
+                               // For MediaWiki 1.23+ and updated hooks, return the Status object
+                               // returned from the hook.
+                               return $abortStatus;
+                       }
                }
 
                // Hook point to check for exempt from account creation throttle
index 8d7bd54..e8aa9b4 100644 (file)
@@ -57,9 +57,9 @@ class SpecialVersion extends SpecialPage {
 
                // Explode the sub page information into useful bits
                $parts = explode( '/', (string)$par );
+               $extNode = null;
                if ( isset( $parts[1] ) ) {
                        $extName = str_replace( '_', ' ', $parts[1] );
-                       $extNode = null;
                        // Find it!
                        foreach ( $wgExtensionCredits as $group => $extensions ) {
                                foreach ( $extensions as $ext ) {
index a680bac..c664e31 100644 (file)
@@ -20,9 +20,7 @@
  * @file
  * @ingroup SpecialPage Watchlist
  */
-class SpecialWatchlist extends SpecialRecentChanges {
-       protected $customFilters;
-
+class SpecialWatchlist extends ChangesListSpecialPage {
        /**
         * Constructor
         */
@@ -30,10 +28,6 @@ class SpecialWatchlist extends SpecialRecentChanges {
                parent::__construct( $page, $restriction );
        }
 
-       public function isIncludable() {
-               return false;
-       }
-
        /**
         * Execute
         * @param $par Parameter passed to the page
@@ -43,8 +37,6 @@ class SpecialWatchlist extends SpecialRecentChanges {
 
                $user = $this->getUser();
                $output = $this->getOutput();
-               $output->addModuleStyles( 'mediawiki.special.changeslist' );
-               $output->addModules( 'mediawiki.special.changeslist.js' );
 
                # Anons don't get a watchlist
                $this->requireLogin( 'watchlistanontext' );
@@ -52,26 +44,8 @@ class SpecialWatchlist extends SpecialRecentChanges {
                // Check permissions
                $this->checkPermissions();
 
-               // Add feed links
-               $wlToken = $user->getTokenFromOption( 'watchlisttoken' );
-               if ( $wlToken ) {
-                       $this->addFeedLinks( array(
-                               'action' => 'feedwatchlist',
-                               'allrev' => 1,
-                               'wlowner' => $user->getName(),
-                               'wltoken' => $wlToken,
-                       ) );
-               }
-
-               $this->setHeaders();
-               $this->outputHeader();
-
-               $output->addSubtitle(
-                       $this->msg( 'watchlistfor2', $user->getName() )
-                               ->rawParams( SpecialEditWatchlist::buildTools( null ) )
-               );
-
                $request = $this->getRequest();
+               $opts = $this->getOptions();
 
                $mode = SpecialEditWatchlist::getMode( $request, $par );
                if ( $mode !== false ) {
@@ -85,120 +59,195 @@ class SpecialWatchlist extends SpecialRecentChanges {
                        return;
                }
 
-               $dbr = wfGetDB( DB_SLAVE, 'watchlist' );
+               if ( ( $wgEnotifWatchlist || $wgShowUpdatedMarker ) && $request->getVal( 'reset' ) &&
+                       $request->wasPosted() )
+               {
+                       $user->clearAllNotifications();
+                       $output->redirect( $this->getPageTitle()->getFullURL( $opts->getChangedValues() ) );
+                       return;
+               }
+
+               $this->setHeaders();
+               $this->outputHeader();
+               $this->addModules();
+
+               // Fetch results, prepare a batch link existence check query
+               $conds = $this->buildMainQueryConds( $opts );
+               $rows = $this->doMainQuery( $conds, $opts );
+               $this->numRows = $rows->numRows(); // TODO kill me
+               if ( $rows === false ) {
+                       $this->doHeader( $opts );
 
-               $nitems = $this->countItems( $dbr );
-               if ( $nitems == 0 ) {
-                       $output->addWikiMsg( 'nowatchlist' );
                        return;
                }
 
-               // @todo use FormOptions!
-               $defaults = array(
-               /* float */ 'days' => floatval( $user->getOption( 'watchlistdays' ) ),
-               /* bool  */ 'hideMinor' => (int)$user->getBoolOption( 'watchlisthideminor' ),
-               /* bool  */ 'hideBots' => (int)$user->getBoolOption( 'watchlisthidebots' ),
-               /* bool  */ 'hideAnons' => (int)$user->getBoolOption( 'watchlisthideanons' ),
-               /* bool  */ 'hideLiu' => (int)$user->getBoolOption( 'watchlisthideliu' ),
-               /* bool  */ 'hidePatrolled' => (int)$user->getBoolOption( 'watchlisthidepatrolled' ),
-               /* bool  */ 'hideOwn' => (int)$user->getBoolOption( 'watchlisthideown' ),
-               /* bool  */ 'extended' => (int)$user->getBoolOption( 'extendwatchlist' ),
-               /* ?     */ 'namespace' => '', //means all
-               /* ?     */ 'invert' => false,
-               /* bool  */ 'associated' => false,
-               );
-               $this->customFilters = array();
-               wfRunHooks( 'SpecialWatchlistFilters', array( $this, &$this->customFilters ) );
-               foreach ( $this->customFilters as $key => $params ) {
-                       $defaults[$key] = $params['default'];
-               }
-
-               # Extract variables from the request, falling back to user preferences or
-               # other default values if these don't exist
-               $values = array();
-               $values['days'] = floatval( $request->getVal( 'days', $defaults['days'] ) );
-               $values['hideMinor'] = (int)$request->getBool( 'hideMinor', $defaults['hideMinor'] );
-               $values['hideBots'] = (int)$request->getBool( 'hideBots', $defaults['hideBots'] );
-               $values['hideAnons'] = (int)$request->getBool( 'hideAnons', $defaults['hideAnons'] );
-               $values['hideLiu'] = (int)$request->getBool( 'hideLiu', $defaults['hideLiu'] );
-               $values['hideOwn'] = (int)$request->getBool( 'hideOwn', $defaults['hideOwn'] );
-               $values['hidePatrolled'] = (int)$request->getBool( 'hidePatrolled', $defaults['hidePatrolled'] );
-               $values['extended'] = (int)$request->getBool( 'extended', $defaults['extended'] );
-               foreach ( $this->customFilters as $key => $params ) {
-                       $values[$key] = (int)$request->getBool( $key, $defaults[$key] );
-               }
-
-               # Get namespace value, if supplied, and prepare a WHERE fragment
-               $nameSpace = $request->getIntOrNull( 'namespace' );
-               $invert = $request->getBool( 'invert' );
-               $associated = $request->getBool( 'associated' );
-               if ( !is_null( $nameSpace ) ) {
-                       $eq_op = $invert ? '!=' : '=';
-                       $bool_op = $invert ? 'AND' : 'OR';
-                       $nameSpace = intval( $nameSpace ); // paranioa
-                       if ( !$associated ) {
-                               $nameSpaceClause = "rc_namespace $eq_op $nameSpace";
-                       } else {
-                               $associatedNS = MWNamespace::getAssociated( $nameSpace );
-                               $nameSpaceClause =
-                                       "rc_namespace $eq_op $nameSpace " .
-                                       $bool_op .
-                                       " rc_namespace $eq_op $associatedNS";
+               $feedFormat = $this->getRequest()->getVal( 'feed' );
+               if ( !$feedFormat ) {
+                       $batch = new LinkBatch;
+                       foreach ( $rows as $row ) {
+                               $batch->add( NS_USER, $row->rc_user_text );
+                               $batch->add( NS_USER_TALK, $row->rc_user_text );
+                               $batch->add( $row->rc_namespace, $row->rc_title );
                        }
+                       $batch->execute();
+               }
+               if ( $feedFormat ) {
+                       list( $changesFeed, $formatter ) = $this->getFeedObject( $feedFormat );
+                       /** @var ChangesFeed $changesFeed */
+                       $changesFeed->execute( $formatter, $rows, $lastmod, $opts );
                } else {
-                       $nameSpace = '';
-                       $nameSpaceClause = '';
+                       $this->webOutput( $rows, $opts );
                }
-               $values['namespace'] = $nameSpace;
-               $values['invert'] = $invert;
-               $values['associated'] = $associated;
 
-               // Dump everything here
-               $nondefaults = array();
-               foreach ( $defaults as $name => $defValue ) {
-                       wfAppendToArrayIfNotDefault( $name, $values[$name], $defaults, $nondefaults );
+               $rows->free();
+       }
+
+       /**
+        * Get a FormOptions object containing the default options
+        *
+        * @return FormOptions
+        */
+       public function getDefaultOptions() {
+               $opts = parent::getDefaultOptions();
+               $user = $this->getUser();
+
+               $opts->add( 'days', $user->getOption( 'watchlistdays' ), FormOptions::FLOAT );
+
+               $opts->add( 'hideminor', $user->getBoolOption( 'watchlisthideminor' ) );
+               $opts->add( 'hidebots', $user->getBoolOption( 'watchlisthidebots' ) );
+               $opts->add( 'hideanons', $user->getBoolOption( 'watchlisthideanons' ) );
+               $opts->add( 'hideliu', $user->getBoolOption( 'watchlisthideliu' ) );
+               $opts->add( 'hidepatrolled', $user->getBoolOption( 'watchlisthidepatrolled' ) );
+               $opts->add( 'hidemyself', $user->getBoolOption( 'watchlisthideown' ) );
+
+               $opts->add( 'extended', $user->getBoolOption( 'extendwatchlist' ) );
+
+               return $opts;
+       }
+
+       /**
+        * Get custom show/hide filters
+        *
+        * @return array Map of filter URL param names to properties (msg/default)
+        */
+       protected function getCustomFilters() {
+               if ( $this->customFilters === null ) {
+                       $this->customFilters = array();
+                       wfRunHooks( 'SpecialWatchlistFilters', array( $this, &$this->customFilters ) );
                }
 
-               if ( ( $wgEnotifWatchlist || $wgShowUpdatedMarker ) && $request->getVal( 'reset' )
-                       && $request->wasPosted()
-               ) {
-                       $user->clearAllNotifications();
-                       $output->redirect( $this->getPageTitle()->getFullURL( $nondefaults ) );
-                       return;
+               return $this->customFilters;
+       }
+
+       /**
+        * Fetch values for a FormOptions object from the WebRequest associated with this instance.
+        *
+        * Maps old pre-1.23 request parameters Watchlist used to use (different from Recentchanges' ones)
+        * to the current ones.
+        *
+        * @param FormOptions $parameters
+        * @return FormOptions
+        */
+       protected function fetchOptionsFromRequest( $opts ) {
+               static $compatibilityMap = array(
+                       'hideMinor' => 'hideminor',
+                       'hideBots' => 'hidebots',
+                       'hideAnons' => 'hideanons',
+                       'hideLiu' => 'hideliu',
+                       'hidePatrolled' => 'hidepatrolled',
+                       'hideOwn' => 'hidemyself',
+               );
+
+               $params = $this->getRequest()->getValues();
+               foreach ( $compatibilityMap as $from => $to ) {
+                       if ( isset( $params[$from] ) ) {
+                               $params[$to] = $params[$from];
+                               unset( $params[$from] );
+                       }
                }
 
-               # Possible where conditions
+               // Not the prettiest way to achieve this… FormOptions internally depends on data sanitization
+               // methods defined on WebRequest and removing this dependency would cause some code duplication.
+               $request = new DerivativeRequest( $this->getRequest(), $params );
+               $opts->fetchValuesFromRequest( $request );
+               return $opts;
+       }
+
+       /**
+        * Return an array of conditions depending of options set in $opts
+        *
+        * @param FormOptions $opts
+        * @return array
+        */
+       public function buildMainQueryConds( FormOptions $opts ) {
+               $dbr = wfGetDB( DB_SLAVE, 'watchlist' );
                $conds = array();
+               $user = $this->getUser();
 
-               if ( $values['days'] > 0 ) {
-                       $conds[] = 'rc_timestamp > ' . $dbr->addQuotes( $dbr->timestamp( time() - intval( $values['days'] * 86400 ) ) );
+               // Calculate cutoff
+               if ( $opts['days'] > 0 ) {
+                       $conds[] = 'rc_timestamp > ' . $dbr->addQuotes( $dbr->timestamp( time() - intval( $opts['days'] * 86400 ) ) );
                }
 
                # Toggles
-               if ( $values['hideOwn'] ) {
+               if ( $opts['hidemyself'] ) {
                        $conds[] = 'rc_user != ' . $user->getId();
                }
-               if ( $values['hideBots'] ) {
+               if ( $opts['hidebots'] ) {
                        $conds[] = 'rc_bot = 0';
                }
-               if ( $values['hideMinor'] ) {
+               if ( $opts['hideminor'] ) {
                        $conds[] = 'rc_minor = 0';
                }
-               if ( $values['hideLiu'] ) {
+               if ( $opts['hideliu'] ) {
                        $conds[] = 'rc_user = 0';
                }
-               if ( $values['hideAnons'] ) {
+               if ( $opts['hideanons'] ) {
                        $conds[] = 'rc_user != 0';
                }
-               if ( $user->useRCPatrol() && $values['hidePatrolled'] ) {
+               if ( $user->useRCPatrol() && $opts['hidepatrolled'] ) {
                        $conds[] = 'rc_patrolled != 1';
                }
-               if ( $nameSpaceClause ) {
-                       $conds[] = $nameSpaceClause;
+
+               # Namespace filtering
+               if ( $opts['namespace'] !== '' ) {
+                       $selectedNS = $dbr->addQuotes( $opts['namespace'] );
+                       $operator = $opts['invert'] ? '!=' : '=';
+                       $boolean = $opts['invert'] ? 'AND' : 'OR';
+
+                       # namespace association (bug 2429)
+                       if ( !$opts['associated'] ) {
+                               $condition = "rc_namespace $operator $selectedNS";
+                       } else {
+                               # Also add the associated namespace
+                               $associatedNS = $dbr->addQuotes(
+                                       MWNamespace::getAssociated( $opts['namespace'] )
+                               );
+                               $condition = "(rc_namespace $operator $selectedNS "
+                                       . $boolean
+                                       . " rc_namespace $operator $associatedNS)";
+                       }
+
+                       $conds[] = $condition;
                }
 
+               return $conds;
+       }
+
+       /**
+        * Process the query
+        *
+        * @param array $conds
+        * @param FormOptions $opts
+        * @return bool|ResultWrapper Result or false (for Recentchangeslinked only)
+        */
+       public function doMainQuery( $conds, $opts ) {
+               global $wgShowUpdatedMarker;
+
+               $dbr = wfGetDB( DB_SLAVE, 'watchlist' );
+               $user = $this->getUser();
                # Toggle watchlist content (all recent edits or just the latest)
-               if ( $values['extended'] ) {
+               if ( $opts['extended'] ) {
                        $limitWatchlist = $user->getIntOption( 'wllimit' );
                        $usePage = false;
                } else {
@@ -218,51 +267,6 @@ class SpecialWatchlist extends SpecialRecentChanges {
                        $usePage = true;
                }
 
-               # Show a message about slave lag, if applicable
-               $lag = wfGetLB()->safeGetLag( $dbr );
-               if ( $lag > 0 ) {
-                       $output->showLagWarning( $lag );
-               }
-
-               # Create output
-               $form = '';
-
-               # Show watchlist header
-               $form .= "<p>";
-               $form .= $this->msg( 'watchlist-details' )->numParams( $nitems )->parse() . "\n";
-               if ( $wgEnotifWatchlist && $user->getOption( 'enotifwatchlistpages' ) ) {
-                       $form .= $this->msg( 'wlheader-enotif' )->parse() . "\n";
-               }
-               if ( $wgShowUpdatedMarker ) {
-                       $form .= $this->msg( 'wlheader-showupdated' )->parse() . "\n";
-               }
-               $form .= "</p>";
-
-               if ( $wgShowUpdatedMarker ) {
-                       $form .= Xml::openElement( 'form', array( 'method' => 'post',
-                               'action' => $this->getPageTitle()->getLocalURL(),
-                               'id' => 'mw-watchlist-resetbutton' ) ) . "\n" .
-                       Xml::submitButton( $this->msg( 'enotif_reset' )->text(), array( 'name' => 'dummy' ) ) . "\n" .
-                       Html::hidden( 'reset', 'all' ) . "\n";
-                       foreach ( $nondefaults as $key => $value ) {
-                               $form .= Html::hidden( $key, $value ) . "\n";
-                       }
-                       $form .= Xml::closeElement( 'form' ) . "\n";
-               }
-
-               $form .= Xml::openElement( 'form', array(
-                       'method' => 'post',
-                       'action' => $this->getPageTitle()->getLocalURL(),
-                       'id' => 'mw-watchlist-form'
-               ) );
-               $form .= Xml::fieldset(
-                       $this->msg( 'watchlist-options' )->text(),
-                       false,
-                       array( 'id' => 'mw-watchlist-options' )
-               );
-
-               $form .= SpecialRecentChanges::makeLegend( $this->getContext() );
-
                $tables = array( 'recentchanges', 'watchlist' );
                $fields = RecentChange::selectFields();
                $join_conds = array(
@@ -292,44 +296,160 @@ class SpecialWatchlist extends SpecialRecentChanges {
                        }
                }
 
+               // Log entries with DELETED_ACTION must not show up unless the user has
+               // the necessary rights.
+               if ( !$user->isAllowed( 'deletedhistory' ) ) {
+                       $bitmask = LogPage::DELETED_ACTION;
+               } elseif ( !$user->isAllowed( 'suppressrevision' ) ) {
+                       $bitmask = LogPage::DELETED_ACTION | LogPage::DELETED_RESTRICTED;
+               } else {
+                       $bitmask = 0;
+               }
+               if ( $bitmask ) {
+                       $conds[] = $dbr->makeList( array(
+                               'rc_type != ' . RC_LOG,
+                               $dbr->bitAnd( 'rc_deleted', $bitmask ) . " != $bitmask",
+                       ), LIST_OR );
+               }
+
+
                ChangeTags::modifyDisplayQuery( $tables, $fields, $conds, $join_conds, $options, '' );
-               wfRunHooks( 'SpecialWatchlistQuery', array( &$conds, &$tables, &$join_conds, &$fields, $values ) );
+               wfRunHooks( 'SpecialWatchlistQuery', array( &$conds, &$tables, &$join_conds, &$fields, $opts ) );
 
-               $res = $dbr->select( $tables, $fields, $conds, __METHOD__, $options, $join_conds );
-               $numRows = $res->numRows();
+               return $dbr->select( $tables, $fields, $conds, __METHOD__, $options, $join_conds );
+       }
 
-               /* Start bottom header */
+       /**
+        * Send output to the OutputPage object, only called if not used feeds
+        *
+        * @param array $rows Database rows
+        * @param FormOptions $opts
+        */
+       public function webOutput( $rows, $opts ) {
+               global $wgShowUpdatedMarker, $wgRCShowWatchingUsers;
+
+               $dbr = wfGetDB( DB_SLAVE, 'watchlist' );
+               $user = $this->getUser();
+
+               $dbr->dataSeek( $rows, 0 );
+
+               $list = ChangesList::newFromContext( $this->getContext() );
+               $list->setWatchlistDivs();
+
+               $s = $list->beginRecentChangesList();
+               $counter = 1;
+               foreach ( $rows as $obj ) {
+                       # Make RC entry
+                       $rc = RecentChange::newFromRow( $obj );
+                       $rc->counter = $counter++;
+
+                       if ( $wgShowUpdatedMarker ) {
+                               $updated = $obj->wl_notificationtimestamp;
+                       } else {
+                               $updated = false;
+                       }
+
+                       if ( $wgRCShowWatchingUsers && $user->getOption( 'shownumberswatching' ) ) {
+                               $rc->numberofWatchingusers = $dbr->selectField( 'watchlist',
+                                       'COUNT(*)',
+                                       array(
+                                               'wl_namespace' => $obj->rc_namespace,
+                                               'wl_title' => $obj->rc_title,
+                                       ),
+                                       __METHOD__ );
+                       } else {
+                               $rc->numberofWatchingusers = 0;
+                       }
+
+                       $changeLine = $list->recentChangesLine( $rc, $updated, $counter );
+                       if ( $changeLine !== false ) {
+                               $s .= $changeLine;
+                       }
+               }
+               $s .= $list->endRecentChangesList();
+
+               // Print things out
+
+               $output = $this->getOutput();
+
+               $output->addSubtitle(
+                       $this->msg( 'watchlistfor2', $user->getName() )
+                               ->rawParams( SpecialEditWatchlist::buildTools( null ) )
+               );
+
+               // Output options box
+               $this->doHeader( $opts );
+
+               // Add feed links
+               $wlToken = $user->getTokenFromOption( 'watchlisttoken' );
+               if ( $wlToken ) {
+                       $this->addFeedLinks( array(
+                               'action' => 'feedwatchlist',
+                               'allrev' => 1,
+                               'wlowner' => $user->getName(),
+                               'wltoken' => $wlToken,
+                       ) );
+               }
+
+               # Show a message about slave lag, if applicable
+               $lag = wfGetLB()->safeGetLag( $dbr );
+               if ( $lag > 0 ) {
+                       $output->showLagWarning( $lag );
+               }
+
+               if ( $rows->numRows() == 0 ) {
+                       $output->wrapWikiMsg(
+                               "<div class='mw-changeslist-empty'>\n$1\n</div>", 'recentchanges-noresult'
+                       );
+               } else {
+                       $output->addHTML( $s );
+               }
+       }
+
+       /**
+        * Return the text to be displayed above the changes
+        *
+        * @param FormOptions $opts
+        * @return string XHTML
+        */
+       public function doHeader( $opts ) {
+               global $wgScript;
+
+               $user = $this->getUser();
+
+               $this->setTopText( $opts );
 
                $lang = $this->getLanguage();
                $wlInfo = '';
-               if ( $values['days'] > 0 ) {
+               if ( $opts['days'] > 0 ) {
                        $timestamp = wfTimestampNow();
-                       $wlInfo = $this->msg( 'wlnote' )->numParams( $numRows, round( $values['days'] * 24 ) )->params(
+                       $wlInfo = $this->msg( 'wlnote' )->numParams( $this->numRows, round( $opts['days'] * 24 ) )->params(
                                $lang->userDate( $timestamp, $user ), $lang->userTime( $timestamp, $user ) )->parse() . "<br />\n";
                }
 
-               $cutofflinks = $this->cutoffLinks( $values['days'], $nondefaults ) . "<br />\n";
+               $nondefaults = $opts->getChangedValues();
+               $cutofflinks = $this->cutoffLinks( $opts['days'], $nondefaults ) . "<br />\n";
 
                # Spit out some control panel links
                $filters = array(
-                       'hideMinor' => 'rcshowhideminor',
-                       'hideBots' => 'rcshowhidebots',
-                       'hideAnons' => 'rcshowhideanons',
-                       'hideLiu' => 'rcshowhideliu',
-                       'hideOwn' => 'rcshowhidemine',
-                       'hidePatrolled' => 'rcshowhidepatr'
+                       'hideminor' => 'rcshowhideminor',
+                       'hidebots' => 'rcshowhidebots',
+                       'hideanons' => 'rcshowhideanons',
+                       'hideliu' => 'rcshowhideliu',
+                       'hidemyself' => 'rcshowhidemine',
+                       'hidepatrolled' => 'rcshowhidepatr'
                );
-               foreach ( $this->customFilters as $key => $params ) {
+               foreach ( $this->getCustomFilters() as $key => $params ) {
                        $filters[$key] = $params['msg'];
                }
                // Disable some if needed
                if ( !$user->useNPPatrol() ) {
-                       unset( $filters['hidePatrolled'] );
+                       unset( $filters['hidepatrolled'] );
                }
 
                $links = array();
                foreach ( $filters as $name => $msg ) {
-                       $links[] = $this->showHideLink( $nondefaults, $msg, $name, $values[$name] );
+                       $links[] = $this->showHideLink( $nondefaults, $msg, $name, $opts[$name] );
                }
 
                $hiddenFields = $nondefaults;
@@ -337,6 +457,9 @@ class SpecialWatchlist extends SpecialRecentChanges {
                unset( $hiddenFields['invert'] );
                unset( $hiddenFields['associated'] );
 
+               # Create output
+               $form = '';
+
                # Namespace filter and put the whole form together.
                $form .= $wlInfo;
                $form .= $cutofflinks;
@@ -344,7 +467,7 @@ class SpecialWatchlist extends SpecialRecentChanges {
                $form .= "<hr />\n<p>";
                $form .= Html::namespaceSelector(
                        array(
-                               'selected' => $nameSpace,
+                               'selected' => $opts['namespace'],
                                'all' => '',
                                'label' => $this->msg( 'namespace' )->text()
                        ), array(
@@ -357,14 +480,14 @@ class SpecialWatchlist extends SpecialRecentChanges {
                        $this->msg( 'invert' )->text(),
                        'invert',
                        'nsinvert',
-                       $invert,
+                       $opts['invert'],
                        array( 'title' => $this->msg( 'tooltip-invert' )->text() )
                ) . '&#160;';
                $form .= Xml::checkLabel(
                        $this->msg( 'namespace_association' )->text(),
                        'associated',
-                       'associated',
-                       $associated,
+                       'nsassociated',
+                       $opts['associated'],
                        array( 'title' => $this->msg( 'tooltip-namespace_association' )->text() )
                ) . '&#160;';
                $form .= Xml::submitButton( $this->msg( 'allpagessubmit' )->text() ) . "</p>\n";
@@ -373,68 +496,62 @@ class SpecialWatchlist extends SpecialRecentChanges {
                }
                $form .= Xml::closeElement( 'fieldset' ) . "\n";
                $form .= Xml::closeElement( 'form' ) . "\n";
-               $output->addHTML( $form );
+               $this->getOutput()->addHTML( $form );
 
-               # If there's nothing to show, stop here
-               if ( $numRows == 0 ) {
-                       $output->wrapWikiMsg(
-                               "<div class='mw-changeslist-empty'>\n$1\n</div>", 'recentchanges-noresult'
-                       );
-                       return;
-               }
-
-               /* End bottom header */
-
-               /* Do link batch query */
-               $linkBatch = new LinkBatch;
-               foreach ( $res as $row ) {
-                       $userNameUnderscored = str_replace( ' ', '_', $row->rc_user_text );
-                       if ( $row->rc_user != 0 ) {
-                               $linkBatch->add( NS_USER, $userNameUnderscored );
-                       }
-                       $linkBatch->add( NS_USER_TALK, $userNameUnderscored );
+               $this->setBottomText( $opts );
+       }
 
-                       $linkBatch->add( $row->rc_namespace, $row->rc_title );
-               }
-               $linkBatch->execute();
-               $dbr->dataSeek( $res, 0 );
+       function setTopText( FormOptions $opts ) {
+               global $wgEnotifWatchlist, $wgShowUpdatedMarker;
 
-               $list = ChangesList::newFromContext( $this->getContext() );
-               $list->setWatchlistDivs();
+               $nondefaults = $opts->getChangedValues();
+               $form = "";
+               $user = $this->getUser();
 
-               $s = $list->beginRecentChangesList();
-               $counter = 1;
-               foreach ( $res as $obj ) {
-                       # Make RC entry
-                       $rc = RecentChange::newFromRow( $obj );
-                       $rc->counter = $counter++;
+               $dbr = wfGetDB( DB_SLAVE, 'watchlist' );
+               $numItems = $this->countItems( $dbr );
 
-                       if ( $wgShowUpdatedMarker ) {
-                               $updated = $obj->wl_notificationtimestamp;
-                       } else {
-                               $updated = false;
+               // Show watchlist header
+               $form .= "<p>";
+               if ( $numItems == 0 ) {
+                       $form .= $this->msg( 'nowatchlist' )->parse() . "\n";
+               } else {
+                       $form .= $this->msg( 'watchlist-details' )->numParams( $numItems )->parse() . "\n";
+                       if ( $wgEnotifWatchlist && $user->getOption( 'enotifwatchlistpages' ) ) {
+                               $form .= $this->msg( 'wlheader-enotif' )->parse() . "\n";
                        }
-
-                       if ( $wgRCShowWatchingUsers && $user->getOption( 'shownumberswatching' ) ) {
-                               $rc->numberofWatchingusers = $dbr->selectField( 'watchlist',
-                                       'COUNT(*)',
-                                       array(
-                                               'wl_namespace' => $obj->rc_namespace,
-                                               'wl_title' => $obj->rc_title,
-                                       ),
-                                       __METHOD__ );
-                       } else {
-                               $rc->numberofWatchingusers = 0;
+                       if ( $wgShowUpdatedMarker ) {
+                               $form .= $this->msg( 'wlheader-showupdated' )->parse() . "\n";
                        }
+               }
+               $form .= "</p>";
 
-                       $changeLine = $list->recentChangesLine( $rc, $updated, $counter );
-                       if ( $changeLine !== false ) {
-                               $s .= $changeLine;
+               if ( $numItems > 0 && $wgShowUpdatedMarker ) {
+                       $form .= Xml::openElement( 'form', array( 'method' => 'post',
+                               'action' => $this->getPageTitle()->getLocalURL(),
+                               'id' => 'mw-watchlist-resetbutton' ) ) . "\n" .
+                       Xml::submitButton( $this->msg( 'enotif_reset' )->text(), array( 'name' => 'dummy' ) ) . "\n" .
+                       Html::hidden( 'reset', 'all' ) . "\n";
+                       foreach ( $nondefaults as $key => $value ) {
+                               $form .= Html::hidden( $key, $value ) . "\n";
                        }
+                       $form .= Xml::closeElement( 'form' ) . "\n";
                }
-               $s .= $list->endRecentChangesList();
 
-               $output->addHTML( $s );
+               $form .= Xml::openElement( 'form', array(
+                       'method' => 'post',
+                       'action' => $this->getPageTitle()->getLocalURL(),
+                       'id' => 'mw-watchlist-form'
+               ) );
+               $form .= Xml::fieldset(
+                       $this->msg( 'watchlist-options' )->text(),
+                       false,
+                       array( 'id' => 'mw-watchlist-options' )
+               );
+
+               $form .= SpecialRecentChanges::makeLegend( $this->getContext() );
+
+               $this->getOutput()->addHTML( $form );
        }
 
        protected function showHideLink( $options, $message, $name, $value ) {
@@ -499,9 +616,9 @@ class SpecialWatchlist extends SpecialRecentChanges {
         */
        protected function countItems( $dbr ) {
                # Fetch the raw count
-               $res = $dbr->select( 'watchlist', array( 'count' => 'COUNT(*)' ),
+               $rows = $dbr->select( 'watchlist', array( 'count' => 'COUNT(*)' ),
                        array( 'wl_user' => $this->getUser()->getId() ), __METHOD__ );
-               $row = $dbr->fetchObject( $res );
+               $row = $dbr->fetchObject( $rows );
                $count = $row->count;
 
                return floor( $count / 2 );
index 4c8148a..67bffc3 100644 (file)
@@ -474,9 +474,10 @@ abstract class UploadBase {
                                return array( 'uploadscripted' );
                        }
                        if ( $this->mFinalExtension == 'svg' || $mime == 'image/svg+xml' ) {
-                               if ( $this->detectScriptInSvg( $this->mTempPath ) ) {
+                               $svgStatus = $this->detectScriptInSvg( $this->mTempPath );
+                               if ( $svgStatus !== false ) {
                                        wfProfileOut( __METHOD__ );
-                                       return array( 'uploadscripted' );
+                                       return $svgStatus;
                                }
                        }
                }
@@ -1164,11 +1165,36 @@ abstract class UploadBase {
 
        /**
         * @param $filename string
-        * @return bool
+        * @return mixed false of the file is verified (does not contain scripts), array otherwise.
         */
        protected function detectScriptInSvg( $filename ) {
-               $check = new XmlTypeCheck( $filename, array( $this, 'checkSvgScriptCallback' ) );
-               return $check->filterMatch;
+               $check = new XmlTypeCheck(
+                       $filename,
+                       array( $this, 'checkSvgScriptCallback' ),
+                       true,
+                       array( 'processing_instruction_handler' => 'UploadBase::checkSvgPICallback' )
+               );
+               if ( $check->wellFormed !== true ) {
+                       // Invalid xml (bug 58553)
+                       return array( 'uploadinvalidxml' );
+               } elseif ( $check->filterMatch ) {
+                       return array( 'uploadscripted' );
+               }
+               return false;
+       }
+
+       /**
+        * Callback to filter SVG Processing Instructions.
+        * @param $target string processing instruction name
+        * @param $data string processing instruction attribute and value
+        * @return bool (true if the filter identified something bad)
+        */
+       public static function checkSvgPICallback( $target, $data ) {
+               // Don't allow external stylesheets (bug 57550)
+               if ( preg_match( '/xml-stylesheet/i', $target) ) {
+                       return true;
+               }
+               return false;
        }
 
        /**
index a222f81..802cdbc 100644 (file)
@@ -1,5 +1,28 @@
 <?php
+/**
+ * Methods to play with arrays.
+ *
+ * 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
+ */
 
+/**
+ * A collection of static methods to play with arrays.
+ */
 class ArrayUtils {
        /**
         * Sort the given array in a pseudo-random order which depends only on the
@@ -66,4 +89,92 @@ class ArrayUtils {
 
                return $i;
        }
+
+       /**
+        * Do a binary search, and return the index of the largest item that sorts
+        * less than or equal to the target value.
+        *
+        * @param array $valueCallback A function to call to get the value with
+        *     a given array index.
+        * @param $valueCount int The number of items accessible via $valueCallback,
+        *     indexed from 0 to $valueCount - 1
+        * @param $comparisonCallback array A callback to compare two values, returning
+        *     -1, 0 or 1 in the style of strcmp().
+        * @param $target string The target value to find.
+        *
+        * @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 ) {
+               if ( $valueCount === 0 ) {
+                       return false;
+               }
+
+               $min = 0;
+               $max = $valueCount;
+               do {
+                       $mid = $min + ( ( $max - $min ) >> 1 );
+                       $item = call_user_func( $valueCallback, $mid );
+                       $comparison = call_user_func( $comparisonCallback, $target, $item );
+                       if ( $comparison > 0 ) {
+                               $min = $mid;
+                       } elseif ( $comparison == 0 ) {
+                               $min = $mid;
+                               break;
+                       } else {
+                               $max = $mid;
+                       }
+               } while ( $min < $max - 1 );
+
+               if ( $min == 0 ) {
+                       $item = call_user_func( $valueCallback, $min );
+                       $comparison = call_user_func( $comparisonCallback, $target, $item );
+                       if ( $comparison < 0 ) {
+                               // Before the first item
+                               return false;
+                       }
+               }
+               return $min;
+       }
+
+       /**
+        * Do array_diff_assoc() on multi-dimensional arrays.
+        *
+        * Note: empty arrays are removed.
+        *
+        * @param $array1 array The array to compare from
+        * @param $array2 array An array to compare against
+        * @param ... array More arrays to compare against
+        * @return array An array containing all the values from array1
+        *               that are not present in any of the other arrays.
+        */
+       public static function arrayDiffAssocRecursive( $array1 ) {
+               $arrays = func_get_args();
+               array_shift( $arrays );
+               $ret = array();
+
+               foreach ( $array1 as $key => $value ) {
+                       if ( is_array( $value ) ) {
+                               $args = array( $value );
+                               foreach ( $arrays as $array ) {
+                                       if ( isset( $array[$key] ) ) {
+                                               $args[] = $array[$key];
+                                       }
+                               }
+                               $valueret = call_user_func_array( __METHOD__, $args );
+                               if ( count( $valueret ) ) {
+                                       $ret[$key] = $valueret;
+                               }
+                       } else {
+                               foreach ( $arrays as $array ) {
+                                       if ( isset( $array[$key] ) && $array[$key] === $value ) {
+                                               continue 2;
+                                       }
+                               }
+                               $ret[$key] = $value;
+                       }
+               }
+
+               return $ret;
+       }
 }
index 2686e11..871f71b 100644 (file)
@@ -489,6 +489,8 @@ class IP {
                if ( self::isIPv6( $ip ) ) {
                        $n = self::toUnsigned6( $ip );
                } else {
+                       // Bug 60035: an IP with leading 0's fails in ip2long sometimes (e.g. *.08)
+                       $ip = preg_replace( '/(?<=\.)0+(?=[1-9])/', '', $ip );
                        $n = ip2long( $ip );
                        if ( $n < 0 ) {
                                $n += pow( 2, 32 );
index 331f3ae..d80a2bd 100644 (file)
@@ -9,6 +9,7 @@
  *
  * @author Abanima
  * @author Csisc
+ * @author Malekbr
  */
 
 $fallback = 'ar';
@@ -27,7 +28,6 @@ $messages = array(
 'tog-numberheadings' => 'رقم العناوين تلقائيا',
 'tog-showtoolbar' => 'أظهر شريط التحرير (يتطلب جافاسكربت)',
 'tog-editondblclick' => 'عدل الصفحات عند الضغط المزدوج (جافاسكربت)',
-'tog-editsection' => 'مكن تعديل الأقسام عن طريق وصلات [عدل]',
 'tog-editsectiononrightclick' => 'فعل تعديل الأقسام بواسطة كبسة الفأرة اليمين على عناوين الأقسام (جافاسكريبت)',
 'tog-showtoc' => 'اعرض فهرس المحتويات (للصفحات التي تحتوي على أكثر من 3 عناوين)',
 'tog-rememberpassword' => 'تذكر دخولي على هذا المتصفح (إلى {{PLURAL:$1||يوم واحد|يومين|$1 أيام|$1 يومًا|$1 يوم}} كحد أقصى)',
@@ -84,50 +84,50 @@ $messages = array(
 'thu' => 'el5mis',
 'fri' => 'ejjom3a',
 'sat' => 'essibt',
-'january' => 'janfi',
-'february' => 'fivri',
-'march' => 'mars',
-'april' => 'avril',
-'may_long' => 'mai',
-'june' => 'juin',
-'july' => 'juillia',
-'august' => 'août',
-'september' => 'septembre',
-'october' => 'octobre',
-'november' => 'novembre',
-'december' => 'décembre',
-'january-gen' => 'janfi',
-'february-gen' => 'fivri',
-'march-gen' => 'mars',
-'april-gen' => 'avril',
-'may-gen' => 'mai',
-'june-gen' => 'juin',
-'july-gen' => 'juillia',
-'august-gen' => 'août',
-'september-gen' => 'septembre',
-'october-gen' => 'octobre',
-'november-gen' => 'novembre',
-'december-gen' => 'décembre',
-'jan' => 'Janvi',
-'feb' => 'fivri',
-'mar' => 'mars',
-'apr' => 'avril',
-'may' => 'mai',
+'january' => 'Janvi',
+'february' => 'Fivri',
+'march' => 'Mars',
+'april' => 'Avril',
+'may_long' => 'Mai',
+'june' => 'Juin',
+'july' => 'Juilia',
+'august' => 'Août',
+'september' => 'Septembre',
+'october' => 'Octobre',
+'november' => 'Novembre',
+'december' => 'Décembre',
+'january-gen' => 'Janvi',
+'february-gen' => 'Fivri',
+'march-gen' => 'Mars',
+'april-gen' => 'Avril',
+'may-gen' => 'Mai',
+'june-gen' => 'Juin',
+'july-gen' => 'Juilia',
+'august-gen' => 'Août',
+'september-gen' => 'Septembre',
+'october-gen' => 'Octobre',
+'november-gen' => 'Novembre',
+'december-gen' => 'Décembre',
+'jan' => 'Janv',
+'feb' => 'Fivr',
+'mar' => 'Mars',
+'apr' => 'Avrl',
+'may' => 'Mai',
 'jun' => 'Juin',
-'jul' => 'juillia',
-'aug' => 'août',
-'sep' => 'septembre',
-'oct' => 'octobre',
-'nov' => 'novembre',
-'dec' => 'décembre',
+'jul' => 'Juil',
+'aug' => 'Août',
+'sep' => 'Sept',
+'oct' => 'Oct',
+'nov' => 'Nov',
+'dec' => 'Déc',
 
 # Categories related messages
-'pagecategories' => '{{PLURAL:$1|لا تصنيف|تصنيف|تصنيفان|تصنيفات}}',
+'pagecategories' => '{{PLURAL:Catégorie weħed|Zouz catégories|$1 catégories|$1 en catégorie}}',
 'category_header' => 'صفحات تصنيف "$1"',
 'subcategories' => 'التصنيفات الفرعية',
 'category-media-header' => 'الوسائط في التصنيف "$1"',
 'category-empty' => "''هذا التصنيف لا يحتوي حاليا على صفحات أو وسائط.''",
-'hidden-categories' => '{{PLURAL:$1|لا تصنيف مخفيا|تصنيف مخفي|تصنيفان مخفيان|تصنيفات مخفية}}',
+'hidden-categories' => '{{PLURAL:Catégorie mkhabia waħda|Zouz catégories mkhabbin|$1 catégories mkhabbin|$1 en catégorie mkhabia}}',
 'hidden-category-category' => 'تصنيفات مخفية',
 'category-subcat-count' => '{{PLURAL:$2|لا تصانيف فرعية في هذا التصنيف|هذا التصنيف فيه التصنيف الفرعي التالي فقط.|هذا التصنيف فيه {{PLURAL:$1||هذا التصنيف الفرعي|هذين التصنيفين الفرعيين|هذه ال$1 تصانيف الفرعية|هذه ال$1 تصنيفا فرعيا|هذه ال$1 تصنيف فرعي}}، من إجمالي $2.}}',
 'category-subcat-count-limited' => 'هذا التصنيف فيه {{PLURAL:$1||التصنيف الفرعي التالي|التصنيفين الفرعيين التاليين|$1 تصانيف فرعية تالية|$1 تصنيفا فرعيا تاليا|$1 تصنيف فرعي تالي}}.',
@@ -148,7 +148,7 @@ $messages = array(
 'mypage' => 'صفحتي',
 'mytalk' => 'نقاشي',
 'anontalk' => 'النقاش لعنوان الأيبي هذا',
-'navigation' => 'إبحار',
+'navigation' => 'Navigui',
 'and' => '&#32;و',
 
 # Cologne Blue skin
@@ -169,30 +169,30 @@ $messages = array(
 'vector-action-unprotect' => 'غير الحماية',
 'vector-simplesearch-preference' => 'مكّن مقترحات البحث المُحسّنة (لواجهة فكتور فقط)',
 'vector-view-create' => 'أنشئ',
-'vector-view-edit' => 'modifi el page (baddelha)',
-'vector-view-history' => 'اعرض التاريخ',
-'vector-view-view' => 'اقرأ',
+'vector-view-edit' => 'Baddel',
+'vector-view-history' => "Warri l'historique",
+'vector-view-view' => 'Aqra',
 'vector-view-viewsource' => 'اعرض المصدر',
-'actions' => 'أفعال',
-'namespaces' => 'النطاقات',
-'variants' => 'المتغيرات',
+'actions' => 'Aεmel',
+'namespaces' => 'El espaces de noms',
+'variants' => 'Anweε',
 
 'errorpagetitle' => 'ghalath',
 'returnto' => 'ارجع إلى $1.',
-'tagline' => 'عن {{SITENAME}}',
-'help' => '3awenni ya3chek',
-'search' => 'lawwej',
-'searchbutton' => 'lawwej',
+'tagline' => 'Fima ykhoss {{SITENAME}}',
+'help' => 'Mouεawna',
+'search' => 'Lawwej',
+'searchbutton' => 'Lawwej',
 'go' => 'اذهب',
 'searcharticle' => 'اذهب',
 'history' => 'teri5 el milaf',
-'history_short' => 'تاريخ',
+'history_short' => 'Historique',
 'updatedmarker' => 'تم تحديثها منذ زيارتي الأخيرة',
-'printableversion' => 'نسخة للطباعة',
-'permalink' => 'وصلة دائمة',
+'printableversion' => 'Copie bech tetetbaε',
+'permalink' => 'Lien deyem',
 'print' => 'itthba3',
 'view' => 'عرض',
-'edit' => 'modifi el page (baddelha)',
+'edit' => 'Baddel',
 'create' => 'أنشئ',
 'editthispage' => 'modifi hal page',
 'create-this-page' => 'أنشئ هذه الصفحة',
@@ -207,14 +207,14 @@ $messages = array(
 'unprotectthispage' => 'غير حماية هذه الصفحة',
 'newpage' => 'صفحات جديدة',
 'talkpage' => 'ناقش هذه الصفحة',
-'talkpagelinktext' => 'نقاش',
+'talkpagelinktext' => 'Ħdith',
 'specialpage' => 'صفحة خاصة',
-'personaltools' => 'أدوات شخصية',
+'personaltools' => 'Outils mteεek',
 'postcomment' => 'قسم جديد',
 'articlepage' => 'عرض صفحة المحتوى',
-'talk' => 'نقاش',
-'views' => 'معاينة',
-'toolbox' => 'صندوق الأدوات',
+'talk' => 'Ħdith',
+'views' => 'Affichages',
+'toolbox' => 'Outils',
 'userpage' => 'عرض صفحة المستخدم',
 'projectpage' => 'عرض صفحة المشروع',
 'imagepage' => 'عرض صفحة الملف',
@@ -223,15 +223,15 @@ $messages = array(
 'viewhelppage' => 'عرض صفحة المساعدة',
 'categorypage' => 'عرض صفحة التصنيف',
 'viewtalkpage' => 'عرض النقاش',
-'otherlanguages' => 'بلغات أخرى',
+'otherlanguages' => 'Bloughat okhra',
 'redirectedfrom' => '(تم التحويل من $1)',
 'redirectpagesub' => 'صفحة تحويل',
-'lastmodifiedat' => 'آخر تعديل لهذه الصفحة في $2، $1.',
+'lastmodifiedat' => 'Ekher tabdil elhassafħa nhar $2, mεa $1.',
 'viewcount' => '{{PLURAL:$1|لم تعرض هذه الصفحة أبدا|تم عرض هذه الصفحة مرة واحدة|تم عرض هذه الصفحة مرتين|تم عرض هذه الصفحة $1 مرات|تم عرض هذه الصفحة $1 مرة}}.',
 'protectedpage' => 'صفحة محمية',
-'jumpto' => 'اذهب إلى:',
-'jumptonavigation' => 'إبحار',
-'jumptosearch' => 'lawwej',
+'jumpto' => 'Emchi el:',
+'jumptonavigation' => 'Navigation',
+'jumptosearch' => 'Lawwej',
 'view-pool-error' => 'عذرا، الخوادم منهكة حاليا.
 يحاول مستخدمون كثر الوصول إلى هذه الصفحة.
 من فضلك انتظر قليلا قبل أن تحاول الوصول إلى هذه الصفحة مجددا.
@@ -242,23 +242,23 @@ $1',
 'pool-errorunknown' => 'خطأ غير معروف',
 
 # 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).
-'aboutsite' => 'عن {{SITENAME}}',
-'aboutpage' => 'Project:عن',
+'aboutsite' => 'Fima ykhoss {{SITENAME}}',
+'aboutpage' => 'Project:Fima ykhoss',
 'copyright' => 'المحتوى متوفر تحت $1.',
 'copyrightpage' => '{{ns:project}}:حقوق النسخ',
-'currentevents' => 'الأحداث الجارية',
-'currentevents-url' => 'Project:الأحداث الجارية',
-'disclaimers' => 'عدم مسؤولية',
-'disclaimerpage' => 'Project:عدم مسؤولية عام',
+'currentevents' => 'Laħdeth mtaε tawa',
+'currentevents-url' => 'Project:Laħdeth mtaε tawa',
+'disclaimers' => "Ɛadam mas'ouliya",
+'disclaimerpage' => "Project:Ɛadam mas'ouliya bsifa εamma",
 'edithelp' => 'مساعدة التحرير',
-'helppage' => 'Help:محتويات',
-'mainpage' => 'الصفحة الرئيسية',
-'mainpage-description' => 'الصفحة الرئيسية',
+'helppage' => 'Help:Contenu',
+'mainpage' => 'Elpage principale',
+'mainpage-description' => 'Elpage principale',
 'policy-url' => 'Project:سياسة',
-'portal' => 'بوابة المجتمع',
-'portal-url' => 'Project:بوابة المجتمع',
-'privacy' => 'سÙ\8aاسة Ø§Ù\84خصÙ\88صÙ\8aØ©',
-'privacypage' => 'Project:سÙ\8aاسة Ø§Ù\84خصÙ\88صÙ\8aØ©',
+'portal' => 'Mojtamaε',
+'portal-url' => 'Project:Mojtamaε',
+'privacy' => 'Syeset elconfidentialité',
+'privacypage' => 'Project:Syeset elconfidentialité',
 
 'badaccess' => 'خطأ في السماح',
 'badaccess-group0' => 'ليس من المسموح لك تنفيذ الفعل الذي طلبته.',
@@ -268,16 +268,16 @@ $1',
 'versionrequiredtext' => 'تلزم النسخة $1 من ميدياويكي لاستعمال هذه الصفحة. انظر [[Special:Version|صفحة النسخة]]',
 
 'ok' => 'ok',
-'retrievedfrom' => 'تم الاسترجاع من "$1"',
+'retrievedfrom' => 'Tekhdhet men "$1"',
 'youhavenewmessages' => 'توجد لديك $1 ($2).',
 'youhavenewmessagesmulti' => 'لديك رسائل جديدة على $1',
-'editsection' => 'modifi el page (baddelha)',
-'editold' => 'modifi el page (baddelha)',
+'editsection' => 'Baddel essafħa',
+'editold' => 'Baddel',
 'viewsourceold' => 'اعرض المصدر',
 'editlink' => 'modifi el page (baddelha)',
-'viewsourcelink' => 'اعرض المصدر',
-'editsectionhint' => 'حرر القسم: $1',
-'toc' => 'ta3li9at',
+'viewsourcelink' => 'Warri essource',
+'editsectionhint' => 'Baddel essection: $1',
+'toc' => 'Contenu',
 'showtoc' => 'اعرض',
 'hidetoc' => 'أخف',
 'collapsible-collapse' => 'اطو',
@@ -289,20 +289,20 @@ $1',
 'feed-invalid' => 'نوع اشتراك التلقيم غير صحيح.',
 'feed-unavailable' => 'التلقيمات غير متوفرة',
 'site-rss-feed' => '$1 تلقيم أر إس إس',
-'site-atom-feed' => '$1 تلقيم أتوم',
+'site-atom-feed' => 'Flux Atom mtaε $1',
 'page-rss-feed' => '"$1" تلقيم أر إس إس',
 'page-atom-feed' => '$1 تلقيم أتوم',
-'red-link-title' => '$1 (الصفحة غير موجودة)',
+'red-link-title' => '$1 (Essafħa mouch mawjouda)',
 'sort-descending' => 'ترتيب تنازلي',
 'sort-ascending' => 'ترتيب تصاعدي',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main' => "ss'af7a",
+'nstab-main' => 'Safħa',
 'nstab-user' => 'صفحة مستخدم',
 'nstab-media' => 'صفحة وسيط',
-'nstab-special' => 'صفحة خاصة',
+'nstab-special' => 'Safħa spéciale',
 'nstab-project' => 'صفحة مشروع',
-'nstab-image' => 'milaf (Fichier)',
+'nstab-image' => 'Fichier',
 'nstab-mediawiki' => 'رسالة',
 'nstab-template' => 'قالب',
 'nstab-help' => 'صفحة مساعدة',
@@ -327,12 +327,12 @@ $1',
 'readonlytext' => 'قاعدة البيانات مغلقة حاليا أمام المدخلات الجديدة والتعديلات الأخرى، السبب غالبا ما يكون الصيانة، وستعود قاعدة البيانات للوضع الطبيعي قريبا.
 
 الإداري الذي أغلق قاعدة البيانات أعطى التفسير التالي: $1',
-'missing-article' => 'لم تجد قاعدة البيانات النص الخاص بصفحة كان يجب أن تجدها، واسمها "$1" $2.
+'missing-article' => 'Elbase de données malqatech ettexte mtaε essafħa elli supposée talqaha, welli esmha "$1" $2.
 
-عادة ما يحدث هذا عند اتباع فرق قديم أو وصلة تاريخ تؤدي إلى صفحة حذفت.
+Hedha elli ysir elεada waqtelli tħel farq qdim walla lien mtaε l\'historique mtaε safħa tnaħħat.
 
-إذا لم تكن هذه هي الحالة، فالمحتمل أنك وجدت خللا في البرنامج.
-من فضلك أبلغ أحد [[Special:ListUsers/sysop|الإداريين]]، وأعطه وصلة إلى مسار هذه الصفحة.',
+Idha ken mouch hedheka li sar, rak momken lqit mochkla fel programme.
+Aman qoul elweħeb mel les [[Special:ListUsers/sysop|administrateurs]], waεtih ellien elli ħabit temchilou.',
 'missingarticle-rev' => '(رقم المراجعة: $1)',
 'missingarticle-diff' => '(فرق: $1، $2)',
 'readonly_lag' => 'تم إغلاق قاعدة البيانات تلقائيا حتى تستطيع الخواديم التابعة ملاحقة الخادوم الرئيسي',
@@ -406,7 +406,7 @@ $2',
 'yourdomainname' => 'نطاقك:',
 'externaldberror' => 'هناك إما خطأ في دخول قاعدة البيانات الخارجية أو أنه غير مسموح لك بتحديث حسابك الخارجي.',
 'login' => 'ادخل',
-'nav-login-createaccount' => 'ادخل / أنشئ حسابا',
+'nav-login-createaccount' => 'Connecti / aεmel compte',
 'loginprompt' => 'يجب أن تكون الكوكيز لديك مفعلة لتسجل الدخول إلى {{SITENAME}}.',
 'userlogin' => 'ادخل / أنشئ حسابا',
 'userloginnocreate' => 'دخول',
@@ -646,10 +646,9 @@ $2
 لذا فيجب علينا استعمال رقم الأيبي للتعرف عليه/عليها.
 مثل هذا العنوان يمكن أن يشترك فيه عدة مستخدمين.
 لو كنت مستخدما مجهولا وتشعر بأن تعليقات لا تخصك تم توجيهها إليك، من فضلك [[Special:UserLogin/signup|أنشئ حسابا]] أو [[Special:UserLogin|سجل الدخول]] لتجنب الارتباك المستقبلي مع مستخدمين مجهولين آخرين.''",
-'noarticletext' => 'لا يوجد حاليا أي نص في هذه الصفحة.
-يمكنك [[Special:Search/{{PAGENAME}}|البحث عن عنوان هذه الصفحة]] في الصفحات الأخرى،
-<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} البحث في السجلات المتعلقة]،
-أو [{{fullurl:{{FULLPAGENAME}}|action=edit}} تعديل هذه الصفحة]</span>.',
+'noarticletext' => 'Mafamma ħatta texte tawa f\'essafħa hedhi.
+Tnajjem [[Special:Search/{{PAGENAME}}|tfarkes εal titre mtaε essafħa]] fi safħat okhrine, <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} tfarkes f\'elhistoriques elli εandhom εaleqa], 
+walla [{{fullurl:{{FULLPAGENAME}}|action=edit}} tbaddel essafħa hedhi]</span>',
 'noarticletext-nopermission' => 'لا يوجد حاليا أي نص في هذه الصفحة.يمكنك [[Special:Search/{{PAGENAME}}|البحث عن عنوان هذه الصفحة]] في الصفحات الأخرى,أو <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} بحث السجلات المتصلة]</span>.',
 'userpage-userdoesnotexist' => 'حساب المستخدم "<nowiki>$1</nowiki>" غير مسجل.
 من فضلك تأكد أنك تريد إنشاء/تعديل هذه الصفحة.',
@@ -734,7 +733,7 @@ $2
 'templatesused' => '{{PLURAL:$1||القالب المستخدم|القالبان المستخدمان|القوالب المستخدمة}} في هذه الصفحة:',
 'templatesusedpreview' => '{{PLURAL:$1||القالب المستخدم|القالبان المستخدمان|القوالب المستخدمة}} في هذه المعاينة:',
 'templatesusedsection' => '{{PLURAL:$1||القالب المستخدم|القالبان المستخدمان|القوالب المستخدمة}} في هذا القسم:',
-'template-protected' => '(Ø­Ù\85اÙ\8aØ© Ù\83اÙ\85Ù\84Ø©)',
+'template-protected' => '(protégé)',
 'template-semiprotected' => '(حماية جزئية)',
 'hiddencategories' => '{{PLURAL:$1|هذه الصفحة غير موجودة في أي تصنايف مخفية|هذه الصفحة موجودة في تصنيف مخفي واحد|هذه الصفحة موجودة في تصنيفين مخفيين|هذه الصفحة موجودة في $1 تصانيف مخفية|هذه الصفحة موجودة في $1 تصنيفا مخفيا|هذه الصفحة موجودة في $1 تصنيف مخفي}}:',
 'nocreatetext' => 'قام {{SITENAME}} بتحديد القدرة على إنشاء صفحات جديدة.
@@ -801,7 +800,7 @@ $2
 'nohistory' => 'لا يوجد تاريخ للتعديلات لهذه الصفحة.',
 'currentrev' => 'المراجعة الحالية',
 'currentrev-asof' => 'المراجعة الحالية بتاريخ $1',
-'revisionasof' => 'مراجعة $1',
+'revisionasof' => 'Version mtaε $1',
 'revision-info' => 'مراجعة $1 بواسطة $2',
 'previousrevision' => '→ مراجعة أقدم',
 'nextrevision' => 'مراجعة أحدث ←',
@@ -960,41 +959,41 @@ $1",
 'difference-title' => '«$1»: الفرق بين المراجعتين',
 'difference-title-multipage' => '«$1» و«$2»: الفرق بين الصفحتين',
 'difference-multipage' => '(الفرق بين الصفحتين)',
-'lineno' => 'سطر $1:',
+'lineno' => 'Star $1:',
 'compareselectedversions' => 'قارن بين النسختين المختارتين',
 'showhideselectedversions' => 'أظهر/أخف المراجعات المختارة',
-'editundo' => 'تراجع',
+'editundo' => 'Rajjaε',
 'diff-multi' => '({{PLURAL:$1||مراجعة واحدة متوسطة غير معروضة أجراها|مراجعتان متوسطتان غير معروضتين أجراهما|$1 مراجعات متوسطة غير معروضة أجراها|$1 مراجعة متوسطة غير معروضة أجراها}} {{PLURAL:$2||مستخدم واحد|مستخدمان|$2 مستخدمين|$2 مستخدمًا|$2 مستخدم}}.)',
 'diff-multi-manyusers' => '({{PLURAL:$1||مراجعة واحدة متوسطة غير معروضة أجراها|مراجعتان متوسطتان غير معروضتان أجراهما|$1 مراجعات متوسطة غير معروضة أجراها|$1 مراجعة متوسطة غير معروضة أجراها}} أكثر من {{PLURAL:$2||مستخدم واحد|مستخدمين|$2 مستخدمين|$2 مستخدمًا|$2 مستخدم}}.)',
 
 # Search results
-'searchresults' => 'el resultats',
-'searchresults-title' => 'نتائج البحث عن "$1"',
+'searchresults' => 'Elrésultats mtaε elrecherche',
+'searchresults-title' => 'Elrésultats mtaε elrecherche εla "$1"',
 'prevn' => '{{PLURAL:$1|$1}} السابقة',
 'nextn' => '{{PLURAL:$1|$1}} التالية',
 'prevn-title' => '$1 {{PLURAL:$1|نتيجة|نتيجة}} سابقة',
 'nextn-title' => '$1 {{PLURAL:$1|نتيجة|نتيجة}} سابقة',
-'shown-title' => 'عرض $1 {{PLURAL:$1|نتيجة|نتيجة}} لكل صفحة',
-'viewprevnext' => 'عرض ($1 {{int:pipe-separator}} $2) ($3).',
+'shown-title' => ' Warri{{PLURAL:Résultat weħed|Zouz résultats|$1  résultats|$1 en résultat}} men kol safħa',
+'viewprevnext' => 'Chouf ($1 {{int:pipe-separator}} $2) ($3)',
 'searchmenu-exists' => "'''famma ss'af7a ismha \"[[:\$1]]\" fi hedha el wiki.'''",
 'searchmenu-new' => "'''أنشئ الصفحة \"[[:\$1]]\" في هذا الويكي!'''",
-'searchprofile-articles' => 'صفحات المحتوى',
-'searchprofile-project' => 'صفحات المساعدة والمشروع',
-'searchprofile-images' => 'الوسائط المتعددة',
-'searchprofile-everything' => 'كل شيء',
-'searchprofile-advanced' => 'متقدم',
-'searchprofile-articles-tooltip' => 'ابحث في $1',
-'searchprofile-project-tooltip' => 'ابحث في $1',
-'searchprofile-images-tooltip' => 'ابحث عن ملفات',
-'searchprofile-everything-tooltip' => 'ابحث في كل المحتوى (شاملا صفحات النقاش)',
-'searchprofile-advanced-tooltip' => 'ابحث في النطاقات المخصصة',
-'search-result-size' => '$1 ({{PLURAL:$2|لا كلمات|كلمة واحدة|كلمتان|$2 كلمات|$2 كلمة}})',
+'searchprofile-articles' => 'Safħat mtaε contenu',
+'searchprofile-project' => 'Safħat mtaε elmouεawna w les projets',
+'searchprofile-images' => 'Multimédia',
+'searchprofile-everything' => 'Kol chay',
+'searchprofile-advanced' => 'Avancé',
+'searchprofile-articles-tooltip' => 'Farkes fi $1',
+'searchprofile-project-tooltip' => 'Farkis fi $1',
+'searchprofile-images-tooltip' => "Farkes f'elfichiers",
+'searchprofile-everything-tooltip' => 'Farkes kol chay (ħatta safħat leħdith)',
+'searchprofile-advanced-tooltip' => 'Ekhtar les espaces de noms elli bech tfarkes εlihom',
+'search-result-size' => '$1 ({{PLURAL:Ħatta kelma|Kelma waħda|Kelmtin|$2 kelmat|$2 en kelma}})',
 'search-result-category-size' => '{{PLURAL:$1|لا أعضاء|عضو واحد|عضوان|$1 أعضاء|$1 عضوًا|$1 عضو}} ({{PLURAL:$2|لا تصانيف فرعية|تصنيف فرعي واحد|تصنيفان فرعيان|$2 تصنيفات فرعية|$2 تصنيفًا فرعيًا|$2 تصنيف فرعي}} و{{PLURAL:$3|لا ملفات|ملف واحد|ملفان|$3 ملفات|$3 ملفًا|$3 ملف}})',
 'search-redirect' => '(تحويلة $1)',
-'search-section' => '(قسم $1)',
+'search-section' => '(section $1)',
 'search-suggest' => 'هل كنت تقصد: $1',
 'searchrelated' => 'مرتبطة',
-'searchall' => 'الكل',
+'searchall' => 'Elkol',
 'showingresultsheader' => "{{PLURAL:$5|النتيجة '''$1''' من'''$3'''|النتائج '''$1 - $2''' من'''$3'''}} ل'''$4'''",
 'search-nonefound' => 'لا توجد نتائج تطابق الاستعلام.',
 
@@ -1013,7 +1012,7 @@ $1",
 
 # Recent changes
 'nchanges' => '{{PLURAL:$1|لا تغييرات|تغيير واحد|تغييران|$1 تغييرات|$1 تغييرا|$1 تغيير}}',
-'recentchanges' => 'أحدث التغييرات',
+'recentchanges' => 'Ajad tabdilet',
 'recentchanges-legend' => 'خيارات أحدث التغييرات',
 'recentchanges-summary' => 'تابع أحدث التغييرات للويكي عبر هذه التلقيمة.',
 'recentchanges-feed-description' => 'تابع أحدث التغييرات للويكي عبر هذه التلقيمة.',
@@ -1030,8 +1029,8 @@ $1",
 'rcshowhidepatr' => '$1 التعديلات المراجعة',
 'rcshowhidemine' => '$1 تعديلاتي',
 'rclinks' => 'أظهر آخر $1 تعديل في آخر $2 يوم<br />$3',
-'diff' => 'فرق',
-'hist' => 'تاريخ',
+'diff' => 'Farq',
+'hist' => 'Hist',
 'hide' => 'أخف',
 'show' => 'اعرض',
 'minoreditletter' => 'thafif',
@@ -1042,7 +1041,7 @@ $1",
 
 # Recent changes linked
 'recentchangeslinked' => 'تغييرات ذات علاقة',
-'recentchangeslinked-toolbox' => 'تغييرات ذات علاقة',
+'recentchangeslinked-toolbox' => 'Tabdilet them',
 'recentchangeslinked-title' => 'التغييرات المرتبطة ب "$1"',
 'recentchangeslinked-summary' => "هذه قائمة بالتغييرات التي تمت حديثا للصفحات الموصولة من صفحة معينة (أو إلى الأعضاء ضمن تصنيف معين).
 الصفحات في [[Special:Watchlist|قائمة مراقبتك]] '''عريضة'''",
@@ -1050,7 +1049,7 @@ $1",
 'recentchangeslinked-to' => 'أظهر التغييرات للصفحات الموصولة للصفحة المعطاة عوضا عن ذلك',
 
 # Upload
-'upload' => 'ارفع ملفات',
+'upload' => "Abεeth des fichiers l'esserveur",
 'uploadlogpage' => 'سجل الرفع',
 'filedesc' => 'ملخص:',
 'uploadedimage' => 'رفع "[[$1]]"',
@@ -1077,17 +1076,17 @@ $1",
 الوصف على [$2 صفحة وصف الملف] هناك معروض بالأسفل.',
 
 # Random page
-'randompage' => 'صفحة عشوائية',
+'randompage' => 'Safħa elli tji',
 
 # Statistics
 'statistics' => 'إحصاءات',
 
 # Miscellaneous special pages
-'nbytes' => '$1 {{PLURAL:$1|بايت|بايت}}',
+'nbytes' => '{{PLURAL:Octet weħed|Zouz octets|$1 octets|$1 en octet}}',
 'nmembers' => '{{PLURAL:$1|لا أعضاء|عضو واحد|عضوان|$1 أعضاء|$1 عضوا|$1 عضو}}',
 'prefixindex' => 'كل الصفحات بالبادئة',
 'usercreated' => '{{GENDER:$3|أنشأه|أنشأته}} في $1 الساعة $2',
-'newpages' => 'صفحات جديدة',
+'newpages' => 'Safħat jdod',
 'move' => 'انقل',
 'pager-newer-n' => '{{PLURAL:$1|أقدم 1|أقدم $1}}',
 'pager-older-n' => '{{PLURAL:$1|أقدم 1|أقدم $1}}',
@@ -1134,7 +1133,7 @@ $1",
 'dellogpage' => 'سجل الحذف',
 
 # Rollback
-'rollbacklink' => 'استرجع',
+'rollbacklink' => 'rajjaε',
 
 # Protect
 'protectlogpage' => 'سجل الحماية',
@@ -1147,7 +1146,7 @@ $1",
 # Namespace form on various pages
 'namespace' => 'النطاق',
 'invert' => 'اعكس الاختيار',
-'blanknamespace' => '(رئيسي)',
+'blanknamespace' => '(Principal)',
 
 # Contributions
 'contributions' => 'مساهماتي',
@@ -1169,7 +1168,7 @@ $1",
 'sp-contributions-submit' => 'lawwej',
 
 # What links here
-'whatlinkshere' => 'ماذا يصل هنا',
+'whatlinkshere' => 'Chnowa elli ywassel elhouni',
 'whatlinkshere-title' => 'الصفحات التي تصل إلى "$1"',
 'whatlinkshere-page' => "ss'af7a:",
 'linkshere' => "الصفحات التالية تصل إلى '''[[:$1]]''':",
@@ -1189,10 +1188,10 @@ $1",
 # Block/unblock
 'ipboptions' => 'ساعتين:2 hours,يوم واحد:1 day,3 أيام:3 days,أسبوع واحد:1 week,أسبوعين:2 weeks,شهر واحد:1 month,3 أشهر:3 months,6 أشهر:6 months,سنة واحدة:1 year,دائم:infinite',
 'ipblocklist' => 'المستخدمون الممنوعون',
-'blocklink' => 'امنع',
+'blocklink' => 'Bloqui',
 'unblocklink' => 'ارفع المنع',
 'change-blocklink' => 'تغيير المنع',
-'contribslink' => 'مساهمات',
+'contribslink' => 'Mousehmet',
 'blocklogpage' => 'سجل المنع',
 'blocklogentry' => 'منع "[[$1]]" لفترة زمنية مدتها $2 $3',
 'block-log-flags-nocreate' => 'إنشاء الحسابات ممنوع',
@@ -1209,7 +1208,7 @@ $1",
 'allmessagesdefault' => 'النص الافتراضي',
 
 # Thumbnails
-'thumbnail-more' => 'كبّر',
+'thumbnail-more' => 'Kabber',
 'thumbnail_error' => 'خطأ في إنشاء صورة مصغرة: $1',
 
 # Tooltip help for the actions
@@ -1218,41 +1217,40 @@ $1",
 'tooltip-pt-preferences' => 'تفضيلاتي',
 'tooltip-pt-watchlist' => 'قائمة الصفحات التي تراقب التغييرات التي تحدث بها',
 'tooltip-pt-mycontris' => 'قائمة مساهماتك',
-'tooltip-pt-login' => 'يفضل أن تسجل الدخول، لكنه ليس إلزاميا.',
+'tooltip-pt-login' => 'Madhabina ken tconnecti, ama mouch bessif',
 'tooltip-pt-logout' => 'خروج',
-'tooltip-ca-talk' => 'نقاش عن صفحة المحتوى',
-'tooltip-ca-edit' => 'يمكنك تعديل هذه الصفحة.
-من فضلك استخدم زر العرض المسبق قبل الحفظ.',
+'tooltip-ca-talk' => 'Discussion εal contenu mtaε essafħa',
+'tooltip-ca-edit' => 'Tannjem tbaddel essafħa hedhi. Aman enzel εal bouton mtaε elvue el msabqa qbal matsajjel.',
 'tooltip-ca-addsection' => 'ابدأ قسما جديدا',
-'tooltip-ca-viewsource' => 'هذه الصفحة محمية.
-يمكنك رؤية مصدرها.',
-'tooltip-ca-history' => 'النسخ السابقة لهذه الصفحة',
+'tooltip-ca-viewsource' => 'El safħa protégée.
+Tnajjem tchouf essource mteεha.',
+'tooltip-ca-history' => 'Copiet qdom mtaε essafħa hedhi',
 'tooltip-ca-protect' => 'احم هذه الصفحة',
 'tooltip-ca-delete' => 'احذف هذه الصفحة',
 'tooltip-ca-move' => 'علم هذه الصفحة',
 'tooltip-ca-watch' => 'أضف هذه الصفحة إلى قائمة مراقبتك',
 'tooltip-ca-unwatch' => 'أزل هذه الصفحة من قائمة مراقبتك',
-'tooltip-search' => 'lawwej fi {{SITENAME}}',
+'tooltip-search' => 'Lawwej fi {{SITENAME}}',
 'tooltip-search-go' => 'اذهب إلى صفحة بالاسم نفسه إن وجدت',
-'tooltip-search-fulltext' => 'ابحث في الصفحات عن هذا النص',
-'tooltip-p-logo' => "ara ess'af7a elraïssia",
-'tooltip-n-mainpage' => "ara ess'af7a elraïssia",
-'tooltip-n-mainpage-description' => "ara ess'af7a elraïssia",
-'tooltip-n-portal' => 'حول المشروع، ماذا يمكن أن تفعل، أين يمكن أن تجد ما تحتاجه',
-'tooltip-n-currentevents' => 'مطالعة سريعة لأهم الأحداث الجارية',
-'tooltip-n-recentchanges' => 'قائمة أحدث التغييرات في الويكي.',
-'tooltip-n-randompage' => 'حمل صفحة عشوائية',
-'tooltip-n-help' => 'المكان للمساعدة',
-'tooltip-t-whatlinkshere' => 'قائمة بكل صفحات الويكي التي تصل هنا',
-'tooltip-t-recentchangeslinked' => 'أحدث التغييرات في الصفحات الموصولة من هذه الصفحة',
+'tooltip-search-fulltext' => "Farkes f'essafħat εattexte hedha",
+'tooltip-p-logo' => "Emchi l'elpage principale",
+'tooltip-n-mainpage' => "Emchi l'elpage principale",
+'tooltip-n-mainpage-description' => "Emchi l'elpage principale",
+'tooltip-n-portal' => "Ɛ'almachrouε, chnowa tnajem taεmel, win talqa elli ħajtek bih",
+'tooltip-n-currentevents' => ' Alqa information εla aham laħdeth mtaε tawa',
+'tooltip-n-recentchanges' => "Lista mtaε ajad ettabdilat f'elwiki",
+'tooltip-n-randompage' => 'Ħell safħa elli tji',
+'tooltip-n-help' => 'Mouεawna',
+'tooltip-t-whatlinkshere' => 'Lista mtaε safħat elwiki elkol elli twassel elhouni',
+'tooltip-t-recentchangeslinked' => "Aham ettabldilet f'essafħat elli ywaslou l'essafħa hedhi",
 '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-t-upload' => "Abεeth des fichiers l'esserveur",
+'tooltip-t-specialpages' => 'Lista mtaε essafħat esspéciales elkol',
+'tooltip-t-print' => "Version l'ettabεan mtaε essafħa hedhi.",
+'tooltip-t-permalink' => "Lien dayem l'elversion hedhi mtaε essafħa",
+'tooltip-ca-nstab-main' => 'Chouf elcontenu mtaε essafħa',
 'tooltip-ca-nstab-user' => 'اعرض صفحة المستخدم',
 'tooltip-ca-nstab-special' => 'هذه صفحة خاصة، لا تستطيع أن تعدل الصفحة نفسها',
 'tooltip-ca-nstab-project' => 'رؤية صفحة المحتوى',
@@ -1265,8 +1263,9 @@ $1",
 'tooltip-diff' => 'اعرض التغييرات التي قمت بها للنص.',
 'tooltip-compareselectedversions' => 'شاهد الفروق بين النسختين المختارتين من هذه الصفحة.',
 'tooltip-watch' => 'أضف هذه الصفحة إلى قائمة مراقبتك',
-'tooltip-rollback' => '"استرجاع" تسترجع التعديل (التعديلات)  في هذه الصفحة للمساهم الأخير بضغطة واحدة.',
-'tooltip-undo' => '"رجوع" تسترجع هذا التعديل وتفتح نافذة التعديل في نمط العرض المسبق. تسمح بإضافة سبب في الملخص.',
+'tooltip-rollback' => '"Rajjaε" yrajjeε ettabdilet f\'hassafħa el\'ekher weħed baddel fi nazla waħda.',
+'tooltip-undo' => '"رجوع" تسترجع هذا التعديل وتفتح نافذة التعديل في نمط العرض المسبق. تسمح بإضافة سبب في الملخص.
+"Annuler" trajjeε eltabdila lekhra w tħel fenêtre mtaε  el tabdil mtaε elvue el msabqa. Tnajjem tqoul εlech f\'ettalkhis.',
 'tooltip-summary' => 'أدخل ملخصا قصيرا',
 
 # Browsing diffs
@@ -1280,11 +1279,10 @@ $1",
 'show-big-image' => 'دقة كاملة',
 
 # Bad image list
-'bad_image_list' => 'الصيغة كالتالي:
-
-فقط عناصر القائمة (السطور التي تبدأ ب *) تؤخذ في الاعتبار.
-يجب أن تكون أول وصلة في السطر وصلة لملف سيىء.
-أي وصلات تالية في السطر نفسه تعتبر استثناءات، أي صفحات قد يكون الملف فيها سطريا.',
+'bad_image_list' => "Elformat kima hakka:
+Les élements mtaε lista (lostra elli yabdew b' *) yetħesbou.
+Ellien lowel fi star yelzmou ykoun lien el fichier khayeb.
+Ay lien ekher fi nafs estar yetħseb exception, maħneha des pages win elfichier ynajem ykoun fi star.",
 
 # Metadata
 'metadata' => 'بيانات ميتا',
@@ -1320,7 +1318,7 @@ $1",
 'duplicate-defaultsort' => '\'\'\'تحذير:\'\'\' مفتاح الترتيب الافتراضي "$2" يتجاوز مفتاح الترتيب الافتراضي السابق "$1".',
 
 # Special:SpecialPages
-'specialpages' => 'الصفحات الخاصة',
+'specialpages' => 'Safħat spéciales',
 
 # External image whitelist
 'external_image_whitelist' => ' #<pre>اترك هذا السطر تماما كما هو
index 5c37bb8..69da741 100644 (file)
@@ -219,7 +219,6 @@ $messages = array(
 'tog-numberheadings' => 'Nommer opskrifte outomaties',
 'tog-showtoolbar' => 'Wys redigeergereedskap',
 'tog-editondblclick' => 'Dubbelkliek om te wysig',
-'tog-editsection' => 'Wys [wysig]-skakels vir elke afdeling',
 'tog-editsectiononrightclick' => 'Wysig afdeling met regskliek op afdeling se titel (JavaScript)',
 'tog-showtoc' => 'Wys inhoudsopgawe (by bladsye met meer as drie opskrifte)',
 'tog-rememberpassword' => "Onthou dat ek op hierdie rekenaar ingeteken het (vir 'n maksimum van $1 {{PLURAL:$1|dag|dae}})",
index 7f38fec..b9d2c94 100644 (file)
@@ -140,7 +140,6 @@ $messages = array(
 'tog-numberheadings' => 'Numerar automaticament os encabezaus',
 'tog-showtoolbar' => "Amostrar a barra de ferramientas d'edición (cal JavaScript)",
 'tog-editondblclick' => 'Activar edición de pachinas fendo-ie doble click (cal JavaScript)',
-'tog-editsection' => 'Activar a edición por seccions usando os vinclos [editar]',
 'tog-editsectiononrightclick' => "Activar a edición de seccions punchando con o botón dreito d'o ratet <br /> en os títols de seccions (cal JavaScript)",
 'tog-showtoc' => "Amostrar l'endice (ta pachinas con más de 3 seccions)",
 'tog-rememberpassword' => "Remerar o mío nombre d'usuario en iste navegador (como muito por $1 {{PLURAL:$1|día|días}})",
index c6cfd54..de73bc7 100644 (file)
@@ -33,6 +33,7 @@
  * @author Hakeem
  * @author Histolo2
  * @author Houcinee1
+ * @author Ibrahim.ID
  * @author Jak
  * @author Khaledhosny
  * @author Lord Anubis
@@ -62,6 +63,7 @@
  * @author Zack wadghiri
  * @author Zanatos
  * @author أحمد
+ * @author الهميان
  * @author ترجمان05
  * @author خالد حسني
  * @author روخو
@@ -496,7 +498,6 @@ $messages = array(
 'tog-numberheadings' => 'ترقيم العناوين تلقائيا',
 'tog-showtoolbar' => 'إظهار شريط التحرير',
 'tog-editondblclick' => 'تعديل الصفحات بالنقر المزدوج',
-'tog-editsection' => 'تفعيل تعديل الأقسام بالضغط على [عدل]',
 'tog-editsectiononrightclick' => 'تفعيل تعديل الأقسام بالنقر باليمين على عناوين الأقسام',
 'tog-showtoc' => 'عرض فهرس المحتويات (للصفحات التي تحتوي على أكثر من 3 عناوين)',
 'tog-rememberpassword' => 'تذكر دخولي بهذا المتصفح (لمدة أقصاها {{PLURAL:$1||يوم واحد|يومان|$1 أيام|$1 يوما|$1 يوم}})',
@@ -1333,6 +1334,8 @@ $2
 'content-not-allowed-here' => '"$1" المحتوى غير مسموح على صفحة [[$2]]',
 'editwarning-warning' => 'قد تتسبب مغادرة هذه الصفحة بخسارتك لأي تغييرات أجريتها.
 يمكنك تعطيل هذا التحذير إذا كنت والجًا في قسم "التحرير" في تفضيلاتك.',
+'editpage-notsupportedcontentformat-title' => 'تنسيق المحتوى غير مدعوم',
+'editpage-notsupportedcontentformat-text' => 'تنسيق المحتوى $1 غير مدعوم بواسطة نموذج المحتوى $2.',
 
 # Content models
 'content-model-wikitext' => 'نص ويكي',
@@ -1375,6 +1378,9 @@ $2
 'cantcreateaccount-text' => "إنشاء الحسابات من عنوان الأيبي هذا ('''$1''') تم منعه بواسطة [[User:$3|$3]].
 
 السبب المعطى بواسطة $3 هو ''$2''",
+'cantcreateaccount-range-text' => "إنشاء الحسابات من عناوين الآيبي في النطاق '''$1'''، التي تحتوي على الآيبي الخاص بك ('''$4''')، قد حظرها [[مستخدم:$3|$3]].
+
+سبب الحظر الذي قاله $3 هو ''$2''",
 
 # History pages
 'viewpagelogs' => 'اعرض سجلات هذه الصفحة',
@@ -1584,6 +1590,7 @@ $1",
 'search-result-score' => 'الارتباط: $1%',
 'search-redirect' => '(تحويلة $1)',
 'search-section' => '(قسم $1)',
+'search-file-match' => '(يطابق محتوى الملف)',
 'search-suggest' => 'أتقصد: $1',
 'search-interwiki-caption' => 'المشاريع الشقيقة',
 'search-interwiki-default' => '$1 نتيجة:',
@@ -1794,7 +1801,7 @@ $1",
 'right-reupload-shared' => 'الرفع على الملفات في مستودع الملفات المشترك محليا',
 'right-upload_by_url' => 'رفع ملف من عنوان مسار',
 'right-purge' => 'تحديث كاش الموقع لصفحة بدون تأكيد',
-'right-autoconfirmed' => 'تعدÙ\8aÙ\84 Ø§Ù\84صÙ\81حات Ù\86صÙ\81 Ø§Ù\84Ù\85Ø­Ù\85Ù\8aØ©',
+'right-autoconfirmed' => 'غÙ\8aر Ù\85تأثر Ø¨Ø­Ø¯Ù\88د Ø§Ù\84Ù\85عدÙ\84',
 'right-bot' => 'تعامل كعملية أوتوماتيكية',
 'right-nominornewtalk' => 'عدم جعل التعديلات الطفيفة لصفحات النقاش تظهر برواز الرسائل الجديدة',
 'right-apihighlimits' => 'استخدام حدود أعلى في استعلامات API',
@@ -1825,6 +1832,7 @@ $1",
 'right-editmyusercss' => 'تعديل ملفات CSS للمستخدم نفسه',
 'right-editmyuserjs' => 'تعديل ملفات جافاسكربت للمستخدم نفسه',
 'right-viewmywatchlist' => 'عرض قائمة مراقبتك',
+'right-editmywatchlist' => 'حرر قائمة مراقبتك. لاحظ أن بعض الإجراءات لا تزال تضيف الصفحات حتى بدون هذا الحق.',
 'right-viewmyprivateinfo' => 'إستعرض بياناتك الشخصية (مثل البريد الإلكتروني والإسم الحقيقي)',
 'right-editmyprivateinfo' => 'حرر بياناتك الشخصية (مثل البريد الإلكتروني والإسم الحقيقي)',
 'right-editmyoptions' => 'تعديل تفضيلاتك',
@@ -1914,7 +1922,7 @@ $1",
 'rclistfrom' => 'أظهر التغييرات بدءا من $1',
 'rcshowhideminor' => '$1 التعديلات الطفيفة',
 'rcshowhidebots' => '$1 البوتات',
-'rcshowhideliu' => '$1 المستخدمين المسجلين',
+'rcshowhideliu' => '$1 {{GENDER:$1|مستخدمين مسجلين|مستخدمات مسجلات|مستخدمون مسجلون}}',
 'rcshowhideanons' => '$1 المستخدمين المجهولين',
 'rcshowhidepatr' => '$1 التعديلات المراجعة',
 'rcshowhidemine' => '$1 تعديلاتي',
@@ -2034,6 +2042,8 @@ $1",
 [[File:$1|thumb|center|$1]]',
 'file-exists-duplicate' => 'هذا الملف مكرر  {{PLURAL:$1|للملف|للملفات}} التالية:',
 'file-deleted-duplicate' => 'ملف مطابق لهذه الملف ([[:$1]]) تم حذفه من قبل. ينبغي أن تتحقق من تاريخ الحذف لهذا الملف قبل المتابعة بإعادة رفعه.',
+'file-deleted-duplicate-notitle' => 'سابقا تم حذف ملف مطابق لهذا الملف، وقد تم منع العنوان.
+ينبغي أن تسأل شخص ما لديه القدرة على عرض بيانات الملف الممنوع لاستعراض الوضع قبل الشروع في إعادة تحميله.',
 'uploadwarning' => 'تحذير الرفع',
 'uploadwarning-text' => 'من فضلك عدل وصف الملف أدناه وحاول مرة أخرى.',
 'savefile' => 'احفظ الملف',
@@ -2354,6 +2364,8 @@ $1',
 'pageswithprop-text' => 'تسرد هذه الصفحة الصفحات التي تستخدم خاصية صفحة معينة.',
 'pageswithprop-prop' => 'اسم الخاصية:',
 'pageswithprop-submit' => 'اذهب',
+'pageswithprop-prophidden-long' => 'قيمة خاصية النص الطويل المخفية ($1)',
+'pageswithprop-prophidden-binary' => 'قيمة الخاصية الثنائية المخفية ($1)',
 
 'doubleredirects' => 'تحويلات مزدوجة',
 'doubleredirectstext' => 'هذه الصفحة تعرض الصفحات التي تحول إلى صفحات تحويل أخرى.
@@ -2381,6 +2393,7 @@ $1',
 'ninterwikis' => '$1 {{PLURAL:$1|interwiki|interwikis}}',
 'nlinks' => '{{PLURAL:$1|لا وصلات|وصلة واحدة|وصلتان|$1 وصلات|$1 وصلة}}',
 'nmembers' => '{{PLURAL:$1|لا أعضاء|عضو واحد|عضوان|$1 أعضاء|$1 عضوا|$1 عضو}}',
+'nmemberschanged' => '$1 → $2 {{PLURAL:$2|عضو|أعضاء}}',
 'nrevisions' => '{{PLURAL:$1|لا مراجعات|مراجعة واحدة|مراجعتان|$1 مراجعات|$1 مراجعة}}',
 'nviews' => '{{PLURAL:$1|مشاهدة واحدة|مشاهدتان|$1 مشاهدات|$1 مشاهدة}}',
 'nimagelinks' => 'مستخدم في {{PLURAL:$1||صفحة واحدة|صفحتين|$1 صفحات|$1 صفحة}}',
@@ -2419,6 +2432,7 @@ $1',
 'protectedpages' => 'صفحات محمية',
 'protectedpages-indef' => 'عمليات الحماية غير المحددة فقط',
 'protectedpages-cascade' => 'الحماية المضمنة فقط',
+'protectedpages-noredirect' => 'أخفِ التحويلات',
 'protectedpagesempty' => 'لا توجد صفحات محمية حاليا بهذه المحددات.',
 'protectedtitles' => 'عناوين محمية',
 'protectedtitlesempty' => 'لا توجد عناوين محمية حاليا بهذه المحددات.',
@@ -2529,7 +2543,8 @@ $1',
 'listgrouprights' => 'صلاحيات مجموعات المستخدمين',
 'listgrouprights-summary' => 'التالي قائمة بمجموعات المستخدمين المعرفة في هذا الويكي، بصلاحياتهم المصاحبة.
 ربما تكون هناك [[{{MediaWiki:Listgrouprights-helppage}}|معلومات إضافية]] حول الصلاحيات المنفردة.',
-'listgrouprights-key' => '* <span class="listgrouprights-granted">صلاحية ممنوحة</span>
+'listgrouprights-key' => 'عنوان:
+* <span class="listgrouprights-granted">صلاحية ممنوحة</span>
 * <span class="listgrouprights-revoked">صلاحية مسحوبة</span>',
 'listgrouprights-group' => 'المجموعة',
 'listgrouprights-rights' => 'الصلاحيات',
@@ -2638,17 +2653,16 @@ $PAGEINTRO $NEWPAGE
 
 ملخص التعديل: $PAGESUMMARY $PAGEMINOREDIT
 
لاتصال بالمحرر:
تصل بالمحرر:
 البريد: $PAGEEDITOR_EMAIL
 ويكي: $PAGEEDITOR_WIKI
 
-لن يكون هناك إخطارات أخرى في حالة حدوث مزيد من التغييرات إلا إذا قمت بزيارة تلك الصفحة.
-يمكنك أيضاً إزالة العلامات عن جميع الصفحات في قائمة مراقبتك.
+لن يكون هناك إخطارات أخرى في حالة حدوث مزيد من التغييرات إلا إذا قمت بزيارة تلك الصفحة أثناء تواجدك. يمكنك أيضاً إزالة العلامات عن جميع الصفحات في قائمة مراقبتك.
 
-                   نظام {{SITENAME}} للإعلام بالبريد الإلكتروني
+نظام {{SITENAME}} للإشعار
 
 --
\84تغÙ\8aÙ\8aر Ø¥Ø¹Ø¯Ø§Ø¯Ø§Øª Ø§Ù\84إعÙ\84اÙ\85 بالبريد الإلكتروني الخاص بك، قم بزيارة
\84تغÙ\8aÙ\8aر Ø¥Ø¹Ø¯Ø§Ø¯Ø§Øª Ø§Ù\84إشعار بالبريد الإلكتروني الخاص بك، قم بزيارة
 {{canonicalurl:{{#special:Preferences}}}}
 
 لتغيير إعدادات قائمة مراقبتك، قم بزيارة
@@ -2657,7 +2671,7 @@ $PAGEINTRO $NEWPAGE
 لحذف الصفحة من قائمة مراقبتك، قم بزيارة
 $UNWATCHURL
 
-للمقترحات والحصول على مساعدة إضافية:
+للمقترحات وللحصول على مساعدة إضافية:
 {{canonicalurl: {{MediaWiki:Helppage}}}}',
 'created' => 'أنشئت',
 'changed' => 'غيرت',
@@ -2686,15 +2700,18 @@ $UNWATCHURL
 'deleteotherreason' => 'سبب آخر/إضافي:',
 'deletereasonotherlist' => 'سبب آخر',
 'deletereason-dropdown' => '*أسباب الحذف الشائعة
-** طلب المؤلف
+** سخام
+** تخريب
 ** خرق لحقوق التأليف والنشر
-** تخريب',
+** طلب المؤلف
+** تحويلة مكسورة',
 'delete-edit-reasonlist' => 'عدل أسباب الحذف',
 'delete-toobig' => 'لهذه الصفحة تاريخ تعديل طويل، أكثر من {{PLURAL:$1||مراجعة واحدة|مراجعتين|$1 مراجعات|$1 مراجعة}}.
 قُيّد محذف مثل هذه الصفحات لمنع الاضطراب المفاجئة في {{SITENAME}}.',
 'delete-warning-toobig' => 'لهذه الصفحة تاريخ تعديل طويل، أكثر من {{PLURAL:$1||مراجعة واحدة|مراجعتين|$1 مراجعات|$1 مراجعة}}.
 قد يؤدي حذفها إلى اضطراب عمليات قاعدة البيانات في {{SITENAME}}؛
 استمر مع الحذر.',
+'deleting-backlinks-warning' => "'''تحذير:''' ترتبط صفحات أخرى بالصفحة التي أنت على وشك حذفها.",
 
 # Rollback
 'rollback' => 'استرجاع التعديلات',
@@ -2935,6 +2952,7 @@ $1',
 أنظر [[Special:BlockList|قائمة منع الآيبي]] لمراجعة حالات المنع.',
 'ipb-blockingself' => 'أنت على وشك منع نفسك! أمتأكد من رغبتك في القيام بذلك؟',
 'ipb-confirmhideuser' => 'أنت على وشك منع مستخدم مع تفعيل خيار "أخف المستخدم". سوف يخفي هذا الخيار اسم المستخدم من جميل القوائم ومدخلات السجلات. أمتأكد من رغبتك في القيام بذلك؟',
+'ipb-confirmaction' => 'إن كنت متأكدًا أنك تريد القيام بذلك حقًا، فالرجاء التحقق من حقل "{{int:ipb-confirm}}" في الأسفل.',
 'ipb-edit-dropdown' => 'عدل أسباب المنع',
 'ipb-unblock-addr' => 'رفع منع $1',
 'ipb-unblock' => 'رفع المنع عن مستخدم أو عنوان أيبي',
@@ -2999,7 +3017,7 @@ $1',
 '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||المنع الآخر|المنعان الآخران|المنوعات الأخرى}}',
@@ -3394,6 +3412,7 @@ $2',
 'pageinfo-length' => 'حجم الصفحة (بالبايت)',
 'pageinfo-article-id' => 'معرف الصفحة (ID)',
 'pageinfo-language' => 'لغة محتوى الصفحة',
+'pageinfo-content-model' => 'نموذج محتوى الصفحة',
 'pageinfo-robot-policy' => 'فهرسة الروبوتات',
 'pageinfo-robot-index' => 'مسموحة',
 'pageinfo-robot-noindex' => 'غير مسموحة',
@@ -4092,6 +4111,8 @@ $5
 'imgmultigoto' => 'اذهب إلى صفحة $1',
 
 # Language selector for translatable SVGs
+'img-lang-default' => '(اللغة الافتراضية)',
+'img-lang-info' => 'ترجم هذه الصورة إلى $1. $2',
 'img-lang-go' => 'اذهب',
 
 # Table pager
@@ -4255,8 +4276,18 @@ $5
 'version-hook-name' => 'اسم الخطاف',
 'version-hook-subscribedby' => 'يستخدم بواسطة',
 'version-version' => '(نسخة $1)',
-'version-svn-revision' => '(r$2)',
-'version-license' => 'الرخصة',
+'version-svn-revision' => 'ن$1',
+'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' => 'ترخيص لـ $1',
+'version-license-not-found' => 'لم يتم العثور على أي معلومات ترخيص لهذا الامتداد.',
+'version-credits-title' => 'العاملون على $1',
+'version-credits-not-found' => 'لم يتم العثور على أي معلومات للعاملين على هذا الامتداد.',
 'version-poweredby-credits' => "تدار هذه الويكي بواسطة '''[https://www.mediawiki.org/ ميدياويكي]'''، حقوق النشر © 2001-$1 $2.",
 'version-poweredby-others' => 'آخرون',
 'version-poweredby-translators' => 'مترجمو translatewiki.net',
@@ -4276,13 +4307,14 @@ $5
 'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath مسار السكريبت]',
 
 # Special:Redirect
-'redirect' => 'تحÙ\88Ù\8aÙ\84 Ø¨Ø§Ø³Ù\85 Ù\85Ù\84Ù\81 Ø£Ù\88 Ø§Ø³Ù\85 Ù\85ستخدÙ\85 أو رقم مراجعة',
+'redirect' => 'تحÙ\88Ù\8aÙ\84 Ø­Ø³Ø¨ Ø±Ù\82Ù\85 Ø§Ù\84Ù\85Ù\84Ù\81 Ø£Ù\88 Ø±Ù\82Ù\85 Ø§Ù\84Ù\85ستخدÙ\85 Ø£Ù\88 Ø±Ù\82Ù\85 Ø§Ù\84صÙ\81حة أو رقم مراجعة',
 'redirect-legend' => 'تحويل إلى ملف أو صفحة',
 'redirect-summary' => 'هذه الصفحة الخاصة تحوّل إلى ملف (باسمه) أو صفحة (برقم إحدى مراجعاتها) أو إلى صفحة مستخدم (برقمه التعريفي). الاستخدام [[{{#Special:Redirect}}/file/Example.jpg]] أو [[{{#Special:Redirect}}/revision/328429]] أو [[{{#Special:Redirect}}/user/101]].',
 'redirect-submit' => 'حوّل',
 'redirect-lookup' => 'ابحث في:',
 'redirect-value' => 'الوجهة',
 'redirect-user' => 'رقم مستخدم',
+'redirect-page' => 'معرف الصفحة',
 'redirect-revision' => 'مراجعة صفحة',
 'redirect-file' => 'اسم ملف',
 'redirect-not-exists' => 'المطلوب غير موجود',
@@ -4476,6 +4508,7 @@ $5
 'api-error-overwrite' => 'لا يسمح بالكتابة فوق ملف موجود.',
 'api-error-stashfailed' => 'خطأ داخلي: فشل الملقم في تخزين الملفات المؤقتة.',
 'api-error-publishfailed' => 'خطأ داخلي: لم ينجح الخادوم في نشر ملف مؤقت',
+'api-error-stasherror' => 'حدث خطأ أثناء رفع الملف لتخزينه.',
 'api-error-timeout' => 'لم يستجب الملقم في الوقت المتوقع.',
 'api-error-unclassified' => 'حدث خطأ غير معروف',
 'api-error-unknown-code' => 'خطأ غير معروف : " $1 "',
@@ -4500,12 +4533,19 @@ $5
 'rotate-comment' => 'تدوير الصورة  {{PLURAL:$1||درجة واحدة|درجتان|$1 درجات|$1 درجة}} باتجاه عقارب الساعة',
 
 # Limit report
+'limitreport-title' => 'محلل سمات البيانات:',
 'limitreport-cputime' => 'زمن المعالجة المستغرق',
 'limitreport-cputime-value' => '{{PLURAL:$1|أقل من ثانية|ثانية واحدة|ثانيتان|$1 ثوان|$1 ثانية}}',
 'limitreport-walltime' => 'الزمن الحقيقي المستغرق',
 'limitreport-walltime-value' => '{{PLURAL:$1|أقل من ثانية|ثانية واحدة|ثانيتان|$1 ثوان|$1 ثانية}}',
+'limitreport-ppvisitednodes' => 'زار المعالج عقدة إحصاء',
+'limitreport-ppgeneratednodes' => 'أحدث المعالج عقدة إحصاء',
+'limitreport-postexpandincludesize' => 'بعد توسيع المساحة الشاملة',
 'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|بايت|بايت}}',
-'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|بايت|بايت}}',
+'limitreport-templateargumentsize' => 'حجم نقاش القالب',
+'limitreport-templateargumentsize-value' => '$1/$2',
+'limitreport-expansiondepth' => 'أكثر عمق توسعي',
+'limitreport-expensivefunctioncount' => 'تحليل إحصاء وظيفة مكلف',
 
 # Special:ExpandTemplates
 'expandtemplates' => 'فرد القوالب',
@@ -4518,10 +4558,14 @@ $5
 'expand_templates_input' => 'النص المدخل:',
 'expand_templates_output' => 'النتيجة',
 '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 parse',
+'expand_templates_generate_rawhtml' => 'أظهر خام HTML',
 'expand_templates_preview' => 'عرض مسبق',
 
+# Unknown messages
+'uploadinvalidxml' => 'تعذر تحليل XML في الملف المرفوع.',
 );
index d281486..154986d 100644 (file)
@@ -312,7 +312,6 @@ $messages = array(
 'tog-numberheadings' => 'رقم العناوين اوتوماتيك',
 'tog-showtoolbar' => 'بين شريط التعديل',
 'tog-editondblclick' => 'عدل الصفح لما تدوس مرتين',
-'tog-editsection' => 'اسمح بـ تعديل الاجزاء عن طريق لينكات [تعديل]',
 'tog-editsectiononrightclick' => 'اسمح بـ تعديل الاجزاء لما تعمل كليك يمين بـالماوس على عناوين الاجزاء',
 'tog-showtoc' => 'بين جدول المحتويات (بتاع الصفح اللى فيها اكتر من 3 عناوين)',
 'tog-rememberpassword' => ' (لمدة   $1 {{PLURAL:$1|يوم|يوم}})خليك فاكر دخولى على الكمبيوتر دا',
index 114678c..729c63d 100644 (file)
@@ -192,7 +192,6 @@ $messages = array(
 'tog-numberheadings' => 'শীৰ্ষকত স্বয়ংক্ৰিয়ভাৱে ক্ৰমিক নং দিয়ক',
 'tog-showtoolbar' => 'সম্পাদনা দণ্ডিকা দেখুৱাওক',
 'tog-editondblclick' => 'দুবাৰ ক্লিক কৰি পৃষ্ঠা সম্পাদনা কৰিব পাৰি',
-'tog-editsection' => '[সম্পাদনা] সংযোগৰ জৰিয়তে অনুচ্ছেদ সম্পাদনা কৰা সক্ৰিয় কৰক',
 'tog-editsectiononrightclick' => 'অনুচ্ছেদৰ শিৰোনামাত ৰাইট্‌ ক্লিক টিপি সম্পাদনা কৰাটো সক্ৰিয় কৰক',
 'tog-showtoc' => 'শিৰোনামাৰ সূচী দেখুৱাওক (যিবোৰ পৃষ্ঠাত তিনিটাতকৈ বেছি শিৰোনামা আছে)',
 'tog-rememberpassword' => 'মোৰ প্ৰৱেশ এই কম্পিউটাৰত মনত ৰাখক (সৰ্বাধিক $1 {{PLURAL:$1|দিনলৈ|দিনলৈ}})',
@@ -449,7 +448,7 @@ $1',
 'versionrequired' => 'মিডিয়াৱিকিৰ $1 সংকলন থাকিব লাগিব ।',
 'versionrequiredtext' => 'এই পৃষ্ঠাটো ব্যৱহাৰ কৰিবলৈ মিডিয়াৱিকিৰ $1 সংস্কৰণ থাকিব লাগিব । [[Special:Version|সংস্কৰণ পৃষ্ঠা]] চাওক।',
 
-'ok' => 'ঠিà¦\95 à¦\86à¦\9bà§\87',
+'ok' => 'শà§\81দà§\8dধ',
 'retrievedfrom' => '"$1"ৰ পৰা সংকলিত',
 'youhavenewmessages' => 'আপোনাৰ কাৰণে $1 আছে। ($2)',
 'youhavenewmessagesfromusers' => '{{PLURAL:$3|আন এজন সদস্য|$3 জন সদস্য}}ৰ পৰা আপোনালৈ $1 আহিছে ($2)।',
@@ -3689,14 +3688,14 @@ $5
 'recreate' => 'পুনৰ সৃষ্টি কৰক',
 
 # action=purge
-'confirm_purge_button' => 'ঠিà¦\95 à¦\86à¦\9bà§\87',
+'confirm_purge_button' => 'শà§\81দà§\8dধ',
 'confirm-purge-top' => 'এই পৃষ্ঠাৰ কেচ্‌ খালী কৰা হওক ?',
 'confirm-purge-bottom' => "এখন পৃষ্ঠাক শোধিত কৰিলে কেচ্‌ আতৰি যায় আৰু সকলোতকৈ শেহতীয়া সংশোধন প্ৰদৰ্শিত হ'বলৈ বাধ্য কৰে।",
 
 # action=watch/unwatch
-'confirm-watch-button' => 'ঠিà¦\95 à¦\86à¦\9bà§\87',
+'confirm-watch-button' => 'শà§\81দà§\8dধ',
 'confirm-watch-top' => 'এই পৃষ্ঠাখন আপোনাৰ লক্ষ্য-তালিকাত যোগ কৰক',
-'confirm-unwatch-button' => 'ঠিà¦\95 à¦\86à¦\9bà§\87',
+'confirm-unwatch-button' => 'শà§\81দà§\8dধ',
 'confirm-unwatch-top' => 'এই পৃষ্ঠাখন আপোনাৰ লক্ষ্য-তালিকাৰ পৰা আঁতৰাওক',
 
 # Multipage image navigation
index 80ab89f..1e386a5 100644 (file)
@@ -74,7 +74,6 @@ $messages = array(
 'tog-numberheadings' => 'Autonumberar los encabezaos',
 'tog-showtoolbar' => "Amosar la barra de ferramientes d'edición",
 'tog-editondblclick' => 'Editar páxines con doble clic',
-'tog-editsection' => "Activar la edición de seiciones per aciu d'enllaces [editar]",
 'tog-editsectiononrightclick' => 'Activar la edición de seiciones calcando col botón drechu nos títulos de seición',
 'tog-showtoc' => 'Amosar índiz (pa páxines con más de 3 encabezaos)',
 'tog-rememberpassword' => 'Recordar la mio identificación nesti ordenador (hasta un máximu de $1 {{PLURAL:$1|día|díes}})',
@@ -918,6 +917,8 @@ Esta yá esiste.',
 'content-not-allowed-here' => 'El conteníu «$1» nun se permite na páxina [[$2]]',
 'editwarning-warning' => 'Salir d\'esta páxina pue causar la perda de cualesquier cambiu fechu.
 Si aniciasti sesión, pue desactivase esti avisu na seición "Edición" de les tos preferencies.',
+'editpage-notsupportedcontentformat-title' => 'El formatu del conteníu nun tien sofitu',
+'editpage-notsupportedcontentformat-text' => 'El formatu del conteníu, $1, nun tien sofitu del modelu de conteníu $2.',
 
 # Content models
 'content-model-wikitext' => 'testu wiki',
@@ -1168,6 +1169,7 @@ Se puen alcontrar más detalles nel [{{fullurl:{{#Special:Log}}/delete|page={{FU
 'search-result-score' => 'Relevancia: $1%',
 'search-redirect' => '(redireición de $1)',
 'search-section' => '(seición $1)',
+'search-file-match' => '(casa col conteníu del ficheru)',
 'search-suggest' => 'Quixisti dicir: $1',
 'search-interwiki-caption' => 'Proyeutos hermanos',
 'search-interwiki-default' => '$1 resultaos:',
@@ -2281,7 +2283,7 @@ Restrinxóse l'esborráu d'estes páxines pa evitar perturbaciones accidentales
 'delete-warning-toobig' => "Esta páxina tien un historial d'ediciones grande, más de $1 {{PLURAL:$1|revisión|revisiones}}.
 Esborralu pue perturbar les operaciones de la base de datos de {{SITENAME}};
 obra con precaución.",
-'deleting-backlinks-warning' => "'''Avisu:''' Otres páxines enllacen a la páxina que ta a piques de desaniciar.",
+'deleting-backlinks-warning' => "'''Avisu:''' Otres páxines enllacen a, o trescluyen de, la páxina que ta a piques de desaniciar.",
 
 # Rollback
 'rollback' => 'Revertir ediciones',
@@ -2582,7 +2584,7 @@ Pa ver los bloqueos qu'hai agora mesmo, mira na [[Special:BlockList|llista de bl
 'range_block_disabled' => "La capacidá d'alministrador pa crear bloqueos d'intervalos ta desactivada.",
 'ipb_expiry_invalid' => 'Tiempu incorrectu.',
 'ipb_expiry_temp' => "Los bloqueos de nome d'usuariu escondíos han ser permanentes.",
-'ipb_hide_invalid' => 'Nun se pue desaniciar esta cuenta; seique tenga demasiaes ediciones.',
+'ipb_hide_invalid' => "Nun se pue desaniciar esta cuenta; tien más {{PLURAL:$1|d'una edición|de $1 ediciones}}.",
 'ipb_already_blocked' => '"$1" yá ta bloquiáu',
 'ipb-needreblock' => '$1 yá ta bloquiáu. ¿Quies camudar los parámetros?',
 'ipb-otherblocks-header' => '{{PLURAL:$1|Otru bloquéu|Otros bloqueos}}',
@@ -4000,4 +4002,6 @@ En realidá cuasi tolo qu'apaeza ente llaves dobles.",
 'expand_templates_generate_rawhtml' => 'Ver el HTML en bruto',
 'expand_templates_preview' => 'Vista previa',
 
+# Unknown messages
+'uploadinvalidxml' => "Nun pudo interpretase'l XML del ficheru cargáu.",
 );
index e822d2e..8a2394c 100644 (file)
@@ -93,7 +93,6 @@ $messages = array(
 'tog-numberheadings' => 'Başlıqların avto-nömrələnməsi',
 'tog-showtoolbar' => 'Redaktə zamanı alətlər qutusunu göstər (JavaScript)',
 'tog-editondblclick' => 'Səhifələri iki kliklə redaktə etməyə başla (JavaScript)',
-'tog-editsection' => 'Hər bir bölmə üçün [redaktə]ni mümkün et',
 'tog-editsectiononrightclick' => 'Bölmələrin redaktəsini başlıqların üzərində sağ klik etməklə mümkün et (JavaScript)',
 'tog-showtoc' => 'Mündəricat siyahısını göstər (3 başlıqdan artıq olan səhifələrdə)',
 'tog-rememberpassword' => 'Məni bu kompyuterdə xatırla (maksimum $1 {{PLURAL:$1|gün|gün}})',
@@ -2897,6 +2896,10 @@ Variants for Chinese language
 'version-hook-subscribedby' => 'Abunə olan',
 'version-version' => '(Versiya $1)',
 'version-license' => 'Lisenziya',
+'version-ext-license' => 'Lisenziya',
+'version-ext-colheader-version' => 'Versiya',
+'version-ext-colheader-license' => 'Lisenziya',
+'version-ext-colheader-credits' => 'Müəlliflər',
 'version-poweredby-credits' => "Bu wiki '''[https://www.mediawiki.org/ MediaWiki]''' proqramı istifadə edilərək yaradılmışdır, müəlliflik © 2001-$1 $2.",
 'version-poweredby-others' => 'digərləri',
 'version-software-product' => 'Məhsul',
index 194e1ab..8987e70 100644 (file)
@@ -97,7 +97,6 @@ $messages = array(
 'tog-numberheadings' => 'باشلیق‌لاری اوتوماتیک نومره‌له',
 'tog-showtoolbar' => 'دَییشدیرمه آراج چوبوغونو گؤستر (جاوااسکریپت لازیم‌دیر)',
 'tog-editondblclick' => 'صحیفه‌‌لری ایکی کلیکله دَییشدیر (جاوااسکریپت لازیم‌دیر)',
-'tog-editsection' => '[دَییشدیر] باغلانتی‌سیلا بؤلوم دَییشدیرمه‌سینه ایجازه وئر',
 'tog-editsectiononrightclick' => 'بؤلوم‌لرین دیشدیرمه‌سینی، باشلیقلارین اوزرینده ساغ‌کلیک ائتمک‌له ایجازه وئر (جاوااسکریپت لازیم‌دیر)',
 'tog-showtoc' => 'ایچینده‌کیلر جدولینی گؤستر (۳-دن آرتیق باشلیقلاری اولان صحیفه‌‌لرده)',
 'tog-rememberpassword' => 'منیم گیریشیمی بو بیلگی‌سایاردا یاددا ساخلا (چوخو {{PLURAL:$1|بیر گونه|$1 گونه}} کیمی)',
index 36ca388..5af0e7a 100644 (file)
@@ -158,7 +158,6 @@ $messages = array(
 'tog-numberheadings' => 'Башисемдәрҙе автоматик рәүештә номерлаe',
 'tog-showtoolbar' => 'Мөхәррирләгән ваҡытта өҫкө ҡоралдар панелен күрһәтергә (JavaScript кәрәк)',
 'tog-editondblclick' => 'Биттәрҙе ике сиртеү менән мөхәррирләргә',
-'tog-editsection' => 'Һәр бүлек өсөн «үҙгәртеү» һылтанмаһын күрһәтергә',
 'tog-editsectiononrightclick' => 'Бүлектәрҙе исемдәренә төрткөнөң уң яғына сиртеп үҙгәртергә',
 'tog-showtoc' => 'Эстәлек күрһәтелһен (3-тән күп башлығы булған биттәрҙә)',
 'tog-rememberpassword' => 'Был браузерҙа (иң күбендә $1 {{PLURAL:$1|көнгә}}) иҫәп яҙыуым хәтерләнһен',
index cae3c65..d15280e 100644 (file)
@@ -152,7 +152,6 @@ $messages = array(
 'tog-numberheadings' => 'اتوماتیک شماره کتن عناوین',
 'tog-showtoolbar' => 'میله ابزار اصلاح پیش درا(جاوا)',
 'tog-editondblclick' => 'صفحات گون دو کلیک اصلاح کن(جاوا)',
-'tog-editsection' => 'فعال کتن کسمت اصلاح از طریق لینکان  [edit]',
 'tog-editsectiononrightclick' => 'فعال کتن اصلاح کسمت گون کلیک راست اور کسمت عناوین(جاوا)',
 'tog-showtoc' => 'جدول محتوای‌ء پیش دار( په صفحیانی که گیش چه 3 عنوانش هست)',
 'tog-rememberpassword' => 'من ورود ته ای کامپیوتر هیال بکن (په $1 {{PLURAL:$1|روچ|روچ}})',
index 828cdf4..1381eae 100644 (file)
@@ -108,7 +108,6 @@ $messages = array(
 'tog-numberheadings' => 'Tolos-bilang na mga pamayohán',
 'tog-showtoolbar' => 'Ipahiling an barang-gamit nin pagliwat',
 'tog-editondblclick' => 'Liwaton an mga pahina sa pagdoble nin klik',
-'tog-editsection' => 'Paganaha an paghihirá kan seksyon sa paági kan [liwaton] na kilyawan',
 'tog-editsectiononrightclick' => 'Paganaha an seksyon nin pagliliwat sa pag-klik kan mga titulo nin seksyon',
 'tog-showtoc' => 'Ihayag an taytayan nin mga laog (para sa mga pahinang igwang sobra sa 3 pamayohan)',
 'tog-rememberpassword' => 'Giromdoma an sakong paglaóg sa kilyaw (browser) na ini (para sa maximum na $1 {{PLURAL:$1|aldaw|mga aldaw}})',
@@ -932,6 +931,8 @@ Igwa na kaini.',
 'invalid-content-data' => 'Imbalidong datos nin laman',
 'content-not-allowed-here' => '"$1" na laman dae pinagtutugutan sa pahina [[$2]]',
 'editwarning-warning' => 'Sa pagbaya kaining pahina magkakausa saimo na mawara an anuman na mga kaliwatan na saimong ginibo. Kun ika maglaog, mapuwede mong untukon ining patanid sa "Pagliliwat" na seksyon kan saimong mga kamuyahan.',
+'editpage-notsupportedcontentformat-title' => 'Kalamnan nin pormat bakong suportado',
+'editpage-notsupportedcontentformat-text' => 'An pormat nin kalamnan na $1 bakong suportado kan modelong kalamnan na $2.',
 
 # Content models
 'content-model-wikitext' => 'wiki-teksto',
@@ -3677,7 +3678,15 @@ Pwede mo man [[Special:EditWatchlist|gamiton an standard editor]].',
 'version-hook-name' => 'Ngaran kan pangawil',
 'version-hook-subscribedby' => 'Pinaghaguhot ni',
 'version-version' => '(Bersyon na $1)',
-'version-license' => 'Lisensiya',
+'version-license' => 'Lisensiya kan MediaWiki',
+'version-ext-license' => 'Lisensiya',
+'version-ext-colheader-name' => 'Ekstensyon',
+'version-ext-colheader-version' => 'Bersyon',
+'version-ext-colheader-license' => 'Lisensiya',
+'version-ext-colheader-description' => 'Deskripsyon',
+'version-ext-colheader-credits' => 'Mga Kagsurat',
+'version-license-title' => 'Lisensiya para sa $1',
+'version-license-not-found' => 'Mayong detalyadong impormasyon sa lisensiya an nanumpungan para sa ekstensyon na ini.',
 'version-poweredby-credits' => "An wiking ini pinagpagana kan '''[https://www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
 'version-poweredby-others' => 'mga iba pa',
 'version-poweredby-translators' => 'translatewiki.net na mga paradakit-taramon',
@@ -3896,6 +3905,7 @@ Kun bako man, ika makakagamit nin sayon na porma sa ibaba. An saimong komento id
 'api-error-overwrite' => 'An salambawan na sarong eksistido nang sagunson dae pinagtutugutan.',
 'api-error-stashfailed' => 'Panlaog na kasalaan: An serbidor nagpalya sa pagsaray kan temporaryong sagunson.',
 'api-error-publishfailed' => 'Panlaog na kasalaan: An serbidor nagpalya na ipublikar an temporaryong sagunson.',
+'api-error-stasherror' => 'Nagkaigwa nin kasalaan mantang ikinakarga an sagunson sa sarayan.',
 'api-error-timeout' => 'An serbidor dae nakapagsimbag sa laog kan pinaghunang panahon.',
 'api-error-unclassified' => 'May dae midbid na kasalaan an nangyari.',
 'api-error-unknown-code' => 'Dae midbid na kasalaan: "$1".',
index fc79d1c..5356a6c 100644 (file)
@@ -102,7 +102,6 @@ $messages = array(
 'tog-numberheadings' => 'Аўта-нумараваць падзагалоўкі',
 'tog-showtoolbar' => 'Паказваць рэдактарскую стужку (Яваскрыпт)',
 'tog-editondblclick' => 'Праўка старонак па падвойным пстрыку (Яваскрыпт)',
-'tog-editsection' => 'Праўка падраздзелаў праз спасылкі "[правіць]"',
 'tog-editsectiononrightclick' => 'Праўка падраздзелаў па правым пстрыку на загалоўку (Яваскрыпт)',
 'tog-showtoc' => 'Паказваць змест (для старонак, дзе больш за 3 падзагалоўкі)',
 'tog-rememberpassword' => 'Памятаць уваходныя даныя ў гэтым браўзеры (не даўжэй за $1 {{PLURAL:$1|дзень|дні|дзён}})',
index 24f4df1..579f6cb 100644 (file)
@@ -264,15 +264,14 @@ $messages = array(
 # User preference toggles
 'tog-underline' => 'Падкрэсьліваць спасылкі:',
 'tog-justify' => 'Выраўноўваць тэкст па шырыні старонкі',
-'tog-hideminor' => 'ХаваÑ\86Ñ\8c Ð´Ñ\80обнÑ\8bÑ\8f Ð·Ñ\8cменÑ\8b ў сьпісе апошніх зьменаў',
-'tog-hidepatrolled' => 'ХаваÑ\86Ñ\8c Ð¿Ð°Ñ\82Ñ\80Ñ\83лÑ\8fванÑ\8bÑ\8f Ð·Ñ\8cменÑ\8b ў сьпісе апошніх зьменаў',
+'tog-hideminor' => 'ХаваÑ\86Ñ\8c Ð´Ñ\80обнÑ\8bÑ\8f Ð¿Ñ\80аÑ\9eкÑ\96 ў сьпісе апошніх зьменаў',
+'tog-hidepatrolled' => 'ХаваÑ\86Ñ\8c Ð¿Ð°Ñ\82Ñ\80Ñ\83лÑ\8fванÑ\8bÑ\8f Ð¿Ñ\80аÑ\9eкÑ\96 ў сьпісе апошніх зьменаў',
 'tog-newpageshidepatrolled' => 'Хаваць патруляваныя старонкі ў сьпісе новых старонак',
 'tog-extendwatchlist' => 'Пашырыць сьпіс назіраньня, каб ён паказваў усе зьмены, а ня толькі апошнія',
 'tog-usenewrc' => 'Групаваць зьмены па старонках у апошніх зьменах і сьпісе назіраньня',
 'tog-numberheadings' => 'Аўтаматычная нумарацыя загалоўкаў',
 'tog-showtoolbar' => 'Паказваць панэль інструмэнтаў рэдагаваньня',
 'tog-editondblclick' => 'Рэдагаваць старонкі па падвойным пстрыку',
-'tog-editsection' => 'Дазволіць рэдагаваньне асобных сэкцыяў па спасылках [рэдагаваць]',
 'tog-editsectiononrightclick' => 'Рэдагаваць сэкцыі па правым пстрыку на загалоўку',
 'tog-showtoc' => 'Паказваць зьмест (для старонак з больш як 3 разьдзеламі)',
 'tog-rememberpassword' => 'Запомніць мяне ў гэтым браўзэры (ня больш за $1 {{PLURAL:$1|дзень|дні|дзён}})',
@@ -631,8 +630,8 @@ $1',
 'no-null-revision' => 'Немагчыма стварыць нулявую вэрсію для старонкі «$1»',
 'badtitle' => 'Няслушная назва',
 'badtitletext' => 'Запытаная назва старонкі няслушная ці пустая, альбо няслушна ўказаная міжмоўная ці інтэрвікі-назва. Яна можа ўтрымліваць сымбалі, якія нельга ўжываць у назвах.',
-'perfcached' => 'Наступныя зьвесткі кэшаваныя і могуць быць састарэлымі. У кэшы {{PLURAL:$1|1=даступны|даступныя}} ня больш за $1 {{PLURAL:$1|вынік|вынікі|вынікаў}}.',
-'perfcachedts' => 'Наступныя зьвесткі кэшаваныя і апошні раз былі абноўленыя $1. У кэшы {{PLURAL:$4|1=даступны|даступныя}} ня больш за $4 {{PLURAL:$4|вынік|вынікі|вынікаў}}.',
+'perfcached' => 'Наступныя зьвесткі кэшаваныя і могуць быць састарэлымі. У кэшы {{PLURAL:$1|даступны|даступныя}} ня больш за $1 {{PLURAL:$1|вынік|вынікаў|вынікі}}.',
+'perfcachedts' => 'Наступныя зьвесткі кэшаваныя і апошні раз былі абноўленыя $1. У кэшы {{PLURAL:$4|даступны|даступныя}} ня больш за $4 {{PLURAL:$4|вынік|вынікаў|вынікі}}.',
 'querypage-no-updates' => 'Абнаўленьні гэтай старонкі цяпер адключаныя. Зьвесткі ня будуць абнаўляцца.',
 'viewsource' => 'Паказаць крыніцу',
 'viewsource-title' => 'Прагляд крыніцы для $1',
@@ -765,7 +764,7 @@ $2',
 'passwordtooshort' => 'Паролі павінны ўтрымліваць ня менш за $1 {{PLURAL:$1|сымбаль|сымбалі|сымбаляў}}.',
 'password-name-match' => 'Ваш пароль павінен адрозьнівацца ад Вашага імя ўдзельніка.',
 'password-login-forbidden' => 'Выкарыстаньне гэтага імя ўдзельніка і пароля было забароненае.',
-'mailmypassword' => 'Ð\94аÑ\81лаÑ\86Ñ\8c Ð½Ð¾Ð²Ñ\8b Ð¿Ð°Ñ\80олÑ\8c Ð¿Ð° Ñ\8dлекÑ\82Ñ\80оннай Ð¿Ð¾Ñ\88Ñ\86е',
+'mailmypassword' => 'СкÑ\96нÑ\83Ñ\86Ñ\8c Ð¿Ð°Ñ\80олÑ\8c',
 'passwordremindertitle' => 'Новы часовы пароль для {{GRAMMAR:родны|{{SITENAME}}}}',
 'passwordremindertext' => 'Нехта (магчыма Вы, з IP-адрасу $1) запытаў нас даслаць новы пароль для {{GRAMMAR:родны|{{SITENAME}}}} ($4). Для ўдзельніка «$2» быў створаны часовы пароль і ён цяпер «$3». Калі гэта была Вашая ініцыятыва, Вам трэба ўвайсьці ў сыстэму і адразу зьмяніць пароль. Тэрмін дзеяньня Вашага часовага паролю — $5 {{PLURAL:$5|дзень|дні|дзён}}.
 
@@ -784,7 +783,7 @@ $2',
 У выніку, наведвальнікі, якія карыстаюцца гэтым ІР-адрасам, ня могуць стварыць зараз болей рахункаў.',
 'emailauthenticated' => 'Ваш адрас электроннай пошты быў пацьверджаны $2 у $3.',
 'emailnotauthenticated' => 'Ваш адрас электроннай пошты яшчэ не пацьверджаны.
­Ð»ÐµÐºÑ\82Ñ\80оннаÑ\8f Ð¿Ð¾Ñ\88Ñ\82а Ð´Ð»Ñ\8f Ð½Ð°Ñ\81Ñ\82Ñ\83пнÑ\8bÑ\85 Ð¼Ð°Ð³Ñ\87Ñ\8bмаÑ\81Ñ\8cÑ\86Ñ\8fÑ\9e Ð´Ð°Ñ\81Ñ\8bлаÑ\86Ñ\86а Ð½Ñ\8f Ð±Ñ\83дзе.',
\9bÑ\96Ñ\81Ñ\82Ñ\8b Ñ\8dлекÑ\82Ñ\80оннай Ð¿Ð¾Ñ\88Ñ\82ай Ð´Ð»Ñ\8f Ð½Ð°Ñ\81Ñ\82Ñ\83пнÑ\8bÑ\85 Ð¼Ð°Ð³Ñ\87Ñ\8bмаÑ\81Ñ\8cÑ\86Ñ\8fÑ\9e Ð´Ð°Ñ\81Ñ\8bлаÑ\86Ñ\86а Ð½Ñ\8f Ð±Ñ\83дÑ\83Ñ\86Ñ\8c.',
 'noemailprefs' => 'Пазначце адрас электроннай пошты ў Вашых наладах, каб актывізаваць гэтыя магчымасьці.',
 'emailconfirmlink' => 'Пацьвердзіць Ваш адрас электроннай пошты',
 'invalidemailaddress' => 'Уведзены адрас электроннай пошты не адпавядае фармату адрасоў электроннай пошты.
@@ -821,6 +820,8 @@ $2',
 'retypenew' => 'Паўтарыце новы пароль:',
 'resetpass_submit' => 'Наставіць пароль і увайсьці',
 'changepassword-success' => 'Ваш пароль быў пасьпяхова зьменены!',
+'changepassword-throttled' => 'Вы зрабілі зашмат спробаў увайсьці ў сыстэму.
+Калі ласка, пачакайце $1 перад наступнай спробай.',
 'resetpass_forbidden' => 'Пароль ня можа быць зьменены',
 'resetpass-no-info' => 'Для непасрэднага доступу да гэтай старонкі Вам неабходна ўвайсьці ў сыстэму.',
 'resetpass-submit-loggedin' => 'Зьмяніць пароль',
@@ -833,7 +834,7 @@ $2',
 # Special:PasswordReset
 'passwordreset' => 'Ачыстка паролю',
 'passwordreset-text-one' => 'Запоўніце гэтую форму, каб скінуць пароль.',
-'passwordreset-text-many' => '{{PLURAL:$1|Ð\97апоÑ\9eнÑ\96Ñ\86е Ð°Ð´Ð½Ð¾ Ð· Ð³Ñ\8dÑ\82Ñ\8bÑ\85 Ð¿Ð°Ð»Ñ\91Ñ\9e, ÐºÐ°Ð± Ñ\81кÑ\96нÑ\83Ñ\86Ñ\8c Ð¿Ð°Ñ\80олÑ\8c.}}',
+'passwordreset-text-many' => '{{PLURAL:$1|Ð\97апоÑ\9eнÑ\96Ñ\86е Ð°Ð´Ð½Ð¾ Ð· Ð¿Ð°Ð»Ñ\91Ñ\9e, ÐºÐ°Ð± Ð°Ñ\82Ñ\80Ñ\8bмаÑ\86Ñ\8c Ñ\87аÑ\81овÑ\8b Ð¿Ð°Ñ\80олÑ\8c Ð¿Ñ\80аз Ñ\8dлекÑ\82Ñ\80оннÑ\83Ñ\8e Ð¿Ð¾Ñ\88Ñ\82Ñ\83.}}',
 'passwordreset-legend' => 'Ачысьціць пароль',
 'passwordreset-disabled' => 'Магчымасьць ачысткі паролю была забароненая ў {{GRAMMAR:месны|{{SITENAME}}}}.',
 'passwordreset-emaildisabled' => 'Функцыі e-mail у гэтай вікі былі адключаныя.',
@@ -843,22 +844,18 @@ $2',
 'passwordreset-capture-help' => 'Калі Вы пазначыце гэтае поле, электронны ліст (з часовым паролем), будзе паказаны Вам як толькі ён будзе дасланы ўдзельніку.',
 'passwordreset-email' => 'Адрас электроннай пошты:',
 'passwordreset-emailtitle' => 'Падрабязнасьці рахунку ў {{GRAMMAR:месны|{{SITENAME}}}}',
-'passwordreset-emailtext-ip' => 'Нехта (магчыма Вы, з IP-адрасу $1) зрабіў запыт на вашага паролю ў {{GRAMMAR:месны|{{SITENAME}}}} ($4). {{PLURAL:$3|1=Наступны рахунак удзельніка зьвязаны|Наступныя рахункі ўдзельнікаў зьвязаныя}} з гэтым адрасам электроннай пошты:
+'passwordreset-emailtext-ip' => 'Нехта (магчыма Вы, з IP-адрасу $1) зрабіў запыт на скіданьне вашага паролю ў {{GRAMMAR:месны|{{SITENAME}}}} ($4). {{PLURAL:$3|Наступны рахунак удзельніка зьвязаны|Наступныя рахункі ўдзельнікаў зьвязаныя}} з гэтым адрасам электроннай пошты:
 
 $2
 
-{{PLURAL:$3|1=Гэты часовы пароль будзе|Гэтыя часовыя паролі будуць}} дзейнічаць $5 {{PLURAL:|дзень|дні|дзён}}.
-Цяпер Вам неабходна ўвайсьці і выбраць новы пароль. Калі нехта іншы зрабіў гэты запыт,
-ці Вы ўспомнілі Ваш пачатковы пароль, які ня хочаце мяняць,
-Вы можаце праігнараваць гэтае паведамленьне, і працягваць выкарыстоўваць стары пароль.',
-'passwordreset-emailtext-user' => 'Удзельнік $1 зрабіў запыт на скіданьне вашага паролю ў {{GRAMMAR:месны|{{SITENAME}}}} ($4). {{PLURAL:$3|1=Наступны рахунак удзельніка зьвязаны|Наступныя рахункі ўдзельнікаў зьвязаныя}} з гэтым адрасам электроннай пошты:
+{{PLURAL:$3|Гэты часовы пароль будзе|Гэтыя часовыя паролі будуць}} дзейнічаць $5 {{PLURAL:$5|дзень|дзён|дні}}.
+Цяпер Вам неабходна ўвайсьці і выбраць новы пароль. Калі нехта іншы зрабіў гэты запыт, ці Вы ўспомнілі Ваш пачатковы пароль, які ня хочаце мяняць, Вы можаце праігнараваць гэтае паведамленьне, і працягваць выкарыстоўваць стары пароль.',
+'passwordreset-emailtext-user' => 'Удзельнік $1 зрабіў запыт на скіданьне вашага паролю ў {{GRAMMAR:месны|{{SITENAME}}}} ($4). {{PLURAL:$3|Наступны рахунак удзельніка зьвязаны|Наступныя рахункі ўдзельнікаў зьвязаныя}} з гэтым адрасам электроннай пошты:
 
 $2
 
-{{PLURAL:$3|1=Гэты часовы пароль будзе|Гэтыя часовыя паролі будуць}} дзейнічаць $5 {{PLURAL:|дзень|дні|дзён}}.
-Цяпер Вам неабходна ўвайсьці і выбраць новы пароль. Калі нехта іншы зрабіў гэты запыт,
-ці Вы ўспомнілі Ваш пачатковы пароль, які ня хочаце мяняць,
-Вы можаце праігнараваць гэтае паведамленьне, і працягваць выкарыстоўваць стары пароль.',
+{{PLURAL:$3|Гэты часовы пароль будзе|Гэтыя часовыя паролі будуць}} дзейнічаць $5 {{PLURAL:$5|дзень|дзён|дні}}.
+Цяпер Вам неабходна ўвайсьці і выбраць новы пароль. Калі нехта іншы зрабіў гэты запыт, ці Вы ўспомнілі Ваш пачатковы пароль, які ня хочаце мяняць, Вы можаце праігнараваць гэтае паведамленьне, і працягваць выкарыстоўваць стары пароль.',
 'passwordreset-emailelement' => 'Імя ўдзельніка: $1
 Часовы пароль: $2',
 'passwordreset-emailsent' => 'Ліст пра скіданьне паролю быў дасланы.',
@@ -1053,23 +1050,23 @@ $2
 Апошні запіс з журнала пададзены ніжэй для даведкі:",
 'semiprotectedpagewarning' => "'''Заўвага:''' Гэтая старонка была абароненая, і рэдагаваць яе могуць толькі зарэгістраваныя ўдзельнікі.
 Апошні запіс з журнала пададзены ніжэй для даведкі:",
-'cascadeprotectedwarning' => "'''Ð\9fапÑ\8fÑ\80Ñ\8dджанÑ\8cне:''' Ð\93Ñ\8dÑ\82аÑ\8f Ñ\81Ñ\82аÑ\80онка Ð°Ð±Ð°Ñ\80оненаÑ\8f, Ñ\82олÑ\8cкÑ\96 Ñ\9eдзелÑ\8cнÑ\96кÑ\96 Ð· Ð¿Ñ\80авамÑ\96 Ð°Ð´Ð¼Ñ\96нÑ\96Ñ\81Ñ\82Ñ\80аÑ\82аÑ\80аÑ\9e Ð¼Ð¾Ð³Ñ\83Ñ\86Ñ\8c Ñ\80Ñ\8dдагаваÑ\86Ñ\8c Ñ\8fе, Ñ\82амÑ\83 Ñ\88Ñ\82о Ñ\8fна Ñ\9eклÑ\8eÑ\87анаÑ\8f Ñ\9e {{PLURAL:$1|1=наÑ\81Ñ\82Ñ\83пнÑ\83Ñ\8e ÐºÐ°Ñ\81кадна-абаÑ\80оненÑ\83Ñ\8e Ñ\81Ñ\82аÑ\80онкÑ\83|наÑ\81Ñ\82Ñ\83пнÑ\8bÑ\8f ÐºÐ°Ñ\81кадна-абаÑ\80оненÑ\8bÑ\8f Ñ\81Ñ\82аÑ\80онкÑ\96}}:",
+'cascadeprotectedwarning' => "'''Ð\9fапÑ\8fÑ\80Ñ\8dджанÑ\8cне:''' Ð³Ñ\8dÑ\82аÑ\8f Ñ\81Ñ\82аÑ\80онка Ð°Ð±Ð°Ñ\80оненаÑ\8f, Ñ\82олÑ\8cкÑ\96 Ñ\9eдзелÑ\8cнÑ\96кÑ\96 Ð· Ð¿Ñ\80авамÑ\96 Ð°Ð´Ð¼Ñ\96нÑ\96Ñ\81Ñ\82Ñ\80аÑ\82аÑ\80аÑ\9e Ð¼Ð¾Ð³Ñ\83Ñ\86Ñ\8c Ñ\80Ñ\8dдагаваÑ\86Ñ\8c Ñ\8fе, Ñ\82амÑ\83 Ñ\88Ñ\82о Ñ\8fна Ñ\9eклÑ\8eÑ\87анаÑ\8f Ñ\9e {{PLURAL:$1|наÑ\81Ñ\82Ñ\83пнÑ\83Ñ\8e Ñ\81Ñ\82аÑ\80онкÑ\83|наÑ\81Ñ\82Ñ\83пнÑ\8bÑ\8f Ñ\81Ñ\82аÑ\80онкÑ\96}} Ð· ÐºÐ°Ñ\81каднай Ð°Ð±Ð°Ñ\80онай:",
 'titleprotectedwarning' => "'''Папярэджаньне: гэтая старонка была абароненая і для яе стварэньня патрабуюцца [[Special:ListGroupRights|адпаведныя правы]].'''
 Апошні запіс з журнала пададзены ніжэй для даведкі:",
 'templatesused' => '{{PLURAL:$1|Шаблён, які ўжываецца|Шаблёны, якія ўжываюцца}} на гэтай старонцы:',
-'templatesusedpreview' => 'У гэтым папярэднім праглядзе {{PLURAL:$1|1=выкарыстаны наступны шаблён|выкарыстаныя наступныя шаблёны}}:',
-'templatesusedsection' => 'У гэтай сэкцыі {{PLURAL:$1|1=выкарыстаны наступны шаблён|выкарыстаныя наступныя шаблёны}}:',
+'templatesusedpreview' => 'У гэтым папярэднім праглядзе {{PLURAL:$1|выкарыстаны наступны шаблён|выкарыстаныя наступныя шаблёны}}:',
+'templatesusedsection' => 'У гэтай сэкцыі {{PLURAL:$1|выкарыстаны наступны шаблён|выкарыстаныя наступныя шаблёны}}:',
 'template-protected' => '(абаронены)',
 'template-semiprotected' => '(часткова абароненая)',
-'hiddencategories' => 'Гэтая старонка належыць да $1 {{PLURAL:$1|1=схаванай катэгорыі|схаваных катэгорыяў}}:',
+'hiddencategories' => 'Гэтая старонка належыць да $1 {{PLURAL:$1|схаванай катэгорыі|схаваных катэгорыяў}}:',
 'nocreatetext' => 'У {{GRAMMAR:месны|{{SITENAME}}}} абмежаванае стварэньне новых старонак.
 Вы можаце вярнуцца і рэдагаваць існуючую старонку, альбо [[Special:UserLogin|ўвайсьці ў сыстэму ці стварыць рахунак]].',
 'nocreate-loggedin' => 'Вы ня маеце дазволу на стварэньне новых старонак.',
 'sectioneditnotsupported-title' => 'Рэдагаваньне сэкцыяў не падтрымліваецца',
 'sectioneditnotsupported-text' => 'Рэдагаваньне сэкцыяў не падтрымліваецца ў гэтай старонцы рэдагаваньня',
 'permissionserrors' => 'Памылка дазволу',
-'permissionserrorstext' => 'Ð\92Ñ\8b Ð½Ñ\8f Ð¼Ð°ÐµÑ\86е Ð´Ð°Ð·Ð²Ð¾Ð»Ñ\83 Ð½Ð° Ð³Ñ\8dÑ\82ае Ð´Ð·ÐµÑ\8fнÑ\8cне Ð¿Ð° {{PLURAL:$1|1=наÑ\81Ñ\82Ñ\83пнай Ð¿Ñ\80Ñ\8bÑ\87Ñ\8bне|наÑ\81Ñ\82Ñ\83пнÑ\8bÑ\85 Ð¿Ñ\80Ñ\8bÑ\87Ñ\8bнаÑ\85}}:',
-'permissionserrorstext-withaction' => 'Ð\92Ñ\8b Ð½Ñ\8f Ð¼Ð°ÐµÑ\86е Ð´Ð°Ð·Ð²Ð¾Ð»Ñ\83 Ð½Ð° $2 Ð¿Ð° {{PLURAL:$1|1=наÑ\81Ñ\82Ñ\83пнай Ð¿Ñ\80Ñ\8bÑ\87Ñ\8bне|наÑ\81Ñ\82Ñ\83пнÑ\8bÑ\85 Ð¿Ñ\80Ñ\8bÑ\87Ñ\8bнаÑ\85}}:',
+'permissionserrorstext' => 'Ð\92Ñ\8b Ð½Ñ\8f Ð¼Ð°ÐµÑ\86е Ð´Ð°Ð·Ð²Ð¾Ð»Ñ\83 Ð½Ð° Ð³Ñ\8dÑ\82ае Ð´Ð·ÐµÑ\8fнÑ\8cне Ð· {{PLURAL:$1|наÑ\81Ñ\82Ñ\83пнай Ð¿Ñ\80Ñ\8bÑ\87Ñ\8bнÑ\8b|наÑ\81Ñ\82Ñ\83пнÑ\8bÑ\85 Ð¿Ñ\80Ñ\8bÑ\87Ñ\8bнаÑ\9e}}:',
+'permissionserrorstext-withaction' => 'Ð\92Ñ\8b Ð½Ñ\8f Ð¼Ð°ÐµÑ\86е Ð´Ð°Ð·Ð²Ð¾Ð»Ñ\83 Ð½Ð° $2 Ð· {{PLURAL:$1|наÑ\81Ñ\82Ñ\83пнай Ð¿Ñ\80Ñ\8bÑ\87Ñ\8bнÑ\8b|наÑ\81Ñ\82Ñ\83пнÑ\8bÑ\85 Ð¿Ñ\80Ñ\8bÑ\87Ñ\8bнаÑ\9e}}:',
 'recreate-moveddeleted-warn' => "'''Увага: Вы ствараеце старонку, якая раней была выдаленая.'''
 
 Упэўніцеся, што стварэньне гэтай старонкі неабходнае.
@@ -1091,6 +1088,8 @@ $2
 'content-not-allowed-here' => 'Зьмест тыпу «$1» на старонцы [[$2]] не дазволены',
 'editwarning-warning' => 'Пакінуўшы гэтую старонку, вы можаце страціць усе ўнесеныя зьмены.
 Калі вы ўвайшлі ў сыстэму, Вы можаце адключыць гэтае папярэджаньне ў сэкцыі «Рэдагаваньне» вашых наладаў.',
+'editpage-notsupportedcontentformat-title' => 'Фармат зьмесьціва не падтрымліваецца',
+'editpage-notsupportedcontentformat-text' => 'Фармат зьмесьціва $1 не падтрымліваецца мадэльлю зьмесьціва $2.',
 
 # Content models
 'content-model-wikitext' => 'вікі-тэкст',
@@ -1203,14 +1202,15 @@ $2
 'revdelete-no-file' => 'Пазначаны файл не існуе.',
 'revdelete-show-file-confirm' => 'Вы ўпэўненыя, што жадаеце паглядзець выдаленую вэрсію файла «<nowiki>$1</nowiki>» ад $2 $3?',
 'revdelete-show-file-submit' => 'Так',
-'revdelete-selected' => "'''{{PLURAL:$2|1=Выбраная вэрсія|Выбраныя вэрсіі}} старонкі [[:$1]]:'''",
-'logdelete-selected' => "'''{{PLURAL:$1|1=Выбраны запіс|Выбраныя запісы}} журнала падзеяў:'''",
+'revdelete-selected' => "'''{{PLURAL:$2|Выбраная вэрсія|Выбраныя вэрсіі}} старонкі [[:$1]]:'''",
+'logdelete-selected' => "'''{{PLURAL:$1|Выбраны запіс|Выбраныя запісы}} журнала:'''",
 'revdelete-text' => "'''Выдаленыя вэрсіі і падзеі будуць паказвацца ў гісторыі старонкі і журналах, але частка іх зьместу ня будзе даступная для звычайных удзельнікаў.'''
 Іншыя адміністратары {{GRAMMAR:родны|{{SITENAME}}}} будуць мець магчымасьць прагляду зьместу і аднаўленьня старонкі праз гэты інтэрфэйс, калі ня будуць уведзеныя дадатковыя абмежаваньні.",
 'revdelete-confirm' => 'Калі ласка, пацьвердзіце, што Вы сапраўды жадаеце зрабіць гэта, разумееце наступствы і робіце гэта ў адпаведнасьці з [[{{MediaWiki:Policy-url}}|правіламі]].',
-'revdelete-suppress-text' => "Схаваньні могуць выкарыстоўвацца '''толькі''' ў наступных выпадках:
-* Раскрыцьцё асабістых зьвестак
-*: ''хатнія адрасы, тэлефонныя нумары, нумары пашпартоў і г.д.''",
+'revdelete-suppress-text' => "Скрываньне можа выкарыстоўвацца '''толькі''' ў наступных выпадках:
+* патэнцыйна паклёпніцкая інфармацыя
+* раскрыцьцё асабістых зьвестак
+*: ''хатнія адрасы, тэлефонныя нумары, нумары пашпартоў і г. д.''",
 'revdelete-legend' => 'Усталяваць абмежаваньні бачнасьці',
 'revdelete-hide-text' => 'Схаваць тэкст вэрсіі',
 'revdelete-hide-image' => 'Схаваць зьмест файла',
@@ -1348,7 +1348,7 @@ $1",
 'searchall' => 'усе',
 'showingresults' => "Ніжэй {{PLURAL:$1|паданы|паданыя|паданыя}} да '''$1''' {{PLURAL:$1|выніку|вынікаў|вынікаў}}, пачынаючы з #<b>$2</b>.",
 'showingresultsnum' => "Ніжэй паказаны сьпіс з '''$3''' {{PLURAL:$3|выніка|вынікаў|вынікаў}}, пачынаючы ад № '''$2'''.",
-'showingresultsheader' => "{{PLURAL:$5|1=Вынік '''$1''' з '''$3'''|Вынікі '''$1 - $2''' з '''$3'''}} для '''$4'''",
+'showingresultsheader' => "{{PLURAL:$5|Вынік '''$1''' з '''$3'''|Вынікі '''$1—$2''' з '''$3'''}} для '''$4'''",
 'search-nonefound' => 'Супадзеньняў па запыце ня знойдзена.',
 'powersearch-legend' => 'Удасканалены пошук',
 'powersearch-ns' => 'Шукаць у прасторах назваў:',
@@ -1972,7 +1972,7 @@ $1',
 'filehist-comment' => 'Камэнтар',
 'filehist-missing' => 'Файл адсутнічае',
 'imagelinks' => 'Выкарыстаньне файла',
-'linkstoimage' => '{{PLURAL:$1|1=Наступная старонка спасылаецца|Наступныя старонкі спасылаюцца}} на гэты файл:',
+'linkstoimage' => '$1 {{PLURAL:$1|наступная старонка спасылаецца|наступных старонак спасылаюцца|наступныя старонкі спасылаюцца}} на гэты файл:',
 'linkstoimage-more' => 'Больш чым $1 {{PLURAL:$1|старонка спасылаецца|старонкі спасылаюцца|старонак спасылаюцца}} на гэты файл.
 У гэтым сьпісе толькі $1 {{PLURAL:$1|спасылка|спасылкі|спасылак}} на гэты файл.
 Даступны таксама [[Special:WhatLinksHere/$2|поўны сьпіс]].',
@@ -2430,6 +2430,7 @@ $UNWATCHURL
 Выдаленьне такіх старонак было забароненае, каб пазьбегнуць праблемаў у працы {{GRAMMAR:родны|{{SITENAME}}}}.',
 'delete-warning-toobig' => 'Гэтая старонка мае доўгую гісторыю рэдагаваньняў, больш за $1 {{PLURAL:$1|вэрсію|вэрсіі|вэрсіяў}}.
 Яе выдаленьне можа выклікаць праблемы ў працы базы зьвестак {{GRAMMAR:родны|{{SITENAME}}}}; будзьце асьцярожны.',
+'deleting-backlinks-warning' => "'''Увага:''' іншыя старонкі спасылаюцца на старонку, якую вы зьбіраецеся выдаліць.",
 
 # Rollback
 'rollback' => 'Адкаціць рэдагаваньні',
@@ -3183,7 +3184,7 @@ $1',
 'svg-long-desc' => 'SVG-файл, намінальна $1 × $2 {{PLURAL:$2|піксэл|піксэлы|піксэлаў}}, памер файла: $3.',
 'svg-long-desc-animated' => 'Анімаваны SVG-файл, намінальна $1 × $2 {{PLURAL:$2|піксэл|піксэлы|піксэлаў}}, памер файла: $3',
 'svg-long-error' => 'Няслушны SVG-файл: $1',
-'show-big-image' => 'Ð\9dайлепÑ\88ае Ñ\80азÑ\80озÑ\8cненÑ\8cне',
+'show-big-image' => 'Ð\90Ñ\80Ñ\8bгÑ\96налÑ\8cнÑ\8b Ñ\84айл',
 'show-big-image-preview' => 'Памер прагляду: $1.',
 'show-big-image-other' => '{{PLURAL:$2|1=Іншае разрозьненьне|Іншыя разрозьненьні}}: $1.',
 'show-big-image-size' => '$1 × $2 піксэлаў',
index 0799f63..cd24dcd 100644 (file)
@@ -252,7 +252,6 @@ $messages = array(
 'tog-numberheadings' => 'Номериране на заглавията',
 'tog-showtoolbar' => 'Показване на инструментите за редактиране',
 'tog-editondblclick' => 'Редактиране на страниците чрез двойно щракване',
-'tog-editsection' => 'Възможност за редактиране на раздел чрез препратка [редактиране]',
 'tog-editsectiononrightclick' => 'Възможност за редактиране на раздел при щракване с десния бутон върху заглавието му',
 'tog-showtoc' => 'Показване на съдържание (за страници с повече от три раздела)',
 'tog-rememberpassword' => 'Запомяне на паролата ми в този браузър (за не повече от $1 {{PLURAL:$1|ден|дни}})',
index 4d49bd7..60b6eb7 100644 (file)
@@ -154,7 +154,6 @@ $messages = array(
 'tog-numberheadings' => 'Bari numur judul utumatis',
 'tog-showtoolbar' => 'Tampaiakan bilah-pakakas babak (parlu ada JavaScript)',
 'tog-editondblclick' => 'Babak tutungkaran wan klik ganda (parlu ada JavaScript)',
-'tog-editsection' => "Kawa'akan pambabakan sub-hagian malalui tautan [babak]",
 'tog-editsectiononrightclick' => "Kawa'akan mambabak sub-hagian lawan mang-klik kanan pada judul hagian (parlu ada JavaScript)",
 'tog-showtoc' => 'Tampaiakan daptar isi (gasan tungkaran-tungkaran nang baisi labih dari 3 subbagian)',
 'tog-rememberpassword' => 'Ingatakan babuat log ulun pada panjalajah web ini (gasan salawas $1{{PLURAL:$1|hari|hahari}})',
index 9a1dfe4..1da9083 100644 (file)
@@ -23,6 +23,7 @@
  * @author Samritmaity
  * @author Sayak Sarkar
  * @author Sm faysal
+ * @author Tauhid16
  * @author Usarker
  * @author Wikitanvir
  * @author Zaheen
@@ -82,7 +83,6 @@ $messages = array(
 'tog-numberheadings' => 'শিরোনামগুলোকে স্বয়ংক্রিয়ভাবে ক্রমিক নম্বর দাও',
 'tog-showtoolbar' => 'সম্পাদনা টুলবার দেখাও',
 'tog-editondblclick' => 'দুইবার ক্লিক করে পাতা সম্পাদনা',
-'tog-editsection' => '[সম্পাদনা] সংযোগের সাহায্যে পরিচ্ছেদ সম্পাদনা করার ক্ষমতা দেয়া হোক',
 'tog-editsectiononrightclick' => 'পরিচ্ছেদের শিরোনামে ডান ক্লিকের মাধ্যমে সম্পাদনা করার ক্ষমতা দেয়া হোক',
 'tog-showtoc' => 'সূচিপত্র দেখানো হোক (৩টির বেশি পরিচ্ছেদের শিরোনামবিশিষ্ট পাতার জন্য)',
 'tog-rememberpassword' => 'এই ব্রাউজারে আমার লগ ইন তথ্য (শব্দচাবি) মনে রাখো (সর্বোচ্চ $1 {{PLURAL:$1|দিনের|দিনের}} জন্য)',
@@ -1141,6 +1141,7 @@ $1",
 'search-result-score' => 'মিলেছে: $1%',
 'search-redirect' => '(পুনর্নিদেশনা $1)',
 'search-section' => '(অনুচ্ছেদ $1)',
+'search-file-match' => '(নথির বিষয়বস্তু মিলে যায়)',
 'search-suggest' => 'আপনি সম্ভবত বুঝাতে চাইছেন: $1',
 'search-interwiki-caption' => 'সহপ্রকল্পসমূহ',
 'search-interwiki-default' => '$1 ফলাফলসমূহ:',
@@ -1944,7 +1945,7 @@ Maybe you want to edit the description on its [$2 file description page] there.'
 'mostinterwikis' => 'সবচেয়ে বেশী ইন্টারউইকি লিংক-সমৃদ্ধ নিবন্ধসমূহ',
 'mostrevisions' => 'সবচেয়ে বেশী বার সম্পাদিত নিবন্ধসমূহ',
 'prefixindex' => 'উপসর্গ সহ সমস্ত পাতা',
-'prefixindex-namespace' => 'পà§\8dরিফিà¦\95à§\8dস à¦¸à¦®à§\8dপবলিত সকল পাতা ($1 নামস্থান)',
+'prefixindex-namespace' => 'à¦\89পসরà§\8dà¦\97 à¦¸à¦¹ সকল পাতা ($1 নামস্থান)',
 'prefixindex-strip' => 'তালিকা থেকে প্রিফিক্স সরাও',
 'shortpages' => 'সংক্ষিপ্ত পাতাসমূহ',
 'longpages' => 'দীর্ঘ পাতাসমূহ',
@@ -1953,6 +1954,7 @@ Maybe you want to edit the description on its [$2 file description page] there.'
 'protectedpages' => 'সুরক্ষিত পাতাসমূহ',
 'protectedpages-indef' => 'শুধুমাত্র অসীম সুরক্ষা',
 'protectedpages-cascade' => 'শুধুমাত্র প্রপাতাকার সুরক্ষা',
+'protectedpages-noredirect' => 'পুনর্নির্দেশনাগুলো লুকাও',
 'protectedpagesempty' => 'কোন পাতা বর্তমানে এই প্যারামিটারগুলিসহ সুরক্ষিত নয়।',
 'protectedtitles' => 'সুরক্ষিত শিরোনামগুলি',
 'protectedtitlesempty' => 'কোন শিরোনাম বর্তমানে এই প্যারামিটারগুলিসহ সুরক্ষিত নয়।',
@@ -2204,7 +2206,7 @@ $UNWATCHURL
 'exblank' => 'পাতাটি খালি ছিল',
 'delete-confirm' => '"$1" অপসারণ',
 'delete-legend' => 'অপসারণ',
-'historywarning' => "'''সতরà§\8dà¦\95à§\80à¦\95রণ:''' à¦\8fà¦\87 à¦ªà¦¾à¦¤à¦¾à¦\9fি à¦®à§\81à¦\9bà§\87 à¦«à§\87লা à¦¹à¦¬à§\87 à¦¯à¦¾à¦° à¦\87তিহাস à¦¸à¦\82à¦\96à§\8dযা à¦ªà§\8dরায় $1 {{PLURAL:$1|সংশোধন|সংশোধন}}:",
+'historywarning' => "'''সতরà§\8dà¦\95à§\80à¦\95রণ:''' à¦¯à§\87 à¦ªà¦¾à¦¤à¦¾à¦\9fি à¦\86পনি à¦®à§\81à¦\9bà§\87 à¦«à§\87লতà§\87 à¦¯à¦¾à¦\9aà§\8dà¦\9bà§\87ন à¦¤à¦¾à¦° à¦\87তিহাসà§\87র à¦¸à¦\82à¦\96à§\8dযা à¦ªà§\8dরায় $1à¦\9fি {{PLURAL:$1|সংশোধন|সংশোধন}}:",
 'confirmdeletetext' => 'আপনি একটি পাতা সেটির সমস্ত ইতিহাসসহ মুছে ফেলতে যাচ্ছেন।
 অনুগ্রহ করে নিশ্চিত করুন আপনি আসলেই এটি করতে চান, আপনি এর ফলাফল সম্পর্কে অবহিত, এবং আপনি [[{{MediaWiki:Policy-url}}|নীতিমালা]] মেনে এটি করছেন।',
 'actioncomplete' => 'কাজটি নিষ্পন্ন হয়েছে',
@@ -2229,6 +2231,7 @@ $UNWATCHURL
 'delete-warning-toobig' => 'এই পাতাটির একটি বৃহৎ সম্পাদনা ইতিহাস রয়েছে, যা $1 {{PLURAL:$1|সংস্করণেরও|সংস্করণেরও}} বেশি।
 এই পাতাটি মুছে ফেললে তা {{SITENAME}} সাইটের ডেটাবেজ সমস্যার কারণ হতে পারে;
 সাবধানতার সাথে এগিয়ে যান।',
+'deleting-backlinks-warning' => "'''সতর্কীকরণ:''' আপনি যেটি মুছে ফেলতে যাচ্ছেন তা অন্যান্য পাতাসমূহের সাথে সংযুক্ত আছে।",
 
 # Rollback
 'rollback' => 'সম্পাদনা ফিরিয়ে নিন',
@@ -3657,6 +3660,12 @@ $4-এ নিশ্চিতকরণ কোডটি মেয়াদোত
 'version-hook-subscribedby' => 'সাবস্ক্রাইব করেছেন',
 'version-version' => '(সংস্করণ $1)',
 '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-poweredby-credits' => "এইক উইকিটি পরিচালিত হচ্ছে '''[https://www.mediawiki.org/ মিডিয়াউইকি]'''-এর মাধ্যমে, কপিরাইট © ২০০১-$1 $2।",
 'version-poweredby-others' => 'অন্যান্য',
 'version-poweredby-translators' => 'translatewiki.net অনুবাদকগণ',
@@ -3674,13 +3683,14 @@ $4-এ নিশ্চিতকরণ কোডটি মেয়াদোত
 'version-entrypoints-header-url' => 'ইউআরএল',
 
 # Special:Redirect
-'redirect' => 'ফাà¦\87ল, à¦¬à§\8dযবহারà¦\95রà§\80, à¦\85থবা à¦°à¦¿à¦­à¦¿à¦¶ন আইডি দ্বারা পুনঃনির্দেশ করা হয়েছে',
+'redirect' => 'পাতা, à¦«à¦¾à¦\87ল, à¦¬à§\8dযবহারà¦\95রà§\80, à¦\85থবা à¦¸à¦\82শà§\8bধন আইডি দ্বারা পুনঃনির্দেশ করা হয়েছে',
 'redirect-legend' => 'একটি ফাইল অথবা পাতায় পুনঃনির্দেশ করা হয়েছে',
 'redirect-summary' => 'এই বিশেষ পাতাটি পুনঃনির্দেশিত হয়েছে একটি ফাইলে (ফাইলের নাম), একটি পাতা (রিভিশন আইডি), অথবা একটি ব্যবহারকরী পাতায় (সংখ্যায় লেখা ব্যবহারকারী আইডি)। ব্যবহার: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/revision/328429]], or [[{{#Special:Redirect}}/user/101]]।',
 'redirect-submit' => 'যাও',
 'redirect-lookup' => 'দেখুন:',
 'redirect-value' => 'মান:',
 'redirect-user' => 'ব্যবহারকারী আইডি',
+'redirect-page' => 'পাতার আইডি',
 'redirect-revision' => 'পাতা সংস্করণ',
 'redirect-file' => 'ফাইলের নাম',
 'redirect-not-exists' => 'মান পাওয়া যায়নি',
index 3b2bffb..8f92cba 100644 (file)
@@ -190,7 +190,6 @@ $messages = array(
 'tog-numberheadings' => 'Niverenniñ emgefre an titloù',
 'tog-showtoolbar' => 'Diskouez ar varrenn ostilhoù aozañ',
 'tog-editondblclick' => 'Daouglikañ evit kemmañ pajennoù',
-'tog-editsection' => 'Kemmañ ur rann dre al liammoù [kemmañ]',
 'tog-editsectiononrightclick' => 'Kemmañ ur rann dre glikañ a-zehou war titl ar rann',
 'tog-showtoc' => 'Diskouez an daolenn<br /> (evit ar pennadoù zo ouzhpenn 3 rann enno)',
 'tog-rememberpassword' => "Derc'hel soñj eus ma ger-tremen war an urzhiataer-mañ (evit $1 devezh{{PLURAL:$1||}} d'ar muiañ)",
@@ -579,6 +578,7 @@ Setu amañ perak ''$2''.",
 'invalidtitle-unknownnamespace' => 'Titl direizh gant an niverenn esaouenn anv $1 hag an destenn "$2" dianav',
 'exception-nologin' => "N'oc'h ket kevreet",
 'exception-nologin-text' => "Ar bajenn-mañ pe an ober-mañ a c'houlenn e vefec'h kevreet er wiki-mañ.",
+'exception-nologin-text-manual' => "$1, mar plij, evit gallout mont d'ar bajenn-mañ pe ober an dra-mañ",
 
 # Virus scanner
 'virus-badscanner' => "Kefluniadur fall : skanner viruzoù dianav : ''$1''",
@@ -635,7 +635,7 @@ Na zisoñjit ket resisaat ho [[Special:Preferences|penndibaboù evit {{SITENAME}
 'createacct-emailoptional' => "Chomlec'h postel (direizh)",
 'createacct-email-ph' => "Skrivit ho chomlec'h postel",
 'createacct-another-email-ph' => "Ebarzhiñ ur chomlec'h postel",
-'createaccountmail' => 'Dre bostel',
+'createaccountmail' => "Implijout ur ger-tremen dibad ha kas anezhañ d'ar chomlec'h postel diferetDre bostel",
 'createacct-realname' => 'Anv gwir (diret)',
 'createaccountreason' => 'Abeg :',
 'createacct-reason' => 'Abeg',
@@ -672,7 +672,7 @@ Gwiriit eo bet skrivet mat an anv ganeoc\'h pe [[Special:UserLogin/signup|krouit
 'passwordtooshort' => '{{PLURAL:$1|1 arouezenn|$1 arouezenn}} hir a rank bezañ ar gerioù-tremen da nebeutañ.',
 'password-name-match' => "Rankout a ra ho ker-tremen bezañ disheñvel diouzh hoc'h anv implijer.",
 'password-login-forbidden' => 'Berzet eo ober gant an anv-implijer hag ar ger-tremen-mañ.',
-'mailmypassword' => 'Kasit din ur ger-tremen nevez',
+'mailmypassword' => 'Adderaouekaat ar ger-tremen',
 'passwordremindertitle' => 'Ho ker-tremen berrbad nevez evit {{SITENAME}}',
 'passwordremindertext' => "Unan bennak (c'hwi moarvat gant ar chomlec'h IP \$1)
 en deus goulennet ma vo kaset dezhañ ur ger-tremen nevez evit {{SITENAME}} (\$4).
@@ -1554,7 +1554,8 @@ Ma skrivit anezhañ e vo implijet evit lakaat war wel ar pezh a vo bet degaset g
 'recentchanges-label-bot' => "Gant ur bot eo bet degaset ar c'hemm-mañ.",
 'recentchanges-label-unpatrolled' => "N'eo ket bet gwiriet ar c'hemm-mañ evit c'hoazh.",
 'recentchanges-label-plusminus' => 'Kemmet eo ment ar bajenn eus an niver-mañ a oktedoù',
-'recentchanges-legend-newpage' => '(gwelet ivez [[Dibar:PajennoùNevez|roll ar pajennoù nevez krouet]])',
+'recentchanges-legend-heading' => '"Alc\'hwez :"',
+'recentchanges-legend-newpage' => '(gwelet ivez [[Special:NewPages|roll ar pajennoù nevez]])',
 'rcnotefrom' => "Setu aze roll ar c'hemmoù c'hoarvezet abaoe an '''$2''' ('''$1''' d'ar muiañ).",
 'rclistfrom' => "Diskouez ar c'hemmoù diwezhañ abaoe an $1.",
 'rcshowhideminor' => "$1 ar c'hemmoù dister",
@@ -2012,6 +2013,7 @@ $1 {{PLURAL:$1|rummad|rummad}}',
 'ninterwikis' => ' {{PLURAL:$1|interwiki|interwikis}}',
 'nlinks' => '$1 {{PLURAL:$1|liamm|liamm}}',
 'nmembers' => '$1 {{PLURAL:$1|elfenn|elfenn}}',
+'nmemberschanged' => '$1 → $2 {{PLURAL:$2|ezel}}',
 'nrevisions' => '$1 {{PLURAL:$1|stumm|stumm}}',
 'nviews' => '$1 {{PLURAL:$1|selladenn|selladenn}}',
 'nimagelinks' => 'Implijet e $1 {{PLURAL:$1|pajenn|pajenn}}',
@@ -2050,6 +2052,7 @@ $1 {{PLURAL:$1|rummad|rummad}}',
 'protectedpages' => 'Pajennoù gwarezet',
 'protectedpages-indef' => 'Gwarezoù da badout hepken',
 'protectedpages-cascade' => 'Gwarez dre skalierad hepken',
+'protectedpages-noredirect' => 'Kuzhat an adkasoù',
 'protectedpagesempty' => "N'eus pajenn gwarezet ebet gant an arventennoù-mañ evit poent.",
 'protectedtitles' => 'Titloù gwarezet',
 'protectedtitlesempty' => "N'eus bet gwarezet titl ebet dezhañ an arventennoù-se evit poent.",
@@ -3748,6 +3751,14 @@ Gallout a rit [[Special:EditWatchlist|implijout an aozer boutin ivez]].',
 'version-hook-subscribedby' => 'Termenet gant',
 'version-version' => '($1)',
 'version-license' => 'Aotre-implijout MediaWiki',
+'version-ext-license' => 'Aotre-implijout',
+'version-ext-colheader-name' => 'Astenn',
+'version-ext-colheader-version' => 'Stumm',
+'version-ext-colheader-license' => 'Aotre-implijout',
+'version-ext-colheader-description' => 'Deskrivadur',
+'version-ext-colheader-credits' => 'Aozerien',
+'version-license-title' => 'Aotre-implijout evit $1',
+'version-credits-title' => 'Kredoù evit $1',
 'version-poweredby-credits' => "Mont a ra ar wiki-mañ en-dro a-drugarez da '''[https://www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
 'version-poweredby-others' => 're all',
 'version-poweredby-translators' => 'troerien translatewiki.net',
@@ -3770,6 +3781,7 @@ Sañset oc'h bezañ resevet [{{SERVER}}{{SCRIPTPATH}}/COPYING un eilskrid eus ar
 'redirect-lookup' => 'Klask :',
 'redirect-value' => 'Talvoud :',
 'redirect-user' => 'ID an implijer',
+'redirect-page' => 'ID ar bajenn',
 'redirect-revision' => 'Adwel ar bajenn',
 'redirect-file' => 'Anv ar restr',
 'redirect-not-exists' => "Talvoud n'eo ket bet kavet",
@@ -3981,6 +3993,9 @@ A-hend-all e c'hallit ober gant ar furmskrid eeunaet dindan. Ouzhpennet e vo hoc
 'duration-centuries' => "$1 {{PLURAL:$1|c'hantved|kantved}}",
 'duration-millennia' => '$1 {{PLURAL:$1|milvloaz|milvoaz}}',
 
+# Image rotation
+'rotate-comment' => 'Skeudenn troet eus $1 {{PLURAL:$1|derez}} a-du gant an heol',
+
 # Limit report
 'limitreport-cputime' => 'Amzer implij ar CPU',
 'limitreport-cputime-value' => '$1 {{PLURAL:$1|eiladenn}}',
@@ -3989,6 +4004,7 @@ A-hend-all e c'hallit ober gant ar furmskrid eeunaet dindan. Ouzhpennet e vo hoc
 'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|okted}}',
 'limitreport-templateargumentsize' => 'Ment arguzenn ar patrom',
 'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|okted}}',
+'limitreport-expansiondepth' => 'Donder astenn brasañ',
 
 # Special:ExpandTemplates
 'expandtemplates' => 'Emled ar patromoù',
@@ -4005,6 +4021,7 @@ Ober a ra kement-mañ dre c'hervel ar bazenn a zegouezh digant parser MediaWiki
 'expand_templates_remove_comments' => 'Lemel an notennoù kuit',
 'expand_templates_remove_nowiki' => "Diverkañ a ra ar balizennoù <nowiki> en disoc'h",
 'expand_templates_generate_xml' => 'Gwelet ar gwezennadur XML',
+'expand_templates_generate_rawhtml' => 'Diskouez an HTML kriz',
 'expand_templates_preview' => 'Rakwelet',
 
 );
index a49465e..fff7c54 100644 (file)
@@ -291,7 +291,6 @@ $messages = array(
 'tog-numberheadings' => 'Automatski numeriši podnaslove',
 'tog-showtoolbar' => 'Prikaži traku s alatkama za uređivanje',
 'tog-editondblclick' => 'Izmijeni stranice dvostrukim klikom',
-'tog-editsection' => 'Omogući da mijenjam pojedinačne odjeljke putem [uredi] linka',
 'tog-editsectiononrightclick' => 'Uključite uređivanje odjeljka sa pritiskom na desno dugme miša u naslovu odjeljka',
 'tog-showtoc' => 'Prikaži sadržaj (u svim stranicama sa više od tri podnaslova)',
 'tog-rememberpassword' => 'Zapamti moju šifru u ovom pregledniku (najviše $1 {{PLURAL:$1|dan|dana}})',
@@ -408,7 +407,7 @@ $messages = array(
 'category-empty' => "''Ova kategorija trenutno ne sadrži članke ni medije.''",
 'hidden-categories' => '{{PLURAL:$1|Sakrivena kategorija|Sakrivene kategorije}}',
 'hidden-category-category' => 'Sakrivene kategorije',
-'category-subcat-count' => '{{PLURAL:$2|Ova kategorija ima sljedeću podkategoriju.|Ova kategorija ima {{PLURAL:$1|sljedeće podkategorije|sljedećih $1 podkategorija}}, od $2 ukupno.}}',
+'category-subcat-count' => '{{PLURAL:$2|Ova kategorija ima sljedeću podkategoriju.|Ova kategorija ima {{PLURAL:$1|sljedeću podkategoriju|sljedeće $1 podkategorije|sljedećih $1 podkategorija}}, od $2 ukupno.}}',
 'category-subcat-count-limited' => 'Ova kategorija sadrži {{PLURAL:$1|slijedeću $1 podkategoriju|slijedeće $1 podkategorije|slijedećih $1 podkategorija}}.',
 'category-article-count' => '{{PLURAL:$2|U ovoj kategoriji se nalazi $1 članak.|{{PLURAL:$1|Prikazan je $1 članak|Prikazana su $1 članka|Prikazano je $1 članaka}} od ukupno $2 u ovoj kategoriji.}}',
 'category-article-count-limited' => '{{PLURAL:$1|Slijedeća $1 stranica je|Slijedeće $1 stranice su|Slijedećih $1 stranica je}} u ovoj kategoriji.',
@@ -1669,7 +1668,7 @@ Ako izaberete da date ime, biće korišteno za pripisivanje za vaš rad.',
 'rclistfrom' => 'Prikaži nove izmjene počev od $1',
 'rcshowhideminor' => '$1 male izmjene',
 'rcshowhidebots' => '$1 botove',
-'rcshowhideliu' => '$1 prijavljene korisnike',
+'rcshowhideliu' => '$1 registrovanih korisnika',
 'rcshowhideanons' => '$1 anonimne korisnike',
 'rcshowhidepatr' => '$1 patrolirane izmjene',
 'rcshowhidemine' => '$1 moje izmjene',
@@ -3104,6 +3103,7 @@ Ovo je vjerovatno izazvao vezom ka vanjskoj nepoželjnoj stranici.',
 'pageinfo-length' => 'Dužina stranice (u bajtovima)',
 'pageinfo-article-id' => 'ID stranice',
 'pageinfo-language' => 'Jezik sadržaja stranice',
+'pageinfo-content-model' => 'Model sadržaj stranice',
 'pageinfo-robot-policy' => 'Indeksiranje od strane robota',
 'pageinfo-robot-index' => 'Dozvoljeno',
 'pageinfo-robot-noindex' => 'Nije dozvoljeno',
@@ -3186,7 +3186,7 @@ $1',
 'svg-long-desc' => 'SVG fajl, dozvoljeno $1 × $2 piksela, veličina fajla: $3',
 'svg-long-desc-animated' => 'Animirana SVG datoteka, nominalno: $1 × $2 piksela, veličina datoteke: $3',
 'svg-long-error' => 'Nevaljana SVG datoteka: $1',
-'show-big-image' => 'Vidi sliku u punoj veličini (rezoluciji)',
+'show-big-image' => 'Izvorna datoteka',
 'show-big-image-preview' => 'Veličina ovog prikaza: $1.',
 'show-big-image-other' => '{{PLURAL:$2|Druga rezolucija|Ostale rezolucije}}: $1.',
 'show-big-image-size' => '$1 × $2 piksela',
index fdf3ec0..3e6e4ee 100644 (file)
@@ -214,7 +214,6 @@ $messages = array(
 'tog-numberheadings' => 'Enumera automàticament els encapçalaments',
 'tog-showtoolbar' => "Mostra la barra d'eines d'edició (cal JavaScript)",
 'tog-editondblclick' => 'Edita les pàgines amb un doble clic (cal JavaScript)',
-'tog-editsection' => 'Activa la modificació de seccions mitjançant els enllaços [modifica]',
 'tog-editsectiononrightclick' => "Habilita l'edició per seccions en clicar amb el botó dret sobre els títols de les seccions (cal JavaScript)",
 'tog-showtoc' => 'Mostra la taula de continguts (per pàgines amb més de 3 seccions)',
 'tog-rememberpassword' => 'Recorda la sessió al navegador (per un màxim de {{PLURAL:$1|dia|dies}})',
@@ -757,6 +756,8 @@ Si decidiu proporcionar-lo, s'utilitzarà per a reconèixer a l'usuari el seu tr
 'retypenew' => 'Torneu a escriure la nova contrasenya:',
 'resetpass_submit' => 'Definiu una contrasenya i inicieu una sessió',
 'changepassword-success' => "S'ha canviat la vostra contrasenya amb èxit!",
+'changepassword-throttled' => "Heu realitzat massa intents d'inici de sessió.
+Espereu $1 abans de tornar-ho a provar.",
 'resetpass_forbidden' => 'No poden canviar-se les contrasenyes',
 'resetpass-no-info' => "Heu d'estar registrats en un compte per a poder accedir directament a aquesta pàgina.",
 'resetpass-submit-loggedin' => 'Canvia la contrasenya',
@@ -808,6 +809,8 @@ Contrasenya temporal: $2",
 'changeemail-password' => 'La vostra contrasenya a {{SITENAME}}:',
 'changeemail-submit' => 'Canvia de correu electrònic',
 'changeemail-cancel' => 'Cancel·la',
+'changeemail-throttled' => "Heu realitzat massa intents d'inici de sessió.
+Espereu $1 abans de tornar-ho a provar.",
 
 # Special:ResetTokens
 'resettokens' => 'Reinicia els testimonis',
@@ -1025,6 +1028,8 @@ Ja existeix.",
 'content-not-allowed-here' => 'No és permés el contingut "$1" a la pàgina [[$2]]',
 'editwarning-warning' => "Si sortiu d'aquesta pàgina perdreu tots els canvis que hàgiu fet.
 Si teniu un compte d'usuari, podeu eliminar aquest avís a la secció «Caixa d'edició» de les vostres preferències.",
+'editpage-notsupportedcontentformat-title' => "No s'admet el format del contingut",
+'editpage-notsupportedcontentformat-text' => "No s'admet el format del contingut $1 pel model de contingut $2.",
 
 # Content models
 'content-model-wikitext' => 'wikitext',
@@ -1275,6 +1280,7 @@ Es pot trobar més informació en el [{{fullurl:{{#Special:Log}}/delete|page={{F
 'search-result-score' => 'Rellevància: $1%',
 'search-redirect' => '(redirigit des de $1)',
 'search-section' => '(secció $1)',
+'search-file-match' => '(coincideix amb el contingut del fitxer)',
 'search-suggest' => 'Volíeu dir: $1',
 'search-interwiki-caption' => 'Projectes germans',
 'search-interwiki-default' => '$1 resultats:',
@@ -1717,6 +1723,7 @@ Si us plau, torneu enrere i carregueu aquest fitxer sota un altre nom. [[File:$1
 Si us plau, si encara desitgeu carregar el vostre fitxer, torneu enrera i carregueu-ne una còpia amb un altre nom. [[File:$1|thumb|center|$1]]',
 'file-exists-duplicate' => 'Aquest fitxer és un duplicat {{PLURAL:$1|del fitxer |dels següents fitxers:}}',
 'file-deleted-duplicate' => "S'ha suprimit anteriorment un fitxer idèntic a aquest ([[:$1]]). Hauríeu de comprovar el registre de supressions del fitxer abans de tornar-lo a carregar.",
+'file-deleted-duplicate-notitle' => 'Un fitxer idèntic a aquest fitxer havia estat suprimit abans, i també el títol. Hauríeu de demanar a algú que pugui veure les dades suprimides del fitxer que revisi la situació abans de procedir a tornar a carregar-lo.',
 'uploadwarning' => 'Avís de càrrega',
 'uploadwarning-text' => 'Modifiqueu la descripció de la imatge i torneu a intentar-ho.',
 'savefile' => 'Desa el fitxer',
@@ -1747,7 +1754,7 @@ Si us plau, si encara desitgeu carregar el vostre fitxer, torneu enrera i carreg
 
 $1',
 'upload-warning-subj' => 'Avís de càrrega',
-'upload-warning-msg' => 'Hi ha hagut un problema amb la teva càrrega de [$2]. Pots tornar a [[Special:Upload/stash/$1|formulari de càrrega]] per corregir aquest problema.',
+'upload-warning-msg' => 'Hi ha hagut un problema amb la càrrega de [$2]. Podeu tornar a [[Special:Upload/stash/$1|formulari de càrrega]] per corregir aquest problema.',
 
 'upload-proto-error' => 'El protocol és incorrecte',
 'upload-proto-error-text' => 'Per a les càrregues remotes cal que els URL comencin amb <code>http://</code> o <code>ftp://</code>.',
@@ -1994,7 +2001,7 @@ Potser voleu modificar-ne la descripció en la seva [$2 pàgina de descripció].
 'statistics-pages' => 'Pàgines',
 'statistics-pages-desc' => 'Totes les pàgines del wiki, incloent les pàgines de discussió, redireccions, etc.',
 'statistics-files' => 'Fitxers carregats',
-'statistics-edits' => 'Edicions en pàgines des que el projecte {{SITENAME}} fou instaŀlat',
+'statistics-edits' => 'Edicions en pàgines des que el projecte {{SITENAME}} fou instalat',
 'statistics-edits-average' => 'Edicions per pàgina de mitjana',
 'statistics-views-total' => 'Visualitzacions totals',
 'statistics-views-total-desc' => "No hom inclou l'accès a pàgines inexistents o pàgines especials",
@@ -2353,7 +2360,7 @@ Vegeu $2 per a un registre dels esborrats més recents.",
 'delete-edit-reasonlist' => "Edita els motius d'eliminació",
 'delete-toobig' => "Aquesta pàgina té un historial d'edicions molt gran, amb més de $1 {{PLURAL:$1|canvi|canvis}}. L'eliminació d'aquestes pàgines està restringida per a prevenir que hi pugui haver un desajustament seriós de la base de dades de tot el projecte {{SITENAME}} per accident.",
 'delete-warning-toobig' => "Aquesta pàgina té un historial d'edicions molt gran, amb més de $1 {{PLURAL:$1|canvi|canvis}}. Eliminar-la podria suposar un seriós desajustament de la base de dades de tot el projecte {{SITENAME}}; aneu en compte abans dur a terme l'acció.",
-'deleting-backlinks-warning' => "'''Avís:''' Altres pàgines enllacen a la pàgina que esteu a punt de suprimir.",
+'deleting-backlinks-warning' => "'''Avís:''' Altres pàgines enllacen o transclouen de la pàgina que esteu a punt de suprimir.",
 
 # Rollback
 'rollback' => 'Reverteix edicions',
@@ -2592,6 +2599,7 @@ quines pàgines en concret estan sent vandalitzades).",
 Vegeu la [[Special:BlockList|llista de bloqueigs]] per revisar-los.",
 'ipb-blockingself' => 'Esteu a punt de blocar-vos a vós mateix! Esteu segurs de voler-ho fer?',
 'ipb-confirmhideuser' => "Esteu a punt de bloquejar un usuari que està marcat amb l'opció «amaga l'usuari». Això suprimirà el seu nom a totes les llistes i registres. Esteu segurs de voler-ho fer?",
+'ipb-confirmaction' => 'Si esteu segur que voleu fer-ho, marqueu el camp «{{int:ipb-confirm}}» a la part inferior.',
 'ipb-edit-dropdown' => 'Edita les raons per a blocar',
 'ipb-unblock-addr' => 'Desbloca $1',
 'ipb-unblock' => 'Desbloca un usuari o una adreça IP',
@@ -2655,7 +2663,7 @@ Per més detalls, a sota es mostra el registre de supressions:",
 'range_block_disabled' => 'La facultat dels administradors per a crear bloquejos de rang està desactivada.',
 'ipb_expiry_invalid' => "Data d'acabament no vàlida.",
 'ipb_expiry_temp' => "Els blocatges amb ocultació de nom d'usuari haurien de ser permanents.",
-'ipb_hide_invalid' => "No s'ha pogut eliminar el compte; potser té massa edicions.",
+'ipb_hide_invalid' => "No s'ha pogut eliminar el compte; té més {{PLURAL:$1|d'una edició|de $1 edicions}}.",
 'ipb_already_blocked' => '«$1» ja està blocat',
 'ipb-needreblock' => "L'usuari $1 ja està blocat. Voleu canviar-ne els paràmetres del blocatge?",
 'ipb-otherblocks-header' => 'Altres {{PLURAL:$1|bloquejos|bloquejos}}',
@@ -3765,7 +3773,17 @@ També podeu [[Special:EditWatchlist|utilitzar l'editor estàndard]].",
 'version-hook-name' => 'Nom del lligam',
 'version-hook-subscribedby' => 'Subscrit per',
 'version-version' => '(Versió $1)',
-'version-license' => 'Llicència',
+'version-license' => 'Llicència del MediaWiki',
+'version-ext-license' => 'Llicència',
+'version-ext-colheader-name' => 'Extensió',
+'version-ext-colheader-version' => 'Versió',
+'version-ext-colheader-license' => 'Llicència',
+'version-ext-colheader-description' => 'Descripció',
+'version-ext-colheader-credits' => 'Autors',
+'version-license-title' => 'Llicència de $1',
+'version-license-not-found' => "No s'ha trobat cap informació detallada de la llicència d'aquesta extensió.",
+'version-credits-title' => 'Crèdits de $1',
+'version-credits-not-found' => "No s'ha trobat cap informació detallada dels crèdits d'aquesta extensió.",
 'version-poweredby-credits' => "El wiki funciona gràcies a '''[https://www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
 'version-poweredby-others' => 'altres',
 'version-poweredby-translators' => 'Traductors de translatewiki.net',
@@ -3775,7 +3793,7 @@ També podeu [[Special:EditWatchlist|utilitzar l'editor estàndard]].",
 MediaWiki es distribueix en l'esperança de ser d'utilitat, però SENSE CAP GARANTIA; ni tan sols la garantia implícita de COMERCIALITZACIÓ o ADEQUACIÓ A UNA FINALITAT DETERMINADA. En trobareu més detalls a  la Llicència Pública General GNU.
 
 Amb aquest programa heu d'haver rebut [{{SERVER}}{{SCRIPTPATH}}/COPYING una còpia de la Llicència Pública General GNU]; si no és així, adreceu-vos a la Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA o bé [//www.gnu.org/licenses/old-licenses/gpl-2.0.html llegiu-la en línia].",
-'version-software' => 'Programari instaŀlat',
+'version-software' => 'Programari instalat',
 'version-software-product' => 'Producte',
 'version-software-version' => 'Versió',
 'version-entrypoints' => "URL de punts d'entrada",
@@ -3984,6 +4002,7 @@ Altrament, podeu fer servir un senzill formulari a continuació. El vostre comen
 'api-error-overwrite' => 'No està permès sobreescriure un fitxer existent.',
 'api-error-stashfailed' => 'Error intern: el servidor no ha pogut emmagatzemar fitxers temporals.',
 'api-error-publishfailed' => 'Error intern: el servidor no ha pogut publicar el fitxer temporal.',
+'api-error-stasherror' => "S'ha produït un error en carregar el fitxer al dipòsit.",
 'api-error-timeout' => 'El servidor no ha respost en el temps esperat.',
 'api-error-unclassified' => "S'ha produït un error desconegut",
 'api-error-unknown-code' => 'Error desconegut: «$1»',
@@ -4038,4 +4057,6 @@ També expandeix les funcions sintàctiques, com ara <code><nowiki>{{</nowiki>#l
 'expand_templates_generate_rawhtml' => "Mostra l'HTML sense filtrar",
 'expand_templates_preview' => 'Previsualitza',
 
+# Unknown messages
+'uploadinvalidxml' => "No s'ha pogut analitzar l'XML del fitxer carregat.",
 );
index a919930..83cecee 100644 (file)
@@ -329,7 +329,6 @@ $messages = array(
 'tog-numberheadings' => 'Ша шех хlитто терахь корташна',
 'tog-showtoolbar' => 'Гайта лакхара гӀирсан дакъа нисйеш аттон оц тадар чохь (JavaScript)',
 'tog-editondblclick' => 'Нисйе агӀонаш шозза тӀетаӀийча (JavaScript)',
-'tog-editsection' => 'Гайта хьажораг «нисйе» аьлла хӀора агӀона',
 'tog-editsectiononrightclick' => 'Нисде дакъа шозза бакъехьар дахка тӀетаӀийча оцу кортан (JavaScript)',
 'tog-showtoc' => 'Гойти коьртнаш (оцу агlонашна лаххара 3 коьртнашца)',
 'tog-rememberpassword' => 'Даглаца сан дӀаяздар хӀокху браузеран тӀяхь (цхьан $1 {{PLURAL:$1|де|динахь|ден}})',
@@ -736,7 +735,7 @@ URL язъеш гӀалат даьлла хила мега.
 'userlogin-yourpassword-ph' => 'Язъе хьай пароль',
 'createacct-yourpassword-ph' => 'Язъе пароль',
 'yourpasswordagain' => 'Юха язъе пароль:',
-'createacct-yourpasswordagain' => 'Бакъе пароль',
+'createacct-yourpasswordagain' => 'Бакъ йе пароль',
 'createacct-yourpasswordagain-ph' => 'Кхин цкъа язъе пароль',
 'remembermypassword' => 'Даглаца сан дӀаяздар хӀокху компьютеран тӀехь (цхьан $1 {{PLURAL:$1|динахь}})',
 'userlogin-remembermypassword' => 'Дагахь латт ве/е со',
@@ -767,10 +766,10 @@ URL язъеш гӀалат даьлла хила мега.
 'userlogin-createanother' => 'Кхолла декъашхочун кхин дӀаяздар',
 'createacct-join' => 'ДӀаязбе лахахь хай хаам.',
 'createacct-another-join' => 'Язбе лахахь керлачу декъашхочун дӀаяздаран хаам.',
-'createacct-emailrequired' => 'ЭлекÑ\82Ñ\80онни почтан адрес',
-'createacct-emailoptional' => 'ЭлекÑ\82Ñ\80онни почтан адрес (ца яздича мега)',
-'createacct-email-ph' => 'Ð\94Ó\80аÑ\8fзде Ñ\8dлекÑ\82Ñ\80онни почтан адрес',
-'createacct-another-email-ph' => 'Ð\94Ó\80аÑ\8fзде Ñ\8dлекÑ\82Ñ\80онни почтан адрес',
+'createacct-emailrequired' => 'ЭлекÑ\82Ñ\80онан почтан адрес',
+'createacct-emailoptional' => 'ЭлекÑ\82Ñ\80онан почтан адрес (ца яздича мега)',
+'createacct-email-ph' => 'Ð\94Ó\80аÑ\8fзде Ñ\8dлекÑ\82Ñ\80онан почтан адрес',
+'createacct-another-email-ph' => 'Ð\94Ó\80аÑ\8fзде Ñ\8dлекÑ\82Ñ\80онан почтан адрес',
 'createaccountmail' => 'хааман зӀене хула',
 'createacct-realname' => 'Хьан цӀе (ца язйича мега)',
 'createaccountreason' => 'Бахьан:',
@@ -807,9 +806,9 @@ URL язъеш гӀалат даьлла хила мега.
 'password-login-forbidden' => 'Иштта декъашхочун цӀе а пароль а лелаян цамаго.',
 'mailmypassword' => 'Пароль кхоссар',
 'passwordremindertitle' => 'Декъашхочун {{grammar:genitive|{{SITENAME}}}}  пароль дагайаийтар',
-'noemail' => 'ЦÓ\80е $1 Ð¹Ð¾Ð»Ñ\83 Ð´ÐµÐºÑ\8aаÑ\88Ñ\85оÑ\87Ñ\83н Ñ\8dлекÑ\82Ñ\80онни адрес яздина дац.',
-'noemailcreate' => 'Ð\90Ñ\85Ñ\8cа Ð½Ð¸Ð¹Ñ\81а Ñ\8dлекÑ\82Ñ\80онни почтан адрес дӀаяздан деза',
-'passwordsent' => 'Ð\9aеÑ\80ла Ð¿Ð°Ñ\80олÑ\8c Ð´ÐµÐºÑ\8aаÑ\88Ñ\85оÑ\87Ñ\83н $1 Ñ\8dлекÑ\82Ñ\80онни адрес тӀе дӀахьажина. Дехар до, керла пароль еъча юху системин чугӀо.',
+'noemail' => 'ЦÓ\80е $1 Ð¹Ð¾Ð»Ñ\83 Ð´ÐµÐºÑ\8aаÑ\88Ñ\85оÑ\87Ñ\83н Ñ\8dлекÑ\82Ñ\80онан адрес яздина дац.',
+'noemailcreate' => 'Ð\90Ñ\85Ñ\8cа Ð½Ð¸Ð¹Ñ\81а Ñ\8dлекÑ\82Ñ\80онан почтан адрес дӀаяздан деза',
+'passwordsent' => 'Ð\9aеÑ\80ла Ð¿Ð°Ñ\80олÑ\8c Ð´ÐµÐºÑ\8aаÑ\88Ñ\85оÑ\87Ñ\83н $1 Ñ\8dлекÑ\82Ñ\80онан адрес тӀе дӀахьажина. Дехар до, керла пароль еъча юху системин чугӀо.',
 'blocked-mailpassword' => 'Хьан IP-адрес ца тадарш дан магийна дац, цуьндела пароль меттахӀотош йолу функци блоктоьхна ю.',
 'eauthentsent' => 'ДӀаяздинчу электронан адрес тӀе хаам баийтина.
 Даиман хаамаш баийта хааман чохь де бохург дан деза адрес хьай хилар бакъдеш.',
@@ -853,7 +852,7 @@ URL язъеш гӀалат даьлла хила мега.
 'passwordreset-username' => 'Декъашхочун цӀе:',
 'passwordreset-domain' => 'Домен:',
 'passwordreset-capture' => 'Хьажа беанчу хааме?',
-'passwordreset-email' => 'ЭлекÑ\82Ñ\80онни почтан адрес:',
+'passwordreset-email' => 'ЭлекÑ\82Ñ\80онан почтан адрес:',
 'passwordreset-emailtitle' => '{{SITENAME}}: декъашхочун дӀаяздарх лаьцна хаам',
 'passwordreset-emailelement' => 'Декъашхочун цӀе: $1
 Ханна йолу пароль: $2',
@@ -863,11 +862,11 @@ URL язъеш гӀалат даьлла хила мега.
 
 # Special:ChangeEmail
 'changeemail' => 'Хийца электрони почт',
-'changeemail-header' => 'ЭлекÑ\82Ñ\80они почтан адрес хийцар',
-'changeemail-text' => 'Юза Ñ\85Ó\80аÑ\80а Ñ\84оÑ\80ма Ñ\85Ñ\8cайн Ñ\8dлекÑ\82Ñ\80они почтан адрес хуьйцуш. Ахьа хийцар бакъдан язъян еза пароль.',
+'changeemail-header' => 'ЭлекÑ\82Ñ\80онан почтан адрес хийцар',
+'changeemail-text' => 'Юза Ñ\85Ó\80аÑ\80а Ñ\84оÑ\80ма Ñ\85Ñ\8cайн Ñ\8dлекÑ\82Ñ\80онан почтан адрес хуьйцуш. Ахьа хийцар бакъдан язъян еза пароль.',
 'changeemail-no-info' => 'ХӀара агӀо лело системин чугӀо.',
-'changeemail-oldemail' => 'Ð\9aаÑ\80аÑ\80а Ñ\8dлекÑ\82Ñ\80онни почтан адрес:',
-'changeemail-newemail' => 'ЭлекÑ\82Ñ\80они почтан керла адрес:',
+'changeemail-oldemail' => 'Ð\9aаÑ\80аÑ\80а Ñ\8dлекÑ\82Ñ\80онан почтан адрес:',
+'changeemail-newemail' => 'ЭлекÑ\82Ñ\80онан почтан керла адрес:',
 'changeemail-none' => '(яц)',
 'changeemail-password' => 'Хьан пароль «{{SITENAME}}» проектан:',
 'changeemail-submit' => 'Хийца email',
@@ -1287,7 +1286,7 @@ $1",
 'prefs-help-gender' => 'ТӀехь доцург: и хаам лелош бу цхьайолу хаамаш чохь декъашхочун пол гучуйоккхуш.
 И хаам массарна гуш хир бу.',
 'email' => 'Email',
-'prefs-help-email' => 'ЭлекÑ\82Ñ\80они Ð¿Ð¾Ñ\87Ñ\82ан Ð°Ð´Ñ\80еÑ\81 Ñ\86аÑ\85lоÑ\82Ñ\82ийÑ\87а Ð°Ñ\8a Ñ\85lумма дац, амма иза оьшар ю, нагахь хьуна хьай пароль йицлахь.',
+'prefs-help-email' => 'ЭлекÑ\82Ñ\80онан Ð¿Ð¾Ñ\87Ñ\82ан Ð°Ð´Ñ\80еÑ\81 Ñ\86аÑ\85Ó\80оÑ\82Ñ\82ийÑ\87а Ð° Ñ\85Ó\80умма дац, амма иза оьшар ю, нагахь хьуна хьай пароль йицлахь.',
 'prefs-help-email-others' => 'Кхин дӀа цо кхечу декъашхошна йиш хуьлуьйту хьога электронан кехат даийта хьан агӀона чохь йолу хьажориган гӀоьнца.',
 'prefs-info' => 'Коьрта хаам',
 'prefs-i18n' => 'Юкъардекъа мотт',
@@ -1353,7 +1352,7 @@ $1",
 
 # Rights
 'right-read' => 'агӀонашка хьажар',
-'right-edit' => 'Ð\90гÓ\80оаÑ\88 Ð½Ð¸Ñ\81Ñ\8fÑ\80',
+'right-edit' => 'агÓ\80онаÑ\88 Ð½Ð¸Ð¹Ñ\81е',
 'right-createpage' => 'АгӀонаш кхоллар (дийцарш дац)',
 'right-createtalk' => 'Дийцаре агӀонаш кхоллар',
 'right-createaccount' => 'декъашхошна керла дӀаяздарш кхоллар',
@@ -1497,6 +1496,13 @@ $1",
 'upload-recreate-warning' => "'''Тегам бе: иштта цӀе йолу файл дӀаяьккхина я цӀе хийцина.'''
 
 Лахахьа гойтуш ю хӀокху агӀона тептар:",
+'uploadtext' => "Лелайе хӀара агӀо сервер чу файлаш йохуш.
+Хьалхо чуйаьхна файлаш хьажа,  [[Special:FileList|кхузахь]]. Кхин чуйаьхна файлаш дӀаязло [[Special:Log/upload|чуяхаран тептар чохь]], дӀаяьхна файлаш каро йиш ю [[Special:Log/delete|кхузахь]].
+
+Файл агӀона чуйилла лелабе лахара могӀанаш:
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' файла Файлан юьззина верси чуйиллуш;
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|цунахь лаьцна хаам]]</nowiki></code>''' 200 пиксель барамехь файл чуйилар бухахь цунахь лаьцна могӀа а болуш;
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' файлан тӀе хьажораг хӀотайо файл агӀонгахь ца гуш.",
 'upload-permitted' => 'Магийна файлийн тайпанаш: $1.',
 'uploadlogpage' => 'Чуяхаран тéптар',
 'uploadlogpagetext' => 'Лахахьа гойтуш бу тӀаьххьара чуяхна файлийн могӀам.
@@ -1579,6 +1585,7 @@ PICT # тайп тайпан
 'listfiles_description' => 'Цуьнах лаьцна',
 'listfiles_count' => 'Верси',
 'listfiles-show-all' => 'Гайта суьртийн шира версеш',
+'listfiles-latestversion-yes' => 'ХӀаъ',
 
 # File description page
 'file-anchor-link' => 'Файл',
@@ -1922,7 +1929,7 @@ PICT # тайп тайпан
 'editcomment' => "Хийцамаш барна гайтина бахьна: ''$1''.",
 'revertpage' => 'Нисдарш [[Special:Contributions/$2|$2]] ([[User talk:$2|дийцаре]]) юха даьхна башхаллийн [[User:$1|$1]]',
 'revertpage-nouser' => 'Нисдарш (декъашхочун цӀе хьулйина) юхадаьхина башхаллин {{GENDER:$1|[[User:$1|$1]]}}',
-'rollback-success' => 'Юха даьхна $1; нисдарш, $2 версен.',
+'rollback-success' => 'Юхадаьхна $1; нисдарш, $2 версен.',
 
 # Protect
 'protectlogpage' => 'Гlаролли тептар',
@@ -1952,7 +1959,7 @@ PICT # тайп тайпан
 'protect-expiring-local' => 'чекхйолу $1',
 'protect-expiry-indefinite' => 'хан чаккхе йоцуш',
 'protect-cascade' => 'Гlаролла йé агlонаш, хlокху агlонца хlоттайелларш (чахчарé гlаролла)',
-'protect-cantedit' => 'Хьéга хийцам цабало хlокху агlон гlаролли локхалан, хlуд аьлча хьан бакъо яц оцун рéдаккха.',
+'protect-cantedit' => 'Хьéга хийцам цабало хӀокху агӀон гlаролли локхалан, хӀуд аьлча хьан бакъо яц оцунна тадар дан.',
 'protect-othertime' => 'Кхин хан:',
 'protect-othertime-op' => 'кхин хан',
 'protect-otherreason' => 'Кхин бахьна/тӀетохар:',
@@ -2354,7 +2361,9 @@ PICT # тайп тайпан
 'pageinfo-language' => 'АгӀона мотт',
 'pageinfo-toolboxlink' => 'Агlонах болу бовзам',
 'pageinfo-redirectsto-info' => 'Хаам',
+'pageinfo-contentpage-yes' => 'ХӀаъ',
 'pageinfo-protect-cascading' => 'Чахчарин гӀоралла кхузара',
+'pageinfo-protect-cascading-yes' => 'ХӀаъ',
 'pageinfo-protect-cascading-from' => 'Чахчарин гӀоралла тӀера',
 'pageinfo-category-info' => 'Категорех лаьцна хаам',
 
@@ -2474,6 +2483,8 @@ PICT # тайп тайпан
 'exif-sensingmethod' => 'Сенсоран тайп',
 'exif-filesource' => 'Файлан хьост',
 'exif-imageuniqueid' => 'Суьртан номер (ID)',
+'exif-gpslatitude' => 'Шоралла',
+'exif-gpslongitude' => 'Дохалла',
 'exif-gpsaltitude' => 'Локхалла',
 'exif-gpsdestlatitude' => 'Объектан дохалла',
 'exif-gpsdatestamp' => 'Терахь',
@@ -2489,6 +2500,7 @@ PICT # тайп тайпан
 'exif-originaltransmissionref' => 'ДӀадолалун меттиган код',
 'exif-label' => 'Билгало',
 'exif-datetimemetadata' => 'ТӀехьара метахаамаш хийцина терахь',
+'exif-copyrightowner' => 'Авторийн бакъонаш ерг',
 'exif-usageterms' => 'Лелоран хьал',
 'exif-pngfilecomment' => 'PNG-файлан билгалдаккхар',
 'exif-giffilecomment' => 'GIF-файлан билгалдаккхар',
@@ -2598,7 +2610,12 @@ PICT # тайп тайпан
 'version-parser-function-hooks' => 'Cинтаксисан къасторан функци схьалоцурш',
 'version-version' => '(Верси $1)',
 '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-poweredby-credits' => "ХӀара вики болх беш ю '''[https://www.mediawiki.org/ MediaWiki]''' движок тӀехь, copyright © 2001-$1 $2.",
 'version-poweredby-others' => 'кхин',
 'version-license-info' => 'MediaWiki ю маьрша программин латораг, шу йиш ю фондас арахецна йолу GNU General Public License лицензица и яржо я хийца а.
@@ -2626,7 +2643,7 @@ MediaWiki яржош ю и шуна пайдане хир яц те аьлла,
 'fileduplicatesearch-legend' => 'Цхьатера ерш лахар',
 'fileduplicatesearch-filename' => 'Файлан цӀе:',
 'fileduplicatesearch-submit' => 'Лаха',
-'fileduplicatesearch-info' => '$1 × $2 {{PLURAL:$2|пиксель|пикселш|пикселш}}<br />Файлан барам: $3<br />MIME-тайп: $4',
+'fileduplicatesearch-info' => '$1 × $2 пиксель<br />Файлан барам: $3<br />MIME-тайп: $4',
 
 # Special:SpecialPages
 'specialpages' => 'Леррина агlонаш',
@@ -2660,6 +2677,7 @@ MediaWiki яржош ю и шуна пайдане хир яц те аьлла,
 'tags-description-header' => 'МаьӀнан дуьззина сурт хӀоттор',
 'tags-active-header' => 'Жигара?',
 'tags-hitcount-header' => 'Къастам бина нисдарш',
+'tags-active-yes' => 'ХӀаъ',
 'tags-edit' => 'нисйé',
 'tags-hitcount' => '$1 {{PLURAL:$1|хийцам|хийцамаш|хийцамаш}}',
 
@@ -2684,6 +2702,7 @@ MediaWiki яржош ю и шуна пайдане хир яц те аьлла,
 'htmlform-submit' => 'ДӀадахьийта',
 'htmlform-reset' => 'Цаоьшу хийцамаш',
 'htmlform-selectorother-other' => 'Кхин',
+'htmlform-yes' => 'ХӀаъ',
 
 # New logging system
 'logentry-delete-delete' => '$1 {{GENDER:$2|дӀаяьккхина}} агӀо $3',
@@ -2704,7 +2723,7 @@ MediaWiki яржош ю и шуна пайдане хир яц те аьлла,
 'revdelete-uname-unhid' => 'декъашхочун цӀе гуча яьккхина',
 'revdelete-restricted' => 'куьйгалхойн доза туху',
 'revdelete-unrestricted' => 'куьйгалхойн доза тохар дӀаяьккхина',
-'logentry-move-move' => '$1 {{GENDER:$2|цӀе хийцина|цӀе хийцина}} $3 → $4',
+'logentry-move-move' => '$1 {{GENDER:$2|цӀе хийцина}} $3 → $4',
 'logentry-move-move-noredirect' => '$1 {{GENDER:$2|цӀе хийцина}} $3 → $4 дӀасахьажийнарг цаюьтуш',
 'logentry-move-move_redir' => '$1 {{GENDER:$2|цӀе хийцина|цӀе хийцина}} $3 оцу $4 дӀасахьажоран тӀохул',
 'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2|цӀе хийцина|цӀе хийцина}} $3 оцу $4 дӀасахьажоран тӀохул а дӀасахьажийнарг цаюьтуш а',
@@ -2718,6 +2737,7 @@ MediaWiki яржош ю и шуна пайдане хир яц те аьлла,
 
 # Feedback
 'feedback-cancel' => 'Цаоьшу',
+'feedback-close' => 'Кийчча ю',
 
 # Search suggestions
 'searchsuggest-search' => 'Лаха',
@@ -2733,7 +2753,9 @@ MediaWiki яржош ю и шуна пайдане хир яц те аьлла,
 # Limit report
 'limitreport-title' => 'АгӀона хӀоттам къасторан хаамаш:',
 'limitreport-cputime' => 'Процессоран хан лелор',
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|секунд}}',
 'limitreport-walltime' => 'Йодуш йолу хенахь лелор',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|секунд}}',
 'limitreport-ppvisitednodes' => 'Препроцессор хьаьжна шадин дукхалла',
 'limitreport-ppgeneratednodes' => 'Препроцессорс сгенерировать бина шадин дукхалла',
 'limitreport-postexpandincludesize' => 'Схьаяьстина юккъерчаран барам',
@@ -2745,8 +2767,16 @@ MediaWiki яржош ю и шуна пайдане хир яц те аьлла,
 
 # Special:ExpandTemplates
 'expandtemplates' => 'Кепаш схьаястар',
+'expand_templates_intro' => 'ХӀокху белхан агӀорахь йиш ю йоза хийца.
+Кхин кепаш схьаяста.
+<code><nowiki>{{#language:…}}</nowiki></code> кхочуш дан тайп
+<code><nowiki>{{CURRENTDAY}}</nowiki></code>.',
+'expand_templates_title' => 'АгӀона {{FULLPAGENAME}} корта кхин а:',
+'expand_templates_input' => 'Чудолу йоза:',
 'expand_templates_output' => 'Хилам',
 'expand_templates_remove_comments' => 'ДӀаяха комментареш',
+'expand_templates_remove_nowiki' => 'ДӀайоху тегаш <nowiki> хилча',
+'expand_templates_generate_xml' => 'Гойту дитта цу XML',
 'expand_templates_preview' => 'Хьалха муха ю хьажа',
 
 );
index a4d902a..108b8c5 100644 (file)
@@ -196,7 +196,6 @@ $messages = array(
 'tog-numberheadings' => 'ژمارەکردنی خۆگەڕی سەردێڕەکان',
 'tog-showtoolbar' => 'شریتی ئامرازەکانی دەستکاری نیشان بدە (JavaScript پێویستە)',
 'tog-editondblclick' => 'دەستکاریی پەڕە بە دووکلیک لەسەر دەق (JavaScript پێویستە)',
-'tog-editsection' => 'ڕێگە بدە بۆ دەستکاری کردنی بەشەکان لە ڕێگەی بەستەرەکانی [دەستکاری]',
 'tog-editsectiononrightclick' => 'ڕێگە بدە بۆ دەستکاری کردنی بەشەکان لە ڕێگەی کلیکی ڕاست کردن لەسەر سەردێڕی بەشەکان (JavaScript پێویستە)',
 'tog-showtoc' => 'پێرستی ناوەرۆک نیشان بدە (بۆ ئەو پەڕانە کە زیاتر لە ٣ سەردێڕیان تێدایە)',
 'tog-rememberpassword' => 'چوونە ژوورەوەم لەسەر ئەم وێبگەڕە پاشەکەوت بکە (ئەو پەڕی $1 {{PLURAL:$1|ڕۆژ|ڕۆژ}}ە)',
@@ -614,7 +613,7 @@ $2',
 'userlogout' => 'بچۆ دەرەوە',
 'notloggedin' => 'لە ژوورەوە نیت',
 'userlogin-noaccount' => 'ھەژمارت نییە؟',
-'userlogin-joinproject' => 'ڕەگەڵ {{SITENAME}} کەوە',
+'userlogin-joinproject' => 'وێڕای {{SITENAME}} کەوە',
 'nologin' => 'ھەژمارت نییە؟  $1.',
 'nologinlink' => 'ھەژمارێک دروست بکە',
 'createaccount' => 'ھەژمار دروست بکە',
@@ -2174,6 +2173,7 @@ $UNWATCHURL
 'delete-warning-toobig' => 'ئەم لاپەڕە مێژوویەکی دەستکاری زۆر گەورەی هەیە، زیاتر لە $1 {{PLURAL:$1|پێداچوونەوە|پێداچوونەوە}}.
 سڕینەوی ئەوە لە وانەیە کارەکانی بنکەدراوی {{SITENAME}} تووشی کێشە بکات؛
 دوورنواڕانە جێ‌بەجێی بکە.',
+'deleting-backlinks-warning' => "'''ھۆشدار:''' پەڕەی تر بەم پەڕەیەی دەتەوێ بیسڕییەوە بەستەر دراوە.",
 
 # Rollback
 'rollback' => 'گەڕاندنەوەی دەستکارییەکان',
index 853c536..aaf8e2a 100644 (file)
@@ -7,8 +7,10 @@
  * @ingroup Language
  * @file
  *
+ * @author Ale Mister
  * @author Ale Mister (on co.wikipedia.org)
  * @author Img (on co.wikipedia.org)
+ * @author Paulu
  */
 
 $fallback = 'it';
@@ -68,66 +70,107 @@ $messages = array(
 'oct' => 'ott',
 'nov' => 'nuv',
 'dec' => 'dic',
+'may-date' => '{{PLURAL:$1|1°|$1}} maghju',
+'august-date' => '{{PLURAL:$1|1°|$1}} aostu',
+'september-date' => '{{PLURAL:$1|1°|$1}} sittembre',
+'november-date' => '{{PLURAL:$1|1°|$1}} nuvembre',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Categuria|Categurie}}',
-'category_header' => 'Articuli in a categuria "$1"',
+'category_header' => 'Pagine in a categuria "$1"',
 'subcategories' => 'Sottucategurie',
+'category-empty' => "''Sta categuria ùn cuntene alcuna pagina o file multimediale.''",
+'hidden-categories' => '{{PLURAL:$1|Categuria nascosta|Categurie nascoste}}',
+'hidden-category-category' => 'Categurie nascoste',
+'index-category' => 'Pagine indicizate',
 
 'about' => 'À prupositu',
 'article' => 'Articulu',
+'newwindow' => '(si apre in una nova finestra)',
 'cancel' => 'Annullà',
-'mypage' => 'A mo pagina',
-'mytalk' => 'E mo discussioni',
+'morenotlisted' => "'Ssa lista ùn hè micca cumpletta",
+'mypage' => 'A me pagina',
+'mytalk' => 'Discussione',
 'anontalk' => 'Discussione per istu indirizzu IP',
 'navigation' => 'Navigazione',
 'and' => '&#32;è',
 
 # Cologne Blue skin
+'qbfind' => 'Truvà',
 'qbpageoptions' => 'Issa pagina',
 'qbmyoptions' => 'E mo pagine',
 
 # Vector skin
+'vector-action-addsection' => 'Aghjunghje discussione',
 'vector-action-delete' => 'Supprimà',
+'vector-action-move' => 'Cullucà',
 'vector-action-protect' => 'Pruteghje',
+'vector-action-unprotect' => 'Cambià a prutezzione',
+'vector-view-create' => 'Creà',
 'vector-view-edit' => 'Mudificà',
+'vector-view-history' => 'Vede a cronolugia',
+'vector-view-view' => 'Leghje',
+'vector-view-viewsource' => 'Vede a surghjente',
+'actions' => 'Azzione',
+'variants' => 'Variante',
 
 'errorpagetitle' => 'Errore',
 'returnto' => 'Vultà à $1.',
+'tagline' => 'À prupositu di {{SITENAME}}',
 'help' => 'Aiutu',
 'search' => 'Ricerca',
 'searchbutton' => 'Ricerca',
-'searcharticle' => 'Và',
+'go' => 'Andà',
+'searcharticle' => 'Andà',
 'history' => 'Cronolugia',
 'history_short' => 'Cronolugia',
+'updatedmarker' => 'Mudificata dapoi a me ultima visita',
+'printableversion' => 'Versione stampevule',
 'permalink' => 'Ligame permanente',
 'print' => 'Stampà',
+'view' => 'Vede',
 'edit' => 'Mudificà',
 'create' => 'Creà',
+'create-this-page' => "Creà 'ssa pagina",
 'delete' => 'Supprimà',
 'deletethispage' => 'Cancellà issa pagina',
 'protect' => 'Pruteghje',
+'protect_change' => 'Cambià',
 'protectthispage' => 'Pruteghje issa pagina',
+'unprotect' => 'Cambià a prutezzione',
+'unprotectthispage' => 'Cambià a prutezzione di sta pagina',
 'newpage' => 'Pagina nova',
+'talkpage' => "Discussione di 'ssa pagina",
 'talkpagelinktext' => 'discussione',
 'specialpage' => 'Pagina speciale',
+'personaltools' => 'Strumenti persunali',
+'postcomment' => 'Nova sezione',
 'articlepage' => "Vede l'articulu",
 'talk' => 'Discussione',
 'toolbox' => 'Stuvigli',
 'userpage' => 'Vede a pagina di utilizatore',
-'otherlanguages' => 'In altri lingui',
-'lastmodifiedat' => 'Ultima mudifica di ista pagina u $1 à e $2.',
+'projectpage' => 'Vede a pagina prutetta',
+'mediawikipage' => 'Vede i missaghji',
+'templatepage' => 'Vede a pagina di mudellu',
+'viewhelppage' => 'Vede a pagina di aiutu',
+'categorypage' => 'Vede a pagina di categuria',
+'viewtalkpage' => 'Vede a discussione',
+'otherlanguages' => 'In altre lingue',
+'lastmodifiedat' => 'Ultima mudifica di sta pagina u $1 à e $2.',
 'protectedpage' => 'Pagina prutetta',
+'jumpto' => 'Andà à:',
 'jumptonavigation' => 'navigazione',
 'jumptosearch' => 'ricerca',
+'pool-errorunknown' => 'Errore scunnisciutu',
 
 # 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).
 'aboutsite' => 'À prupositu di {{SITENAME}}',
 'aboutpage' => 'Project:À prupositu',
 'currentevents' => 'Ultimi evenimenti',
 'currentevents-url' => 'Project:Ultimi evenimenti',
-'disclaimers' => 'Avertimenti',
+'disclaimers' => 'Avvertimenti',
 'disclaimerpage' => 'Project:Avertimenti generali',
+'helppage' => 'Help:Cuntenutu',
 'mainpage' => 'Pagina maestra',
 'mainpage-description' => 'Pagina maestra',
 'portal' => 'Purtone di a cumunità',
@@ -137,17 +180,26 @@ $messages = array(
 
 'versionrequired' => 'A version $1 di MediaWiki hè necessaria',
 
+'ok' => "D'accordu",
+'retrievedfrom' => 'Ricacciatu da "$1"',
+'youhavenewmessagesmulti' => 'Ha novi missaghji nantu à $1',
 'editsection' => 'mudificà',
 'editold' => 'mudificà',
+'viewsourceold' => 'Vede a surghjente',
 'editlink' => 'mudificà',
+'viewsourcelink' => 'Vede a surghjente',
+'editsectionhint' => 'Mudificà a sezzione: $1',
 'toc' => 'Cuntenutu',
 'showtoc' => 'mustrà',
 'hidetoc' => 'piattà',
 'feed-atom' => 'Atomu',
+'red-link-title' => '$1 (a pagina ùn esiste micca)',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
 'nstab-main' => 'Articulu',
-'nstab-user' => 'Utilizatore',
+'nstab-user' => 'Pagina di cuntributore',
+'nstab-special' => 'Pagina spiciale',
+'nstab-project' => 'Pagina di prugettu',
 'nstab-image' => 'Schedariu',
 'nstab-mediawiki' => 'Messaghju',
 'nstab-template' => 'Mudellu',
@@ -156,21 +208,35 @@ $messages = array(
 
 # General errors
 'error' => 'Errore',
+'missingarticle-rev' => '(numeru di a versione: $1)',
 'internalerror' => 'Errore internu',
+'internalerror_info' => 'Errore internu: $1',
+'badtitle' => 'Titulu scurrettu',
+'viewsource' => 'Vede a surghjente',
+'viewsource-title' => 'Vede a sughjente di $1',
+'actionthrottled' => 'Azzione attimpata',
+'viewsourcetext' => 'Si pò vede è cupià u codice surghjente di sta pagina:',
+
+# Virus scanner
+'virus-unknownscanner' => 'antivirus scunnisciutu:',
 
 # Login and logout pages
-'yourname' => 'Nome di utilizatore:',
-'yourpassword' => 'Parulla secreta:',
-'yourpasswordagain' => 'Scrive torna a parulla secreta:',
+'yourname' => 'Nome di cuntributore:',
+'yourpassword' => 'Parolla secreta:',
+'yourpasswordagain' => 'Ripete a parolla secreta:',
 'yourdomainname' => 'U to duminiu:',
 'login' => 'Cunnessione',
-'userlogin' => 'Cunnessione / Registramentu',
+'nav-login-createaccount' => 'Cunnessione / registramentu',
+'userlogin' => 'Cunnessione / registramentu',
 'logout' => 'Scunnessione',
 'userlogout' => 'Scunnessione',
+'nologin' => 'Ùn ha ancu un accessu? $1.',
 'nologinlink' => 'Registramentu',
 'createaccount' => 'Registramentu',
+'gotaccount' => 'Ùn ha ancu un accessu? $1.',
 'gotaccountlink' => 'Cunnessione',
 'createaccountreason' => 'Mutivu:',
+'createacct-reason' => 'Mutivu',
 'loginsuccesstitle' => 'Cunnessione fatta',
 'acct_creation_throttle_hit' => "Desulatu, ai digià fattu $1 registramenti. Ùn ne poi micca fà d'altri.",
 'accountcreated' => 'Registramentu fattu',
@@ -179,50 +245,115 @@ $messages = array(
 
 # Change password dialog
 'retypenew' => 'Scrive torna a nova parulla secreta:',
+'resetpass-submit-cancel' => 'Cancillà',
+
+# Special:ChangeEmail
+'changeemail-cancel' => 'Cancillà',
 
 # Edit page toolbar
+'bold_sample' => 'Grassettu',
+'bold_tip' => 'Grassettu',
+'italic_sample' => 'Italicu',
+'italic_tip' => 'Italicu',
+'link_sample' => 'Titulu di u ligame',
+'link_tip' => 'Ligame internu',
+'extlink_tip' => 'Ligamu esternu (cù u prefissu http:// )',
+'headline_sample' => 'Testu di intestatura',
+'headline_tip' => 'Intestamentu di 2° livellu',
+'nowiki_sample' => 'Inserisce quì u testu micca furmattatu',
+'nowiki_tip' => 'Ignurà a furmattazione wiki',
 'image_sample' => 'Esempiu.jpg',
+'hr_tip' => 'Linia orizuntale (da imprudà incù ghjudiziu)',
 
 # Edit pages
-'minoredit' => 'Mudifica minore',
+'minoredit' => 'Hè una mudifica minore',
+'watchthis' => "Fighjulà 'ssa pagina",
 'savearticle' => 'Arrighjistrà a pagina',
+'preview' => 'Previsualisazione',
+'showpreview' => 'Previsualizà',
 'showdiff' => 'Mustrà i cambiamenti',
-'anoneditwarning' => "'''Attenzione''': ùn sè micca un utilizatore registratu, oppuru ùn ai fattu a cunnessione.
-U to indirizzu IP serà registratu indu a cronolugia di ista pagina.",
+'anoneditwarning' => "'''Attenzione:''' Ùn ai micca fattu a cunnessione. U to indirizzu IP sarà salvatu in a cronolugia di sta pagina.",
 'loginreqlink' => 'cunnessione',
 'accmailtitle' => 'Parulla secreta inviata.',
 'accmailtext' => 'A parulla secreta per "$1" hè stata inviata à l\'indirizzu $2.',
+'newarticle' => '(Novu)',
+'previewnote' => "'''Attentu: questa ùn hè ch'è una previsualisazzione.'''
+E to mudifiche ùn sò ancora state salvate!",
 'editing' => 'Mudifica di $1',
 'editingsection' => 'Mudifica di $1 (sezzione)',
 'editingcomment' => 'Mudifica di $1 (cummentu)',
 'editconflict' => 'Cunflittu di mudificazione: $1',
 'yourtext' => 'U to testu',
 'yourdiff' => 'Differenze',
+'templatesused' => "{{PLURAL:$1|Mudellu imprudatu|Mudelli imprudati}} in 'ssa pagina:",
 'template-protected' => '(prutettu)',
 'template-semiprotected' => '(mezu prutettu)',
+'hiddencategories' => 'Sta pagina appartene à {{PLURAL:$1|una categuria nascosta|$1 categurie nascoste}}:',
+
+# Parser/template warnings
+'post-expand-template-inclusion-warning' => "'''Attenti:''' a dimensione di i mudelli inclusi è troppa maiò.
+Parechji mudelli ùn seranu micca inclusi.",
+'post-expand-template-inclusion-category' => 'Pagine per e quale a dimensione di i mudelli inclusi supereghja a limita',
+'post-expand-template-argument-category' => 'Pagine cuntinenti argumenti di mudellu mancanti',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'Registramentu micca pussibile',
 
 # History pages
 'currentrev' => 'Ultima revisione',
+'currentrev-asof' => 'Versione attuale di e $1',
+'revisionasof' => 'Versione di e $1',
+'revision-info' => 'Versione di e $4 à e $5 di $2',
+'previousrevision' => '← Versione menu ricente',
+'currentrevisionlink' => 'Ultima revisione',
 'page_first' => 'prima',
-'histfirst' => 'Prima',
-'histlast' => 'Ultima',
+'history-fieldset-title' => 'Parcorre a cronolugia',
+'history-show-deleted' => 'Solu quelli cancellati',
+'histfirst' => 'prima',
+'histlast' => 'ultima',
 'historysize' => '({{PLURAL:$1|1 ottettu|$1 ottetti}})',
 
 # Revision feed
 'history-feed-title' => 'Cronolugia di e revisione',
+'history-feed-item-nocomment' => 'da $1 à $2',
 
 # Revision deletion
 'rev-delundel' => 'mustrà/piattà',
 'revdelete-log' => 'Mutivu:',
+'revdel-restore' => 'cambià a visibilità',
 
 # History merging
 'mergehistory-reason' => 'Mutivu:',
 
+# Diffs
+'history-title' => '$1: cronolugia di e mudifiche',
+'lineno' => 'Linia $1:',
+'compareselectedversions' => 'Paragunà e versione selezziunate',
+'editundo' => 'Cancillà a modifica',
+
 # Search results
 'searchresults' => 'Risultati di a ricerca',
+'searchresults-title' => 'Risultati di a ricerca di "$1"',
+'prevn' => '{{PLURAL:$1|precidente|precidenti $1}}',
+'nextn' => '{{PLURAL:$1|siguente|siguenti $1}}',
+'prevn-title' => '{{PLURAL:$1|Risultatu precidente|$1 risultati precidenti}}',
+'nextn-title' => '{{PLURAL:$1|Risultatu|$1 risultati}}',
+'shown-title' => 'Mustrà {{PLURAL:$1|un risultatu|$1 risultati}} per pagina',
+'searchmenu-exists' => "'''Esiste nantu à u situ una pagina intitulata \"[[:\$1]]\"'''",
+'searchmenu-new' => 'Creà a pagina "[[:$1]]" annantu à \'ssu situ',
+'searchprofile-articles' => 'Pagine di cuntenuti',
+'searchprofile-project' => 'Pagine di aiutu è relative à u prugettu',
+'searchprofile-everything' => 'Tuttu',
+'searchprofile-advanced' => 'Avanzatu',
+'searchprofile-articles-tooltip' => 'Circà in $1',
+'searchprofile-project-tooltip' => 'Circà in $1',
+'searchprofile-everything-tooltip' => 'Circà dapertuttu (incluse e pagine di discussione)',
+'search-result-size' => '$1 ({{PLURAL:$2|1 parolla|$2 parolle}})',
+'search-section' => '(sezzione $1)',
+'search-suggest' => 'Forse vulii dì',
+'searchrelated' => 'currilati',
+'showingresultsheader' => "{{PLURAL:$5|Risultatu '''$1''' di '''$3'''|Risultati '''$1 - $2''' di '''$3'''}} per '''$4'''",
+'search-nonefound' => 'A ricerca ùn hà micca datu risultati.',
 
 # Preferences page
 'preferences' => 'Preferenze',
@@ -234,8 +365,8 @@ U to indirizzu IP serà registratu indu a cronolugia di ista pagina.",
 'localtime' => 'Ora lucale',
 'allowemail' => 'Abilità a ricezzione di e-mail da altri utilizatori',
 'prefs-files' => 'Schedarii',
-'youremail' => 'Indirizzu e-mail:',
-'yourrealname' => 'U to veru nome:',
+'youremail' => 'Indirizzu di currieru elettronicu:',
+'yourrealname' => 'Casata reale:',
 'yourlanguage' => "Lingua di l'interfaccia:",
 'yourvariant' => 'Variante',
 'yournick' => 'Signatura pè e discussioni:',
@@ -260,24 +391,43 @@ U to indirizzu IP serà registratu indu a cronolugia di ista pagina.",
 'grouppage-sysop' => '{{ns:project}}:Amministratori',
 'grouppage-bureaucrat' => '{{ns:project}}:Burocrati',
 
+# Special:Log/newusers
+'newuserlogpage' => 'Novi cuntributori',
+
+# Associated actions - in the sentence "You do not have permission to X"
+'action-edit' => "mudificà 'ssa pagina",
+
 # Recent changes
+'nchanges' => '$1 {{PLURAL:$1|mudifica|mudifiche}}',
 'recentchanges' => 'Ultimi cambiamenti',
-'rcnotefrom' => "Quì sò discritti i cambiamenti dipoi <b>$2</b> (sin'à <b>$1</b>).",
-'rclistfrom' => 'Mustrà i cambiamenti dipoi $1',
+'recentchanges-legend' => "Ozzione per l'ultime mudifiche",
+'recentchanges-summary' => 'Sta pagina prisenta e mudifiche più recente à u cuntenutu di u situ.',
+'recentchanges-label-newpage' => "'Ssa mudifica hà creatu una pagina nova",
+'recentchanges-label-minor' => 'Hè una mudifica minore',
+'recentchanges-label-bot' => 'Sta mudifica hè stata effettuata da un botu',
+'recentchanges-label-unpatrolled' => 'Sta mudifica ùn hè ancu stata verificata',
+'recentchanges-label-plusminus' => "A dimensione di a pagina hè stata cambiata di 'ssu numaru d'ottetti",
+'rcnotefrom' => "Quì seguitanu e mudifiche dapoi u '''$2''' ('''$1''' à u massimu).",
+'rclistfrom' => 'Mustrà e mudifiche dapoi u $1',
 'rcshowhideminor' => '$1 i cambiamenti minori',
 'rcshowhidebots' => '$1 i boti',
-'rcshowhideliu' => "$1 l'utilizatori registrati",
+'rcshowhideliu' => '$1 i cuntributori righjistrati',
 'rcshowhideanons' => '$1 i cuntributori anonimi',
+'rcshowhidepatr' => '$1 e mudifiche verificate',
 'rcshowhidemine' => '$1 e mo cuntribuzioni',
-'rclinks' => 'Mustrà ultimi $1 cambiamenti in i $2 ghjorni scorsi<br />$3',
+'rclinks' => "Mustrà l'ultime $1 mudifiche in i $2 ghjorni scorsi<br />$3",
 'hist' => 'cron',
 'hide' => 'piattà',
 'show' => 'mustrà',
+'rc-enhanced-hide' => 'Nasconde i dittagli',
 
 # Recent changes linked
-'recentchangeslinked' => 'Cambiamenti assuciati',
+'recentchangeslinked' => 'Mudifiche assuciate',
 'recentchangeslinked-feed' => 'Cambiamenti assuciati',
 'recentchangeslinked-toolbox' => 'Cambiamenti assuciati',
+'recentchangeslinked-title' => 'Mudifiche assuciate à "$1"',
+'recentchangeslinked-page' => 'Nome di a pagina:',
+'recentchangeslinked-to' => 'Mustrà solu e mudifiche à a pagine legate à quella specificata',
 
 # Upload
 'upload' => 'Incaricà un schedariu',
@@ -287,6 +437,9 @@ U to indirizzu IP serà registratu indu a cronolugia di ista pagina.",
 
 'upload-file-error' => 'Errore internu',
 
+'license' => 'Licenzia:',
+'license-header' => 'Licenzia:',
+
 # Special:ListFiles
 'imgfile' => 'schedariu',
 'listfiles_date' => 'Data',
@@ -297,8 +450,10 @@ U to indirizzu IP serà registratu indu a cronolugia di ista pagina.",
 'file-anchor-link' => 'Schedariu',
 'filehist' => "Cronolugia di l'imagine",
 'filehist-deleteone' => 'supprimà',
-'filehist-user' => 'Utilizatore',
-'imagelinks' => 'Ligami',
+'filehist-user' => 'Cuntributore',
+'filehist-dimensions' => 'Dimensione',
+'filehist-comment' => 'Cummentu',
+'imagelinks' => 'Usu di u schedariu',
 
 # File reversion
 'filerevert-comment' => 'Mutivu:',
@@ -321,25 +476,37 @@ U to indirizzu IP serà registratu indu a cronolugia di ista pagina.",
 
 # Miscellaneous special pages
 'ncategories' => '$1 {{PLURAL:$1|categuria|categurie}}',
+'nmembers' => '$1 {{PLURAL:$1|elementu|elementi}}',
 'specialpage-empty' => 'Issa pagina hè biota.',
 'popularpages' => 'Pagine populare',
+'prefixindex' => 'Indice di e pagine per lettere iniziale',
 'shortpages' => 'Pagine corte',
 'longpages' => 'Pagine longhe',
 'protectedpages' => 'Pagine prutette',
 'listusers' => 'Listinu di i cuntributori',
 'newpages' => 'Pagine nove',
 'ancientpages' => 'Pagine vechje',
+'move' => 'Cullucà',
+'pager-newer-n' => '{{PLURAL:$1|1 più ricente|$1 più ricenti}}',
+'pager-older-n' => '{{PLURAL:$1|1 menu ricente|$1 menu ricenti}}',
+
+# Book sources
+'booksources' => 'Libri di fonti',
+'booksources-go' => 'Andà',
 
 # Special:Log
 'specialloguserlabel' => 'Utilizatore:',
 'speciallogtitlelabel' => 'Titulu:',
+'log' => 'Righjistramenti',
 'all-logs-page' => "Tutte l'azzioni",
 
 # Special:AllPages
 'allpages' => 'Tutte e pagine',
 'alphaindexline' => 'da $1 à $2',
+'nextpage' => 'Pagina seguente ($1)',
+'prevpage' => 'Pagina precedente ($1)',
 'allpagesfrom' => 'Mustrà e pagine à parte da:',
-'allarticles' => "Tutti l'articuli",
+'allarticles' => 'Tutte e pagine',
 'allinnamespace' => 'Tutte e pagine di u spaziu $1',
 'allpagessubmit' => 'Và',
 'allpagesprefix' => 'Mustrà e pagine chì cumincianu cù:',
@@ -351,20 +518,28 @@ U to indirizzu IP serà registratu indu a cronolugia di ista pagina.",
 # Special:LinkSearch
 'linksearch-ns' => 'Spaziu:',
 'linksearch-ok' => 'Ricerca',
+'linksearch-line' => '$1 hè culligatu à a pagina $2',
 
 # Special:ListUsers
 'listusers-submit' => 'Mustrà',
 
+# Special:ListGroupRights
+'listgrouprights-members' => '(Lista di i membri)',
+
 # Email user
+'emailuser' => "Scrive à 'ssu cuntributore",
 'emailto' => 'À:',
 'emailsubject' => 'Sughjettu:',
 'emailmessage' => 'Messaghju:',
 'emailsend' => 'Invià',
 
 # Watchlist
-'watchlist' => 'Articuli seguitati',
-'mywatchlist' => 'Articuli seguitati',
-'watch' => 'Seguità',
+'watchlist' => 'Seguitati',
+'mywatchlist' => 'Seguitati',
+'watchlistfor2' => 'Per $1 ($2)',
+'watch' => 'Suvità',
+'unwatch' => 'Ùn suvità micca',
+'wlshowlast' => "Mustrà l'ultime $1 ore $2 ghjorni $3",
 
 'enotif_reset' => 'Marcà tutte e pagine visitate',
 'created' => 'creatu',
@@ -377,10 +552,12 @@ U to indirizzu IP serà registratu indu a cronolugia di ista pagina.",
 'exblank' => 'a pagina era biota',
 'delete-legend' => 'Supprimà',
 'actioncomplete' => 'Azzione compia',
+'actionfailed' => 'Azione faltata',
+'dellogpage' => 'Cancellamenti',
 'deletecomment' => 'Mutivu:',
 
 # Protect
-'protectedarticle' => 'prutettu "[[$1]]"',
+'protectedarticle' => 'hai prutettu "[[$1]]"',
 'prot_1movedto2' => 'hà mossu [[$1]] à [[$2]]',
 'protect-legend' => 'Cunfirmà a prutezzione',
 'protectcomment' => 'Mutivu:',
@@ -395,6 +572,7 @@ U to indirizzu IP serà registratu indu a cronolugia di ista pagina.",
 
 # Undelete
 'viewdeletedpage' => 'Fighjulà e p agine supprimate',
+'undeleteviewlink' => 'vede',
 'undeletecomment' => 'Mutivu:',
 'undelete-search-box' => 'Circà e pagine supprimate',
 'undelete-search-submit' => 'Ricerca',
@@ -404,25 +582,42 @@ U to indirizzu IP serà registratu indu a cronolugia di ista pagina.",
 'blanknamespace' => '(Principale)',
 
 # Contributions
-'contributions' => "Cuntribuzioni di l'utilizatore",
-'mycontris' => 'E mo cuntribuzioni',
-'contribsub2' => 'Per $1 ($2)',
+'contributions' => 'Mudifiche fatte da i {{GENDER:$1|cuntributori|cuntributrici}}',
+'contributions-title' => 'Cuntribuzioni di $1',
+'mycontris' => 'Cuntribuzioni',
+'contribsub2' => 'Per {{GENDER:$3|$1}} ($2)',
 'month' => 'Da u mese (è nanzu):',
+'year' => "Da l'annu (è nanzu):",
 
+'sp-contributions-newbies' => 'Mustrà solu e mudifiche di i novi cuntributori',
 'sp-contributions-talk' => 'discussione',
+'sp-contributions-search' => 'Ricercà e cuntribuzione',
+'sp-contributions-submit' => 'Circà',
 
 # What links here
+'whatlinkshere' => 'Pagine chì leganu quì',
+'whatlinkshere-title' => 'Pagine ligate à "$1"',
+'linkshere' => "E seguente pagine sò culligate à '''[[:$1]]''':",
 'istemplate' => 'inclusione',
+'whatlinkshere-prev' => '{{PLURAL:$1|precidente|precidenti $1}}',
+'whatlinkshere-next' => '{{PLURAL:$1|seguente|seguenti $1}}',
+'whatlinkshere-links' => '$1 ligami',
+'whatlinkshere-hidetrans' => 'inclusione',
+'whatlinkshere-hidelinks' => '$1 ligami',
 
 # Block/unblock
 'ipadressorusername' => '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',
 'blocklist-reason' => 'Mutivu',
 'ipblocklist-submit' => 'Ricerca',
 'anononlyblock' => 'solu i cuntributori anonimi',
 'blocklink' => 'bluccà',
 'unblocklink' => 'sbluccà',
-'contribslink' => 'cuntribuzioni',
+'change-blocklink' => 'cambià u bloccu',
+'contribslink' => 'cuntribuzione',
+'blocklogentry' => 'ha bluccatu [[$1]] per un periodu di $2 $3',
 'block-log-flags-anononly' => 'solu cuntributori anonimi',
 'block-log-flags-nocreate' => 'registramentu pruibitu',
 
@@ -441,12 +636,23 @@ U to indirizzu IP serà registratu indu a cronolugia di ista pagina.",
 'export-addcat' => 'Aghjunghje',
 
 # Namespace 8 related
-'allmessages' => 'Messaghji di sistemu',
+'allmessages' => 'Messagi di sistemu',
 'allmessagesname' => 'Nome',
-'allmessagesdefault' => 'Testu prestabilitu',
+'allmessagesdefault' => 'Testu predefinitu',
 'allmessagescurrent' => 'Testu attuale',
-'allmessagestext' => 'Istu hè u listinu di tutti i messaghji dispunibili in u spaziu MediaWiki.',
-'allmessagesnotsupportedDB' => "'''{{ns:special}}:Allmessages''' ùn hè dispunibile perchè '''\$wgUseDatabaseMessages''' ùn hè micca attivu.",
+'allmessagestext' => 'Ista pagina riperturia a lista di tutti i messagi dispunibili in u spaziu MediaWiki. Per cuntribuì à a lucalizazione generica di MediaWiki, visità [[translatewiki:|Translatewiki.net]].',
+'allmessagesnotsupportedDB' => "Ista pagina ùn hè dispunibile perchè '''\$wgUseDatabaseMessages''' ùn hè micca attivu.",
+'allmessages-filter-legend' => 'Filtru',
+'allmessages-filter' => 'Filtrà per statu di mudifica:',
+'allmessages-filter-unmodified' => 'Micca mudificati',
+'allmessages-filter-all' => 'Tutti',
+'allmessages-filter-modified' => 'Mudificati',
+'allmessages-prefix' => 'Filtrà per prefissu:',
+'allmessages-language' => 'Lingua:',
+'allmessages-filter-submit' => 'Applicà',
+
+# Thumbnails
+'thumbnail-more' => 'Allargà',
 
 # Special:Import
 'import-interwiki-submit' => 'Impurtà',
@@ -458,26 +664,58 @@ U to indirizzu IP serà registratu indu a cronolugia di ista pagina.",
 'import-logentry-upload-detail' => '$1 {{PLURAL:$1|revisione|revisione}}',
 
 # Tooltip help for the actions
-'tooltip-pt-userpage' => 'A to pagina di utilizatore',
+'tooltip-pt-userpage' => 'A to pagina di cuntributore',
 'tooltip-pt-mytalk' => 'A to pagina di discussione',
 'tooltip-pt-preferences' => 'E to preferenze',
-'tooltip-pt-watchlist' => 'U listinu di e pagine chì seguiti',
-'tooltip-pt-mycontris' => 'U listinu di e to cuntribuzioni',
+'tooltip-pt-watchlist' => "Lista di e pagine ch'è tù suviti",
+'tooltip-pt-mycontris' => 'Lista di e to cuntribuzioni',
 'tooltip-pt-login' => 'U registramentu hè suggeritu, micca ubligatoriu',
-'tooltip-pt-logout' => 'Scunnessione',
-'tooltip-ca-protect' => 'Pruteghje issa pagina',
-'tooltip-ca-delete' => 'Supprimà issa pagina',
+'tooltip-pt-logout' => 'Esce da a sessione',
+'tooltip-ca-talk' => 'Vede e discussione relative à sta pagina',
+'tooltip-ca-edit' => "Pò mudificà 'ssa pagina. Per piacè improda l'ozzione di previsualisazzione prima di salvà",
+'tooltip-ca-addsection' => 'Cumincià una nova sezzione',
+'tooltip-ca-viewsource' => 'Sta pagina hè prutetta, ma si pò vede u so codice surghjente',
+'tooltip-ca-history' => 'Versione precedente di sta pagina',
+'tooltip-ca-protect' => 'Prutege sta pagina',
+'tooltip-ca-delete' => 'Supprime sta pagina',
+'tooltip-ca-move' => "Move 'ssa pagina",
+'tooltip-ca-watch' => "Aghjunghje 'ssa pagina à u listinu di e pagine ch'è tù suviti",
+'tooltip-search' => 'Circà in {{SITENAME}}',
+'tooltip-search-go' => "Andà à una pagina incù u titolu indicatu, s'ella esiste",
+'tooltip-search-fulltext' => 'Circà e pagine cuntinenti stu testu',
 'tooltip-p-logo' => 'Pagina maestra',
 'tooltip-n-mainpage' => 'Andà à a Pagina maestra',
+'tooltip-n-mainpage-description' => 'Andà à a pagina maestra',
+'tooltip-n-portal' => 'À prupositu di u prugettu, ciò chì si pò fà, induve truvà qualcosa',
+'tooltip-n-currentevents' => "Informazione nantu à l'evvenimenti di attualità",
+'tooltip-n-recentchanges' => "Listinu di l'ultime mudifiche di u situ",
+'tooltip-n-randompage' => "Sceglie una pagina à l'accasu",
+'tooltip-n-help' => 'Pagine di aiutu',
+'tooltip-t-whatlinkshere' => 'Listinu di tutte e pagine chì sò ligate à quessa',
+'tooltip-t-recentchangeslinked' => "Versione di l'ultime mudifiche à e pagine legate à quessa",
+'tooltip-t-contributions' => "Listinu di e mudifiche di 'ssu cuntributore",
 'tooltip-t-specialpages' => 'Listinu di tutte e pagine spiciale',
-'tooltip-ca-nstab-user' => 'Vede a pagina di utilizatore',
+'tooltip-t-print' => "Versione stampevule di 'ssa pagina",
+'tooltip-t-permalink' => 'Ligame permanente à e revisione di sta pagina',
+'tooltip-ca-nstab-main' => "Vede u cuntenutu di l'articulu",
+'tooltip-ca-nstab-user' => 'Vede a pagina di cuntributore',
+'tooltip-ca-nstab-project' => 'Vede a pagina di u prugettu',
+'tooltip-ca-nstab-template' => 'Vede u mudellu',
+'tooltip-ca-nstab-category' => 'Vede a pagina di categuria',
+'tooltip-minoredit' => "Signalà com'è mudifica minore",
+'tooltip-save' => 'Arrighjistrà i cambiamenti',
+'tooltip-preview' => 'Previsualizà i cambiamenti (si cunsiglia di salvà prima)',
+'tooltip-diff' => 'Mustrà e mudifiche fatte à u testu',
+'tooltip-compareselectedversions' => 'Vede e differenze trà e dui versione selezziunate di sta pagina.',
 
 # Attribution
 'anonymous' => '{{PLURAL:$1|Utilizatore anonimu|Utilizatori anonimi}} di {{SITENAME}}',
 'others' => 'altri',
 
 # Media information
-'show-big-image' => 'Imagine in alta resoluzione',
+'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.',
 
 # Special:NewFiles
 'showhidebots' => '($1 boti)',
@@ -504,16 +742,20 @@ U to indirizzu IP serà registratu indu a cronolugia di ista pagina.",
 'exif-saturation-0' => 'Nurmale',
 
 # 'all' in various places, this might be different for inflected languages
-'watchlistall2' => 'tutti',
+'watchlistall2' => 'tutte',
 'monthsall' => 'tutti',
 
 # action=purge
 'confirm_purge_button' => "D'accordu",
 
 # Table pager
-'table_pager_next' => 'Prossima pagina',
+'table_pager_next' => 'Pagina seguente',
+'table_pager_prev' => 'Pagina precedente',
 'table_pager_first' => 'Prima pagina',
 'table_pager_last' => 'Ultima pagina',
+'table_pager_limit' => 'Mustrà $1 elementi per pagina',
+'table_pager_limit_label' => 'Risultati per pagina:',
+'table_pager_limit_submit' => 'Invià',
 'table_pager_empty' => 'Micca risultati',
 
 # Auto-summaries
@@ -523,8 +765,12 @@ U to indirizzu IP serà registratu indu a cronolugia di ista pagina.",
 # Watchlist editor
 'watchlistedit-raw-titles' => 'Pagine:',
 
+# Watchlist editing tools
+'watchlisttools-view' => 'Vede e modifiche assuciate',
+
 # Special:Version
 'version' => 'Versione',
+'version-specialpages' => 'Pagine spiciale',
 
 # Special:SpecialPages
 'specialpages' => 'Pagine spiciale',
index bbfe14a..59dcbbf 100644 (file)
@@ -9,6 +9,7 @@
  *
  * @author Chmee2
  * @author Danny B.
+ * @author DemonioCZ
  * @author Dontlietome7
  * @author Geitost
  * @author Helix84
@@ -374,7 +375,6 @@ $messages = array(
 'tog-numberheadings' => 'Automaticky číslovat nadpisy',
 'tog-showtoolbar' => 'Zobrazit panel nástrojů',
 'tog-editondblclick' => 'Editovat stránky dvojklikem',
-'tog-editsection' => 'Zapnout možnost editace části stránky pomocí odkazu [editovat]',
 'tog-editsectiononrightclick' => 'Umožnit editaci části stránky kliknutím pravým tlačítkem na nadpisy sekcí',
 'tog-showtoc' => 'Zobrazovat obsah (na stránkách s více než třemi nadpisy)',
 'tog-rememberpassword' => 'Zapamatovat si mé přihlášení v tomto prohlížeči (maximálně $1 {{PLURAL:$1|den|dny|dní}})',
@@ -1187,6 +1187,8 @@ Zřejmě byla smazána.',
 'content-not-allowed-here' => 'Obsah typu $1 není na stránce [[$2]] dovolen.',
 'editwarning-warning' => 'Opuštěním této stránky se mohou veškeré provedené změny ztratit.
 Přihlášení uživatelé si mohou toto varování vypnout na záložce „Editace“ v uživatelském nastavení.',
+'editpage-notsupportedcontentformat-title' => 'Nepodporovaný formát obsahu',
+'editpage-notsupportedcontentformat-text' => 'Model obsahu $2 nepodporuje formát obsahu $1.',
 
 # Content models
 'content-model-wikitext' => 'wikitext',
@@ -1436,6 +1438,7 @@ Podrobnosti mohou být uvedeny v [{{fullurl:{{#Special:Log}}/delete|page={{FULLP
 'search-result-score' => 'Relevantnost: $1 %',
 'search-redirect' => '(přesměrování $1)',
 'search-section' => '(část $1)',
+'search-file-match' => '(odpovídá obsah souboru)',
 'search-suggest' => 'Mysleli jste: $1',
 'search-interwiki-caption' => 'Sesterské projekty',
 'search-interwiki-default' => 'Výsledky z $1:',
@@ -2531,7 +2534,7 @@ Rady a kontakt:
 'delete-edit-reasonlist' => 'Editovat důvody smazání',
 'delete-toobig' => 'Tato stránka má velkou historii editací, přes $1 {{PLURAL:$1|verzi|verze|verzí}}. Mazání takových stránek je omezeno, aby se předešlo nechtěnému narušení {{grammar:2sg|{{SITENAME}}}}.',
 'delete-warning-toobig' => 'Tato stránka má velkou historii editací, přes $1 {{PLURAL:$1|verzi|verze|verzí}}. Mazání takových stránek může narušit databázové operace {{grammar:2sg|{{SITENAME}}}}; postupujte opatrně.',
-'deleting-backlinks-warning' => "'''Upozornění:''' Na stránku, kterou se chystáte smazat, odkazují jiné stránky.",
+'deleting-backlinks-warning' => "'''Upozornění:''' Stránka, kterou se chystáte smazat, je na jiných stránkách odkazována nebo vkládána.",
 
 # Rollback
 'rollback' => 'Vrátit zpět editace',
@@ -2762,6 +2765,7 @@ Udejte přesný důvod níže (například ocitujte, které stránky byly poško
 Můžete si prohlédnout [[Special:BlockList|seznam zablokovaných uživatelů]].',
 'ipb-blockingself' => 'Chystáte se zablokovat {{gender:|sám|sama|sami}} sebe! Jste si {{gender:|jist|jista|jisti}}, že to chcete udělat?',
 'ipb-confirmhideuser' => 'Chystáte se zablokovat uživatele se zapnutou volbou „skrýt uživatelské jméno“. To způsobí, že jméno uživatele zmizí ze všech seznamů a protokolovacích záznamů. Jste si {{gender:|jist|jista|jisti}}, že to chcete udělat?',
+'ipb-confirmaction' => 'Pokud jste si {{GENDER:|jist|jista|jisti}}, že to chcete udělat, zaškrtněte pole „{{int:ipb-confirm}}“ dole.',
 'ipb-edit-dropdown' => 'Editace seznamu důvodů zablokování',
 'ipb-unblock-addr' => 'Odblokovat uživatele nebo IP $1',
 'ipb-unblock' => 'Odblokovat uživatele nebo IP adresu',
@@ -2824,7 +2828,7 @@ Vizte též [[Special:BlockList|seznam všech probíhajících bloků]].',
 'range_block_disabled' => 'Blokování rozsahů IP adres je zakázáno.',
 'ipb_expiry_invalid' => 'Neplatný čas vypršení.',
 'ipb_expiry_temp' => 'Blokování skrytých uživatelských jmen by měla být trvalá.',
-'ipb_hide_invalid' => 'Tento účet nelze utajit; možná má příliš mnoho editací.',
+'ipb_hide_invalid' => 'Tento účet nelze utajit; má více než $1 {{PLURAL:$1|editaci|editace|editací}}.',
 'ipb_already_blocked' => '„$1“ již je zablokován.',
 'ipb-needreblock' => '$1 je již zablokován(a). Chcete změnit nastavení bloku?',
 'ipb-otherblocks-header' => '{{PLURAL:$1|Jiné zablokování|Jiná zablokování}}',
@@ -3995,7 +3999,7 @@ Seznam editovaných stránek můžete také [[Special:EditWatchlist|editovat ve
 'version-parser-function-hooks' => 'Funkce parseru',
 'version-hook-name' => 'Název přípojného bodu',
 'version-hook-subscribedby' => 'Volán z',
-'version-version' => '(Verze $1)',
+'version-version' => '($1)',
 'version-license' => 'Licence MediaWiki',
 'version-ext-license' => 'Licence',
 'version-ext-colheader-name' => 'Rozšíření',
@@ -4285,4 +4289,6 @@ V podstatě rozbalí prakticky všechno v dvojitých složených závorkách.',
 'expand_templates_generate_rawhtml' => 'Zobrazit surové HTML',
 'expand_templates_preview' => 'Náhled',
 
+# Unknown messages
+'uploadinvalidxml' => 'XML v načteném souboru nelze zpracovat.',
 );
index 574057a..9bd91a0 100644 (file)
@@ -129,7 +129,6 @@ $messages = array(
 'tog-numberheadings' => "Rhifo penawdau'n awtomatig",
 'tog-showtoolbar' => 'Dangos y bar offer golygu',
 'tog-editondblclick' => 'Golygu tudalennau wrth glicio ddwywaith',
-'tog-editsection' => 'Galluogi golygu adran trwy ddolennau [golygu] uwchben yr adran',
 'tog-editsectiononrightclick' => 'Galluogi golygu adran drwy dde-glicio ar bennawd yr adran',
 'tog-showtoc' => 'Dangos y daflen gynnwys (ar gyfer tudalennau sydd â mwy na 3 pennawd)',
 'tog-rememberpassword' => "Y porwr hwn i gofio'r manylion mewngofnodi (hyd at $1 {{PLURAL:$1||diwrnod|ddiwrnod|diwrnod|diwrnod|diwrnod}})",
index 03a0a57..71d870e 100644 (file)
@@ -204,7 +204,6 @@ $messages = array(
 'tog-numberheadings' => 'Automatisk nummerering af overskrifter',
 'tog-showtoolbar' => 'Vis værktøjslinje til redigering',
 'tog-editondblclick' => 'Redigér sider med dobbeltklik',
-'tog-editsection' => 'Redigér afsnit ved hjælp af [redigér]-henvisninger',
 'tog-editsectiononrightclick' => 'Redigér afsnit ved at højreklikke på deres titler',
 'tog-showtoc' => 'Vis indholdsfortegnelse (på sider med mere end tre afsnit)',
 'tog-rememberpassword' => 'Husk mig i denne browser (i højst $1 {{PLURAL:$1|dag|dage}})',
@@ -2600,9 +2599,7 @@ Angiv en konkret begrundelse herunder (for eksempel med angivelse af sider der h
 'badipaddress' => 'IP-adressen/brugernavnet er udformet forkert eller eksistere ikke.',
 'blockipsuccesssub' => 'Blokeringen er gennemført.',
 'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] er blevet blokeret.<br />
-Se [[Special:BlockList|blokeringslisten]] for alle blokeringer.
-
-[[User:$1|$1]] ([[User talk:$1|diskussion]] | [[Special:Contributions/$1|bidrag]]) er blevet blokeret. <br />Se [[Special:BlockList|blokeringslisten]] for alle blokeringer.',
+Se [[Special:BlockList|blokeringslisten]] for alle blokeringer.',
 'ipb-blockingself' => 'Du er ved at blokere dig selv! Er du sikker på, du vil gøre det?',
 'ipb-confirmhideuser' => 'Du er ved at blokere en bruger med "skjul bruger" aktiveret. Dette vil skjule brugerens navn på alle lister og logposter. Er du sikker på du vil gøre det?',
 'ipb-edit-dropdown' => 'Rediger blokeringsbegrundelser',
index a2e01a6..1334419 100644 (file)
@@ -434,7 +434,6 @@ $messages = array(
 'tog-numberheadings' => 'Überschriften automatisch nummerieren',
 'tog-showtoolbar' => 'Bearbeiten-Werkzeugleiste anzeigen',
 'tog-editondblclick' => 'Seiten mit Doppelklick bearbeiten',
-'tog-editsection' => 'Links zum Bearbeiten einzelner Abschnitte anzeigen',
 'tog-editsectiononrightclick' => 'Einzelne Abschnitte per Rechtsklick bearbeiten',
 'tog-showtoc' => 'Anzeige eines Inhaltsverzeichnisses auf Seiten mit mehr als drei Überschriften',
 'tog-rememberpassword' => 'Mit diesem Browser dauerhaft angemeldet bleiben (maximal $1 {{PLURAL:$1|Tag|Tage}})',
@@ -985,6 +984,8 @@ Wenn du ihn angibst, wird er für die Zuordnung der Beiträge verwendet.',
 'retypenew' => 'Neues Passwort (nochmal):',
 'resetpass_submit' => 'Passwort übermitteln und anmelden',
 'changepassword-success' => 'Dein Passwort wurde erfolgreich geändert!',
+'changepassword-throttled' => 'Du hast kürzlich zu viele Anmeldeversuche unternommen.
+Bitte warte $1, bevor du es erneut versuchst.',
 'resetpass_forbidden' => 'Das Passwort kann nicht geändert werden.',
 'resetpass-no-info' => 'Du musst dich anmelden, um auf diese Seite direkt zuzugreifen.',
 'resetpass-submit-loggedin' => 'Passwort ändern',
@@ -1040,6 +1041,8 @@ Temporäres Passwort: $2',
 'changeemail-password' => 'Dein {{SITENAME}}-Passwort:',
 'changeemail-submit' => 'E-Mail-Adresse ändern',
 'changeemail-cancel' => 'Abbrechen',
+'changeemail-throttled' => 'Du hast zu viele Anmeldeversuche unternommen.
+Bitte warte $1, bevor du es erneut versuchst.',
 
 # Special:ResetTokens
 'resettokens' => 'Tokens zurücksetzen',
@@ -1254,6 +1257,8 @@ Sie wurde anscheinend gelöscht.',
 'content-not-allowed-here' => 'Der Inhalt „$1“ ist auf der Seite [[$2]] nicht erlaubt',
 'editwarning-warning' => 'Das Verlassen dieser Seite kann dazu führen, dass deine Änderungen verloren gehen.
 Wenn du angemeldet bist, kannst du das Anzeigen dieser Warnung im Bereich „Bearbeiten“ deiner Einstellungen abschalten.',
+'editpage-notsupportedcontentformat-title' => 'Das Inhaltsformat wird nicht unterstützt',
+'editpage-notsupportedcontentformat-text' => 'Das Inhaltsformat $1 wird vom Inhaltsmodell $2 nicht unterstützt.',
 
 # Content models
 'content-model-wikitext' => 'Wikitext',
@@ -1501,6 +1506,7 @@ Einzelheiten sind im [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}}
 'search-result-score' => 'Relevanz: $1 %',
 'search-redirect' => '(Weiterleitung von „$1“)',
 'search-section' => '(Abschnitt $1)',
+'search-file-match' => '(treffende Dateiinhalte)',
 'search-suggest' => 'Meintest du „$1“?',
 'search-interwiki-caption' => 'Schwesterprojekte',
 'search-interwiki-default' => '$1 Ergebnisse:',
@@ -2596,7 +2602,7 @@ Rückmeldungen und weitere Hilfe: {{canonicalurl:{{MediaWiki:Helppage}}}}',
 'delete-edit-reasonlist' => 'Löschgründe bearbeiten',
 'delete-toobig' => 'Diese Seite hat mit mehr als $1 {{PLURAL:$1|Version|Versionen}} eine sehr lange Versionsgeschichte. Das Löschen solcher Seiten wurde eingeschränkt, um eine versehentliche Überlastung der Server zu verhindern.',
 'delete-warning-toobig' => 'Diese Seite hat mit mehr als $1 {{PLURAL:$1|Version|Versionen}} eine sehr lange Versionsgeschichte. Das Löschen kann zu Störungen im Datenbankbetrieb führen.',
-'deleting-backlinks-warning' => "'''Warnung:''' Es verweisen noch andere Seiten auf die zu löschende Seite.",
+'deleting-backlinks-warning' => "'''Warnung:''' Es verweisen noch andere Seiten auf die zu löschende Seite oder diese Seite ist noch woanders eingebunden.",
 
 # Rollback
 'rollback' => 'Zurücksetzen der Änderungen',
@@ -2892,7 +2898,7 @@ Siehe die [[Special:BlockList|Liste der gesperrten IP-Adressen und Benutzernamen
 'range_block_disabled' => 'Die Möglichkeit, ganze Adressräume zu sperren, ist nicht aktiviert.',
 'ipb_expiry_invalid' => 'Die eingegebene Dauer ist ungültig.',
 'ipb_expiry_temp' => 'Benutzernamens-Sperren mit der Verstecken-Option müssen permanent sein.',
-'ipb_hide_invalid' => 'Dieses Konto kann nicht unterdrückt werden, da es zu viele Bearbeitungen aufweist.',
+'ipb_hide_invalid' => 'Dieses Konto kann nicht unterdrückt werden, da es mehr als {{PLURAL:$1|eine Bearbeitung|$1 Bearbeitungen}} aufweist.',
 'ipb_already_blocked' => '„$1“ ist bereits gesperrt',
 'ipb-needreblock' => '„$1“ ist bereits gesperrt. Möchtest du die Sperrparameter ändern?',
 'ipb-otherblocks-header' => 'Andere {{PLURAL:$1|Sperre|Sperren}}',
@@ -3278,7 +3284,7 @@ Hier '''NICHTS''' eintragen!",
 'pageinfo-article-id' => 'Seitenkennnummer',
 'pageinfo-language' => 'Seiteninhaltssprache',
 'pageinfo-content-model' => 'Seiteninhaltsmodell',
-'pageinfo-robot-policy' => 'Indexierung durch Robots',
+'pageinfo-robot-policy' => 'Indizierung durch Suchmaschinen',
 'pageinfo-robot-index' => 'Erlaubt',
 'pageinfo-robot-noindex' => 'Nicht erlaubt',
 'pageinfo-views' => 'Anzahl der Seitenaufrufe',
@@ -4035,7 +4041,7 @@ Du kannst auch die [[Special:EditWatchlist|Standardseite]] zum Bearbeiten benutz
 'version-svn-revision' => '(Version $2)',
 'version-license' => 'MediaWiki-Lizenz',
 'version-ext-license' => 'Lizenz',
-'version-ext-colheader-name' => 'Erweiterung',
+'version-ext-colheader-name' => 'Bezeichnung',
 'version-ext-colheader-version' => 'Version',
 'version-ext-colheader-license' => 'Lizenz',
 'version-ext-colheader-description' => 'Beschreibung',
@@ -4065,7 +4071,7 @@ Eine [{{SERVER}}{{SCRIPTPATH}}/COPYING Kopie der ''GNU General Public License'']
 # Special:Redirect
 'redirect' => 'Weiterleitung auf Benutzerseite, Seite, Seitenversion oder Datei',
 'redirect-legend' => 'Weiterleitung auf eine Benutzerseite, Seite, Seitenversion oder Datei',
-'redirect-summary' => 'Diese Spezialseite leitet auf eine Benutzerseite (numerische Benutzerkennung angegeben), Seite (Seitenkennung angeben), Seitenversion (Versionskennung angegeben) oder Datei (Dateiname angegeben) weiter. Benutzung: [[{{#Special:Redirect}}/user/101]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]] oder [[{{#Special:Redirect}}/file/Example.jpg]].',
+'redirect-summary' => 'Diese Spezialseite leitet auf eine Benutzerseite (numerische Benutzerkennung angegeben), Seite (Seitenkennung angegeben), Seitenversion (Versionskennung angegeben) oder Datei (Dateiname angegeben) weiter. Benutzung: [[{{#Special:Redirect}}/user/101]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]] oder [[{{#Special:Redirect}}/file/Example.jpg]].',
 'redirect-submit' => 'Los',
 'redirect-lookup' => 'Suchen:',
 'redirect-value' => 'Kennung oder Dateiname:',
@@ -4327,4 +4333,7 @@ faktisch alles was in doppelten geschweiften Klammern enthalten ist.',
 'expand_templates_generate_rawhtml' => 'Rohes HTML anzeigen',
 'expand_templates_preview' => 'Vorschau',
 
+# Unknown messages
+'createaccount-hook-aborted' => '$1',
+'uploadinvalidxml' => 'Das XML in der hochgeladenen Datei konnte nicht geparst werden.',
 );
index 2acd527..e5ae653 100644 (file)
@@ -337,11 +337,10 @@ $messages = array(
 'tog-hidepatrolled' => 'Vurnayışanê qontrolkerdeyan pela vurnayışê peyêni de bınımne',
 'tog-newpageshidepatrolled' => 'Pelanê qontrolkerdeyan lista pelanê neweyan de bınımne',
 'tog-extendwatchlist' => 'Lista seyrkerdışi hera bıke ke vurnayışi pêro basê, tenya tewr peyêni nê',
-'tog-usenewrc' => 'Pera vurnayışanê grube de vurnayışê peyêni u lista seyrkerdışi (JavaScript lazımo)',
+'tog-usenewrc' => 'Vurnayışê ke pela vurnayışanê peyênan û lista seyrkerdışi derê inan grube ke.',
 'tog-numberheadings' => 'Sernuşteyan be xo numre cı şane',
 'tog-showtoolbar' => 'Toolbar virnayisi bivin (JavaScript lazımo)',
 'tog-editondblclick' => 'Per virnayisi di dilet klik bike (JavaScript lazımo)',
-'tog-editsection' => 'Vurnayışê qısımi be gıreyanê [bıvurne] ra feal ke',
 'tog-editsectiononrightclick' => 'Qısıman be tıknayışê serrêze ra ebe gocega raşte bıvurne (JavaScript lazımo)',
 'tog-showtoc' => 'Tabloyê tedeesteyan bımocne (de pelanê be hirê sernuşteyan ra vêşêri de)',
 'tog-rememberpassword' => 'Parola mı nê cıgeyrayoği de bia xo viri (seba tewr zêde $1 {{PLURAL:$1|roce|rocan}}).',
@@ -352,15 +351,15 @@ $messages = array(
 'tog-minordefault' => "Vurnayışanê xo pêrune ''vurnayışo qıckek'' nışan bıde",
 'tog-previewontop' => 'Verqayti pela nuştışi ser de bımocne',
 'tog-previewonfirst' => 'Vurnayışo verên de verqayti tım bımocne',
-'tog-enotifwatchlistpages' => 'Yew pele ya zi dosyaya ke lista mına seyrkerdışi de vurnayê mı rê e-poste bırışe',
+'tog-enotifwatchlistpages' => 'Jû pele ya ki dosyawa ke lista mına seyrkerdışi de vurnae, mı rê e-mail bırışe',
 'tog-enotifusertalkpages' => 'Pela mına werênayışi ke vurnayê mı rê e-poste bırışe',
-'tog-enotifminoredits' => 'Vurnayışanê qıckekanê pelan u dosyeyan de zi mı rê e-poste bırışe',
+'tog-enotifminoredits' => 'Pelan de vurnayışanê qıckekan u dosyan de ki mı rê e-mail bırışe',
 'tog-enotifrevealaddr' => 'Adresa e-posteyê mı posteyê xeberan de bımocne',
 'tog-shownumberswatching' => 'Amarê karberanê seyrkerdoğan bımocne',
-'tog-oldsig' => 'İmzaya mewcude:',
+'tog-oldsig' => 'İmza mewcude:',
 'tog-fancysig' => 'İmza rê mameleyê wikimeqaley bıke (bê gıreyo otomatik)',
-'tog-uselivepreview' => 'Verqayt di weseye  karneno (JavaScript lazım o) (Cerbino)',
-'tog-forceeditsummary' => 'Mı ke xulasa kerde cı vira, hay be mı ser de',
+'tog-uselivepreview' => 'Verqayto giyane bıgureyne (cerrebane)',
+'tog-forceeditsummary' => 'Mı ke xulasa veng verdaye, hay a mı ser de',
 'tog-watchlisthideown' => 'Vurnayışanê mı lista mına seyrkerdışi de bınımne',
 'tog-watchlisthidebots' => 'Lista seyrkerdışi ra vurnayışanê boti bınımne',
 'tog-watchlisthideminor' => 'Vurnayışanê qıckekan lista mına seyrkerdışi de bınımne',
@@ -383,43 +382,43 @@ $messages = array(
 'editfont-style' => 'Cayê vurnayışi de terzê nuştışi:',
 'editfont-default' => 'Cıgeyrayoğo hesabiyaye',
 'editfont-monospace' => 'Terzê nusteyê sabıtcagırewtoği',
-'editfont-sansserif' => 'Babetê Sans-serifi',
-'editfont-serif' => 'Babetê serifi',
+'editfont-sansserif' => 'Fontê Sans-serifi',
+'editfont-serif' => 'Font (çêşıdê nuştey) Serif',
 
 # Dates
-'sunday' => 'Bazar',
-'monday' => 'Berarek',
-'tuesday' => 'Telete',
+'sunday' => 'Kırê (Bazar)',
+'monday' => 'Dışeme',
+'tuesday' => 'Sêşeme',
 'wednesday' => 'Çarşeme',
-'thursday' => 'Panşeme',
-'friday' => 'Éne',
-'saturday' => 'Bahdé éni',
-'sun' => 'Baz',
-'mon' => 'Bbz',
-'tue' => 'Tlt',
+'thursday' => 'Pancşeme',
+'friday' => 'Yene',
+'saturday' => 'Şeme',
+'sun' => 'Krê',
+'mon' => 'Dış',
+'tue' => 'Sêş',
 'wed' => 'Çrş',
 'thu' => 'Pşm',
-'fri' => 'Êne',
-'sat' => 'Bdé',
+'fri' => 'Yen',
+'sat' => 'Şem',
 'january' => 'Çele',
-'february' => 'Zemherı',
-'march' => 'Adar',
+'february' => 'Sıbate',
+'march' => 'Adar (Mart)',
 'april' => 'Nisane',
-'may_long' => 'Gúlan',
+'may_long' => 'Gulane',
 'june' => 'Heziran',
-'july' => 'Temuz',
+'july' => 'Temuze',
 'august' => 'Tebaxe',
 'september' => 'Keşkelun',
 'october' => 'Tışrino Verên',
 'november' => 'Tışrino Peyên',
 'december' => 'Kanun',
 'january-gen' => 'Çele',
-'february-gen' => 'Zemherı',
-'march-gen' => 'Mert',
+'february-gen' => 'Sıbate',
+'march-gen' => 'Adar',
 'april-gen' => 'Nisane',
-'may-gen' => 'Gúlan',
-'june-gen' => 'Heziran',
-'july-gen' => 'Temuz',
+'may-gen' => 'Gulane',
+'june-gen' => 'Hezirane',
+'july-gen' => 'Temuze',
 'august-gen' => 'Tebaxe',
 'september-gen' => 'Keşkelun',
 'october-gen' => 'Tışrino Verên',
@@ -438,7 +437,7 @@ $messages = array(
 'nov' => 'Tşp',
 'dec' => 'Kan',
 'january-date' => 'Çele  $1',
-'february-date' => 'Şıbate $1',
+'february-date' => 'Sıbate $1',
 'march-date' => 'Adar $1',
 'april-date' => 'Nisane $1',
 'may-date' => 'Gulane $1',
@@ -446,13 +445,13 @@ $messages = array(
 'july-date' => 'Temuze $1',
 'august-date' => 'Tebaxe $1',
 'september-date' => 'Keşkelun $1',
-'october-date' => 'Cıtan $1',
-'november-date' => 'Qasım $1',
-'december-date' => '$1 Kanun',
+'october-date' => 'Tışrino Verên $1',
+'november-date' => 'Tışrino Peyên $1',
+'december-date' => 'Kanun $1',
 
 # Categories related messages
-'pagecategories' => '{{PLURAL:$1|Kategori|Kategoriy}}',
-'category_header' => 'Perré ke kategori da "$1" de yé',
+'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ê',
 'category-empty' => "''Ena kategoriye de hewna qet nuştey ya zi medya çıniyê.''",
@@ -471,7 +470,7 @@ $messages = array(
 'broken-file-category' => 'Peleye ke gıreyê dosyeyanê ğeletan muhtewa kenê',
 'categoryviewer-pagedlinks' => '($1) ($2)',
 
-'about' => 'Heqdé cı',
+'about' => 'Heqa cı de',
 'article' => 'Wesiqe',
 'newwindow' => '(pençereyê newey de beno a)',
 'cancel' => 'Bıtexelne',
@@ -500,11 +499,11 @@ $messages = array(
 'vector-action-undelete' => 'Esterıtışi peyser bıgê',
 'vector-action-unprotect' => 'Starkerdışi bıvurne',
 'vector-simplesearch-preference' => 'Çuweya cı geyreyış de rehater aktiv ke (Tenya vector skin de)',
-'vector-view-create' => 'İycad ke',
+'vector-view-create' => 'Vıraze',
 'vector-view-edit' => 'Bıvurne',
 'vector-view-history' => 'Verênan bıvêne',
 'vector-view-view' => 'Bıwane',
-'vector-view-viewsource' => 'Çımi bıvin',
+'vector-view-viewsource' => 'Çımey bıvêne',
 'actions' => 'Hereketi',
 'namespaces' => 'Cayê namey',
 'variants' => 'Varyanti',
@@ -518,19 +517,19 @@ $messages = array(
 'searchbutton' => 'Cı geyre',
 'go' => 'Şo',
 'searcharticle' => 'Şo',
-'history' => 'Verora perer',
+'history' => 'Tarixê pele',
 'history_short' => 'Verén',
 'updatedmarker' => 'cıkewtena mına peyêne ra dıme biyo rocane',
-'printableversion' => 'Versiyona Nusnayışi',
+'printableversion' => 'Asayışê çapkerdışi',
 'permalink' => 'Gıreyo jûqere',
 'print' => 'Nusten ke',
 'view' => 'Bıvin',
 'edit' => 'Bıvurne',
-'create' => 'İycad ke',
+'create' => 'Vıraze',
 'editthispage' => 'Ena pele bıvurne',
 'create-this-page' => 'Na pele bınuse',
 'delete' => 'Bestere',
-'deletethispage' => 'Ena perer besternê',
+'deletethispage' => 'Ena pele bestere',
 'undeletethispage' => 'Na perer mebesterne',
 'undelete_short' => '{{PLURAL:$1|Yew vurnayışi|$1 Vurnayışan}} mestere',
 'viewdeleted_short' => '{{PLURAL:$1|Yew vurnayışo esterıte|$1 Vurnayışanê esterıtan}} bımocne',
@@ -576,13 +575,13 @@ $1',
 'pool-errorunknown' => 'Xeta nêzanıtiye',
 
 # 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).
-'aboutsite' => 'Heqdé {{SITENAME}}',
-'aboutpage' => 'Project:Heqdê cı',
+'aboutsite' => 'Heqa {{SITENAME}} de',
+'aboutpage' => 'Project:Heqa cı de',
 'copyright' => 'Zerrekacı $1 bındı not biya.',
 'copyrightpage' => '{{ns:project}}:Heqa telifi',
 'currentevents' => 'Veng u vac',
 'currentevents-url' => 'Project:Rocani hadisey',
-'disclaimers' => 'Reddiya mesuliyeti',
+'disclaimers' => 'Redê mesuliyeti',
 'disclaimerpage' => 'Project:Reddê mesuliyetê bıngey',
 'edithelp' => 'Peştdariya vurnayışi',
 'helppage' => 'Help:Zerrek',
@@ -617,7 +616,7 @@ $1',
 'editold' => 'bıvurne',
 'viewsourceold' => 'çımey cı bıvinê',
 'editlink' => 'bıvurne',
-'viewsourcelink' => 'Ã\87ımi bıvin',
+'viewsourcelink' => 'çımey bıvêne',
 'editsectionhint' => 'Leteyo ke bıvuriyo: $1',
 'toc' => 'Sernameyê meselan',
 'showtoc' => 'bımocne',
@@ -650,7 +649,7 @@ $1',
 'nstab-mediawiki' => 'Mesac',
 'nstab-template' => 'Şablon',
 'nstab-help' => 'Pela peşti',
-'nstab-category' => 'Kategori',
+'nstab-category' => 'Kategoriye',
 
 # Main script and global functions
 'nosuchaction' => 'Fealiyeto wınasi çıniyo',
@@ -709,7 +708,7 @@ Beno ke, tede yew ya zi zêdê işareti estê ke sernaman de nêxebetiyenê.',
 'perfcached' => 'Datay cı ver hazır biye. No semedê ra nıkayin niyo! tewr zaf {{PLURAL:$1|netice|$1 netice}} debêno de',
 'perfcachedts' => 'Cêr de malumatê nımıteyi esti, demdê newe kerdışo peyın: $1. Tewr zaf {{PLURAL:$4|netice|$4 neticey cı}} debyayo de',
 'querypage-no-updates' => 'Nıka newe kerdış nêbeno. no datayi ca de newe nêbeni .',
-'viewsource' => 'Çımi bıvin',
+'viewsource' => 'Çımey bıvêne',
 'viewsource-title' => "Cı geyrayışê $1'i bıvin",
 'actionthrottled' => 'Kerden peysnaya',
 'actionthrottledtext' => 'Riyê tedbirê anti-spami ra,  wextê do kılmek de şıma nê fealiyeti nêşkenê zaf zêde bıkerê, şıma ki no hedi viyarna ra.
@@ -935,44 +934,44 @@ Parola vêrdiye: $2',
 # Special:ChangeEmail
 'changeemail' => 'E-posta adresa xo bıvurnê',
 'changeemail-header' => 'E-posya adresta hesabdê xo bıvurnê',
-'changeemail-text' => 'Şıma qayılê ke e-postay xo bıvurnê se enê formi pırkerê. Qandê araşt kerdışi zi parolay xo şıma de bınusnê',
-'changeemail-no-info' => 'Resayışê ena pela rê Dekewtış icab keno.',
-'changeemail-oldemail' => 'E-postay şımaya newki:',
-'changeemail-newemail' => 'E-posta adresiyo newe:',
-'changeemail-none' => '(Çıno)',
-'changeemail-password' => 'Parolaya şımaya {{SITENAME}}i:',
-'changeemail-submit' => 'E-postay xo bıvurne',
+'changeemail-text' => 'Şıma ke qailê  e-postay xo bıvırnê, enê formi pırr kerê. Raştkerdışi rê ki şıma gani parolay xo bınusnê',
+'changeemail-no-info' => 'Şıma gani bıkewê pele ke derdest bıresê na pele.',
+'changeemail-oldemail' => 'E-postay şımawa nıkaêne:',
+'changeemail-newemail' => 'E-postay şımawa newiye:',
+'changeemail-none' => '(Çıniyo)',
+'changeemail-password' => 'Parolay şımawa {{SITENAME}}i:',
+'changeemail-submit' => 'E-postay xo bıvırnên',
 'changeemail-cancel' => 'Bıtexelne',
 
 # Special:ResetTokens
-'resettokens' => 'Reset fi ye',
-'resettokens-no-tokens' => 'Ena reset nefina',
-'resettokens-legend' => 'Reset fi ye',
-'resettokens-tokens' => 'Beli kerdeni:',
-'resettokens-token-label' => '$1 (weziyeta newki: $2)',
-'resettokens-watchlist-token' => 'Qandé [[Special:Watchlist|Per vırnayışa lista da temaşan]]  web wari kerdeni (Atom/RSS)',
-'resettokens-done' => 'Reset fi',
-'resettokens-resetbutton' => 'Reset fiyayış weçin',
+'resettokens' => 'Nışanan reset ke',
+'resettokens-no-tokens' => 'Nışanê reseti çıniyê',
+'resettokens-legend' => 'Nışanan reset ke',
+'resettokens-tokens' => 'Nışani:',
+'resettokens-token-label' => '$1 (weziyeto nıkaên: $2)',
+'resettokens-watchlist-token' => 'Web Feed rê nışan (Atom/RSS)ê [[Special:Watchlist|vêreno perranê lista şımawa seyrkerdışi]]',
+'resettokens-done' => 'Nışanan reset ke',
+'resettokens-resetbutton' => 'Nışananê weçıniteyan reset ke',
 
 # Edit page toolbar
 'bold_sample' => 'Metno qalın',
 'bold_tip' => 'Metno qalın',
-'italic_sample' => 'Metno vırandere',
-'italic_tip' => 'Metno vırandere',
-'link_sample' => 'Namey gırê',
-'link_tip' => 'Gıreyê miyani',
-'extlink_sample' => 'http://www.example.com şınasiya adresi',
-'extlink_tip' => 'Greyê teberi (adresi vero http:// dekerê de)',
-'headline_sample' => 'nuştey xeta seri',
-'headline_tip' => '2.ki sewiye sername',
-'nowiki_sample' => 'Non-format nuşte itiya ra bıerz',
-'nowiki_tip' => 'Format kerdışê wiki bıterknê',
+'italic_sample' => 'Metno çewt',
+'italic_tip' => 'Metno çewt',
+'link_sample' => 'Namey gırey',
+'link_tip' => 'Gırey miyani',
+'extlink_sample' => 'http://www.misal.com sernamey gırey',
+'extlink_tip' => 'Gırey teberi (xo vira mekerên http:// prefix)',
+'headline_sample' => 'metnê sernamey',
+'headline_tip' => 'Sewiya 2ıne sername',
+'nowiki_sample' => 'metnê formatkerdey berze etıya',
+'nowiki_tip' => 'Goş formatê Wiki ra mekûwe',
 'image_sample' => 'Misal resim.jpg',
-'image_tip' => 'Dosyaya gumın',
+'image_tip' => 'Dosya tewrkerdiye',
 'media_sample' => 'misal.jpg',
-'media_tip' => 'Gıreyê dosya',
-'sig_tip' => 'İmza u wext',
-'hr_tip' => 'Çıxiza dimdayi (hend akar mefiye)',
+'media_tip' => 'Gırey dosya',
+'sig_tip' => 'İmzay şıma be morê zemani',
+'hr_tip' => 'Xeta verardiye (teserrufın bıgureyne/bıxebetne)',
 
 # Edit pages
 'summary' => "<font style=\"color:Blue\">'''Xulasa:'''</font>",
@@ -982,30 +981,32 @@ Parola vêrdiye: $2',
 'savearticle' => 'Pele qeyd ke',
 'preview' => 'Verqayt',
 'showpreview' => 'Verqayti bımocne',
-'showlivepreview' => 'Verqayto cıwın',
+'showlivepreview' => 'Verqayto cınde (giyane)',
 'showdiff' => 'Vurnayışan bımocne',
-'anoneditwarning' => 'Teme!: Şıma bı hesabê xo nıkewtê cı. Hurêndiya namey şıma dı IP-adresa şıma qeyd bena u asena.',
-'anonpreviewwarning' => "''Ti hama nicikewte. Qeyd kerdiş zerre tarixê pele de adresê IP yê tu keyd keno.''",
-'missingsummary' => "'''DİQET:''' Şıma kılmnuşte nıkerd.
-Eke şıma reyna butonê qaydker ser a ne pel bê kılmnuşte qayd beno.",
-'missingcommenttext' => 'Cêr de yew xulasa binuse.',
-'missingcommentheader' => "Vir ardoğ:''' Şıma qey na mesela sername nuşte nênuşt.
-Eke şıma reyna \"{{int:savearticle}}\" qayd ker bıtıkni pel bê sername qayd beno.",
-'summary-preview' => 'Verqeydê qıssa:',
-'subject-preview' => 'Mesela/Sername  verqayd seyr kerdış:',
-'blockedtitle' => 'Karber (eza) blok biyo',
-'blockedtext' => '\'\'\'No name ya zi na IP adresê şıma ri musade çino.\'\'\'
-
-Oyo ke musade nêkeno: $1.<br />
-Sebebê musade nêdayiş: \'\'$2\'\'.
-
-* Dest pê kerdışê musade nêdayiş: $8
-* Qedyayişê musade nêdayiş: $6
-* Oyo ke cı rê musade nêdeyêno: $7
-
-Eke şıma sebebê musade nêdayiş ri itiraz keni, $1 de ya zi yewna [[{{MediaWiki:Grouppage-sysop}}|xızmetkar]] de şıma eşkeni na mesela de qıse bıkeri. [[Special:Preferences|Tercihê]] eke şıma na qısme de pey yew e-postayo raşt nêkewte cı, şıma xususiyetê "Karber ri e-posta bırışê" ra nêeşkeni istifade bıkeri, eke şıma tercihanê xo bıerz zerreyê e-postayê xo şıma hıni şenê ep-posta bırışê.
-<br />IP adresê şıma yo nıkayın $3, numreya musade nêdayiş #$5.
-<br />Eke şıma qayile yew xızmkar çiko bıpers, no malumatan not bıkere ney şıma rê lazım beni.',
+'anoneditwarning' => 'İqaz!: Şıma be hesabê xo nêkewtê cı. 
+Adresê şımaê IP tarixê vırnayışê na pele de do qeyd bo.',
+'anonpreviewwarning' => '"Şıma be hesabê xo nêkewtê cı. Eke qeyd kerê, adresê şımaê IP tarixê vırnayışê na pele de do qeyd bo."',
+'missingsummary' => "'''DİQET:''' Şıma jû xulasa nênuşte.
+Eke şıma \"{{int:savearticle}}\" reyna bıtıknê, vırnayışê şıma bê xulasa qeyd beno.",
+'missingcommenttext' => 'Cêr de jû fıkır bınusên, şıma rê zehmet.',
+'missingcommentheader' => "'''Diqet:''' Şıma seba nê fıkrvaci yew mewzu/sernuşte nênuşt.
+Eke şıma reyna \"{{int:savearticle}}\" bıtıknê, vırnayışê şıa bê mewzu/sernuşte do qeyd bo.",
+'summary-preview' => 'Verqaytê xulasa:',
+'subject-preview' => 'Verqaytê mewzu/sernuştey:',
+'blockedtitle' => 'Karber blokekerdeo',
+'blockedtext' => '\'\'\'No namey karberi ya ki no adresê IP blokekerdeo.\'\'\'
+
+Vıraştoğê blokey: $1
+Sebebê blokey: \'\'$2\'\'.
+
+* Sıftekerdena blokey: $8
+* Qediyayışê blokey: $6
+* Blokebiyae: $7
+
+Şıma şenê  $1 de ya ki  yewna [[{{MediaWiki:Grouppage-sysop}}|administrator]]i de irtıbat kewê ke na mesela sero werênê, cemaet vırazê. 
+Şıma nêşenê xısusiyetê "karberi rê e-posta bırışe" bıgureynê/bıxebetnê heta ke [[Special:Preferences|Tercihanê hesabi]] de jû e-postawa ke vêrena, beli biye u şıam gureynayışê cı ra mehrum nêbiyê.
+IP adresê şımao nıkaên $3o u numrey bloki #$5.
+Şıma rê zehmet, eke kewnê ra dıme, teferruatanê corênan not kerên.',
 'autoblockedtext' => 'IP adresê şıma otomotikmen kerda kılit, çıkı $1 verniya nê hesabi grota.
 Sebebê cı zi:
 
@@ -1196,7 +1197,7 @@ Taye şabloni zerre pel de nêmociyayeni.',
 Sebebo ke terefê $3 ra diyao ''$2''",
 
 # History pages
-'viewpagelogs' => 'Heqde na perer qeydan bıvin',
+'viewpagelogs' => 'Heqa na pele de qeydan bıvêne',
 'nohistory' => 'Verê vurnayışanê na pele çıniyo.',
 'currentrev' => 'Halo nıkayên',
 'currentrev-asof' => 'Revizyonanê peniyan, tarixê $1',
@@ -1295,7 +1296,7 @@ $1",
 'logdelete-failure' => "'''Esayişê rocaneyi eyar nêbı:'''
 $1",
 'revdel-restore' => 'asayışi bıvurne',
-'pagehist' => 'Verora perer',
+'pagehist' => 'Tarixê pele',
 'deletedhist' => 'tarixê hewna şiyaye',
 'revdelete-hide-current' => '$2 $1 ney çiye ke wexta diyayene wera (wedar dayiş) xeta da: no reviyon nınımiyeno.',
 'revdelete-show-no-access' => '$2 $1 wexta ke ney tarix de mociyayene xeta da: ne çi "vergırewtı" nişane biyo.
@@ -1327,7 +1328,7 @@ Listey xırabi u bloki re pelay [[Special:BlockList|IP'yê ke bloke biyê]] bivi
 'mergehistory-header' => 'No pel, reviyonê yew peli eşkeno yewna pelo newe de piyawano.
 no vurnayişo ke şıma keni kontrol bıkere yew pelo kehen nêbo.',
 'mergehistory-box' => 'revizyonê pelanî yew bike:',
-'mergehistory-from' => 'Para Çımi:',
+'mergehistory-from' => 'Pela çımey:',
 'mergehistory-into' => 'Pela destinasyonî',
 'mergehistory-list' => 'tarixê vurnayîşî ke eşkeno yew bi.',
 'mergehistory-merge' => '[[:$1]] qey ney revizyonê cêrini [[:$2]] şıma ekeni piyawani. Benatê wexto muwaqqet de piyayanayişê rezizyonan de tuşa radyo bıxebitne.',
@@ -1360,7 +1361,7 @@ no vurnayişo ke şıma keni kontrol bıkere yew pelo kehen nêbo.',
 'lineno' => 'Xeta $1i:',
 'compareselectedversions' => 'Rewizyonanê weçineyan pêver ke',
 'showhideselectedversions' => 'Revizyonanê weçinıtan bımocne/bınımne',
-'editundo' => 'peyser bıgi',
+'editundo' => 'peyser bıgê',
 'diff-empty' => '(Babetna niyo)',
 'diff-multi' => '({{PLURAL:$1|Yew revizyono miyanên|$1 revizyonê miyanêni}} terefê {{PLURAL:$2|yew karberi|$2 karberan}} nêmocno)',
 'diff-multi-manyusers' => '({{PLURAL:$1|jew timar kerdışo qıckeko|$1 timar kerdışo qıckeko}} timar kerdo, $2 {{PLURAL:$2|Karber|karberi}} memocne)',
@@ -1384,11 +1385,11 @@ Detayê besternayışi [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}
 'viewprevnext' => '($1 {{int:pipe-separator}} $2) ($3) bıvênên',
 'searchmenu-exists' => "''Ena 'Wikipediya de ser \"[[:\$1]]\" yew pel esto'''",
 'searchmenu-new' => "''Na Wiki de pelay \"[[:\$1]]\" vıraze!'''",
-'searchprofile-articles' => 'Perré muhteway',
+'searchprofile-articles' => 'Pelê tedeestey',
 'searchprofile-project' => 'Pelê peşti û procey',
 'searchprofile-images' => 'Multimedya',
 'searchprofile-everything' => 'Heme çi',
-'searchprofile-advanced' => 'Ravérden',
+'searchprofile-advanced' => 'Raverşiyaye',
 'searchprofile-articles-tooltip' => '$1 de cı geyré',
 'searchprofile-project-tooltip' => '$1 de bigêre',
 'searchprofile-images-tooltip' => 'Dosya cı geyr',
@@ -1408,7 +1409,7 @@ Detayê besternayışi [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}
 'searchrelated' => 'eleqeyın',
 'searchall' => 'pêro',
 'showingresults' => "#$2 netican ra {{PLURAL:$1|'''1''' netica|'''$1''' neticey}} cêr deyê.",
-'showingresultsnum' => "'''$2''' netican ra nata  {{PLURAL:$3|'''1''' netice|'''$3''' neticeyê}} cêrde liste biyê.",
+'showingresultsnum' => "'''$2''' netican ra {{PLURAL:$3|'''1''' netice|'''$3''' neticey}} cêr derê.",
 'showingresultsheader' => "{{PLURAL:$5|Neticeyê '''$1''' of '''$3'''|Neticeyanê '''$1 - $2''' hetê '''$3'''}} qe '''$4'''",
 'search-nonefound' => 'Zey perskerdışê şıma netice nêvêniya.',
 'powersearch-legend' => 'Cıgeyrayışo hera',
@@ -1429,7 +1430,7 @@ Detayê besternayışi [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}
 'prefs-skin' => 'Çerme',
 'skin-preview' => 'Verasayış',
 'datedefault' => 'Tercih çıniyo',
-'prefs-beta' => 'Xacetê beta',
+'prefs-beta' => 'Hacetê beta',
 'prefs-datetime' => 'Tarix u wext',
 'prefs-labs' => 'Xacetê labs',
 'prefs-user-pages' => 'Pela Karberi',
@@ -1684,13 +1685,13 @@ Eka tu wazene ke nameyo raşt xo bide, ma nameyo raşt ti iştirakanê ti de moc
 'action-reupload-shared' => 'dosyayê ki ho embarê medyayî de esto ser ay binusne',
 'action-upload_by_url' => 'Ena dosya yew URL ra bar bike',
 'action-writeapi' => 'ser nuşte API gure bike',
-'action-delete' => 'ena perer besternê',
+'action-delete' => 'ena pele bestere',
 'action-deleterevision' => 'nê çımraviyarnayışi bestere',
 'action-deletedhistory' => 'tarixê ena pel ki estereyî biya, ey bivine',
 'action-browsearchive' => 'pelanê esterıteyan bıgeyre',
 'action-undelete' => 'ena pele reyna biyere',
 'action-suppressrevision' => 'revizyone ki nimnaye biye reyna bivîne u restore bike',
-'action-suppressionlog' => 'Ena bağse qeydi bıvin',
+'action-suppressionlog' => 'enê qeydê xısusi bıvêne',
 'action-block' => 'enê karberi vurnayışi ra bıreyne',
 'action-protect' => 'seviyeyê pawitişî se ena pele bivurne',
 'action-rollback' => 'Lez/herbi vurnayışanê karberê peyêni tekrar bıke, oyo ke yew be yew pelê sero gureyao',
@@ -1715,23 +1716,23 @@ Eka tu wazene ke nameyo raşt xo bide, ma nameyo raşt ti iştirakanê ti de moc
 'enhancedrc-history' => 'verenayış',
 'recentchanges' => 'Vurnayışê peyêni',
 'recentchanges-legend' => 'Tercihê vurnayışanê peyênan',
-'recentchanges-summary' => 'Ena perer de wiki sero vurnayışanê peyênan teqib ke.',
+'recentchanges-summary' => 'Ena pele de wiki sero vurnayışanê peyênan teqib ke.',
 'recentchanges-noresult' => 'Zey kiterandé şıma vırnayış névineya',
 'recentchanges-feed-description' => 'Ena feed dı vurnayişanê tewr peniyan teqip bık.',
-'recentchanges-label-newpage' => 'Ena vırnayış ra pera newi vıraziyê',
-'recentchanges-label-minor' => 'Ena vırnayışa werkeka',
-'recentchanges-label-bot' => 'No vurnayışé boti yo.',
+'recentchanges-label-newpage' => 'Enê vurnayışi ra yew pela newiye vıraziye',
+'recentchanges-label-minor' => 'Eno 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' => 'Ebata na perer ebatta na nımra de vırneya',
+'recentchanges-label-plusminus' => 'Ebadê pele de bazê bayti de vayeyê cı',
 'recentchanges-legend-heading' => "'''Kıtabek:'''",
-'recentchanges-legend-newpage' => '(Zewbi bıvin [[Special:NewPages|Listeya peran de newan]])',
+'recentchanges-legend-newpage' => '([[Special:NewPages|Lista pelanê neweyan]] zi bıvêne)',
 'recentchanges-legend-plusminus' => "''(±123)''",
 'rcnotefrom' => "Cêr de '''$2''' ra nata vurnayışiyê asenê (tewr vêşi <b> '''$1'''</b> asenê).",
 'rclistfrom' => '$1 ra tepiya vurnayışanê neweyan bımocne',
-'rcshowhideminor' => 'Vırnayışané werkekean $1',
+'rcshowhideminor' => 'Vurnayışanê werdiyan $1',
 'rcshowhidebots' => 'Botan $1',
-'rcshowhideliu' => 'Karberé qeydınan $1',
-'rcshowhideanons' => 'Karberané bénaman $1',
+'rcshowhideliu' => 'Karberanê qeydbiyayeyan $1',
+'rcshowhideanons' => 'Karberanê bênameyan $1',
 'rcshowhidepatr' => '$1 vurnayışê ke dewriya geyrayê',
 'rcshowhidemine' => 'Vurnayışanê mı $1',
 'rclinks' => 'Peyniya $2 rocan de $1 vurnayışan bımocne <br />$3',
@@ -1861,7 +1862,7 @@ Semedê ancia barkerdışi dewamkerdış ra ver tarixê esterışê dosya gani q
 Dosyayn de Java barkerdışi rê icazet nêdeyê, çıkı emeleya merduman nêbena.',
 'upload-source' => 'Dosyayê henî',
 'sourcefilename' => 'Nameyê dosyaye çimeyî',
-'sourceurl' => "URL'yê Çımi",
+'sourceurl' => 'URLyê çımey:',
 'destfilename' => 'Destînasyonê nameyêdosya',
 'upload-maxfilesize' => 'Ebatêî dosya tewr girdî: $1',
 'upload-description' => 'Deskripsiyonê dosyayî',
@@ -2121,13 +2122,13 @@ listeya ke ha ver a têna na {{PLURAL:$1|dosyaya ewwili|dosyaya $1 ewwili}} mocn
 
 # Random page in category
 'randomincategory' => 'Ğoseri pera kategoriya',
-'randomincategory-invalidcategory' => '"$1" namedı kategori çıniya',
+'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',
 
 # Random redirect
-'randomredirect' => 'Xoseri hetenayış',
+'randomredirect' => 'Serçarnayışo rastameye',
 'randomredirect-nopages' => 'Ena cayênameyê "$1"î de redereksiyonî çin o.',
 
 # Statistics
@@ -2181,7 +2182,7 @@ gıreyê her satıri de gıreyi; raş motışê yewın u dıyıni esto.
 
 # Miscellaneous special pages
 '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}}',
@@ -2237,7 +2238,7 @@ gıreyê her satıri de gıreyi; raş motışê yewın u dıyıni esto.
 'newpages-username' => 'Nameyê karberi:',
 'ancientpages' => 'Wesiqeyê ke vurnayışê ciyê peyeni tewr kehani',
 'move' => 'Bere',
-'movethispage' => 'Na perer ber',
+'movethispage' => 'Ena pele bere',
 'unusedimagestext' => 'Enê dosyey estê, feqet zerrey yew pele de wedardey niyê.
 Xo 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ê cêrıni bıbo zi çı nêşuxulyena.',
@@ -2291,10 +2292,10 @@ tipa rocaneyi, nameyê karberi (herfa pil u qıci re hessas a), ya zi peli (reyn
 
 # Special:Categories
 'categories' => 'Kategoriy',
-'categoriespagetext' => '{{PLURAL:$1|kategoriyê|kategoriyê}} cêrıni de pel u media esto.
-[[Special:UnusedCategories|kategoriyê ke nê xebtênê]] tiya de nêmociyeni.
-hem zi bıewnê [[Special:WantedCategories|kategori yê ke waziyeni]].',
-'categoriesfrom' => 'kategori yê ke pê ninan destpêkeno ramocın:',
+'categoriespagetext' => '{{PLURAL:$1|Kategoriya cêrene|Kategoriyanê cêrênan}} de peli ya zi medya estê.
+[[Special:UnusedCategories|Kategoriyê ke nêxebetiyenê]] tiya de nêmocniyayê.
+[[Special:WantedCategories|Kategoriyanê waşteyeyan]] de zi bıvêne.',
+'categoriesfrom' => 'Kategoriyê ke be ninan dest pêkenê, bımocne:',
 'special-categories-sort-count' => 'goreyê çendi rêz ker.',
 'special-categories-sort-abc' => 'alfabetik rêz ker',
 
@@ -2306,7 +2307,7 @@ hem zi bıewnê [[Special:WantedCategories|kategori yê ke waziyeni]].',
 # Special:LinkSearch
 'linksearch' => 'Gıreyê teberi cı geyrê',
 'linksearch-pat' => 'bıgêr motif:',
-'linksearch-ns' => 'Heruna naman:',
+'linksearch-ns' => 'Heruna nameyan:',
 'linksearch-ok' => 'Cı geyre',
 'linksearch-text' => 'Jokeri ê zey "*.wikipedia.org"i benê ke bıgureniyê.
 Tewr senık yew sewiya serêna cayê tesiri lazıma, mesela "*.org".<br />
@@ -2402,7 +2403,7 @@ Ena deme ra, ma qe vurnayışan ser ena pele tı haberdar keni.',
 'removewatch' => 'Listedê mınê seyr kerdışi ra hewad',
 'removedwatchtext' => 'Ena pela "[[:$1]]" biya wedariya [[Special:Watchlist|listeyê seyr-kerdışi şıma]].',
 'watch' => 'Temaşe ke',
-'watchthispage' => 'Na perer seyr ke',
+'watchthispage' => 'Ena pele seyr ke',
 'unwatch' => 'Teqib mekerê',
 'unwatchthispage' => 'temaşa kerdışê peli vındarn.',
 'notanarticle' => 'mebhesê peli niyo',
@@ -2491,12 +2492,12 @@ Qe qeydê wedarnayışi, $2 bevinin.',
 'deletecomment' => 'Sebeb:',
 'deleteotherreason' => 'Sebebo bin:',
 'deletereasonotherlist' => 'Sebebo bin',
-'deletereason-dropdown' => '*Sebebé esterıti
-** Spam
+'deletereason-dropdown' => '* Sebebê esterıtışê pêroyi
+** Vurnayışo nêwaşte (spam)
 ** Vandalizm
-** İhlala heqdé telifi
-** WaÅ\9ftıÅ\9fé nustoği
-** Xırab hetenayış',
+** İxlalê heqa telifi
+** WaÅ\9ftıÅ\9fê nuÅ\9ftoği
+** Oryantasyono xırabe',
 'delete-edit-reasonlist' => 'Sebebê vurnayışan bıvurne',
 'delete-toobig' => 'no pel, pê $1 {{PLURAL:$1|tene vuriyayiş|tene vuriyayiş}}i wayirê yew tarixo kehen o.
 qey hewna nêşiyayişi wina pelani u {{SITENAME}}nêxerebnayişê keyepeli yew hed niyaya ro.',
@@ -2539,7 +2540,7 @@ Qey malumato ziyede [[Special:ProtectedPages|Peleyê ke star biye]] bewni rê ê
 'protect-title' => 'qey "$1" yew seviyaya pawıtışi bıvıcinê',
 'protect-title-notallowed' => 'Star kerdış sewiyeyê "$1" bıvinê',
 'prot_1movedto2' => 'nameyê [[$1]] peli yo newe: [[$2]]',
-'protect-badnamespace-title' => 'Heruna naman itad starêna',
+'protect-badnamespace-title' => 'Heruna nameyana bêsıtare',
 'protect-badnamespace-text' => 'Na herunda namide peley nêstarênê.',
 'protect-norestrictiontypes-text' => 'Na perdi mahne esto cokira tipeci nikarnina',
 'protect-norestrictiontypes-title' => 'Pera starneyin',
@@ -2589,7 +2590,7 @@ Tı eşkeno seviyeye kılit kerdışi bıvurno, feqat tı nıeşken "cascading p
 # Restrictions (nouns)
 'restriction-edit' => 'Bıvurne',
 'restriction-move' => 'Ber',
-'restriction-create' => 'İycad ke',
+'restriction-create' => 'Vıraze',
 'restriction-upload' => 'Bar ke',
 
 # Restriction levels
@@ -2618,7 +2619,7 @@ Revizyoni ya hewn a biyê ya arşiw ra veciyayê ya zi cıresayişê şımayi ş
 'undeletebtn' => 'Timar bike',
 'undeletelink' => 'bıvêne/peyser bia',
 'undeleteviewlink' => 'bıvin',
-'undeleteinvert' => 'vicnayeyi qeldaye açarn',
+'undeleteinvert' => 'Weçinıtışi açarne',
 'undeletecomment' => 'Sebeb:',
 'undeletedrevisions' => 'pêro piya{{PLURAL:$1|1 qeyd|$1 qeyd}} tepiya anciya.',
 'undeletedrevisions-files' => '{{PLURAL:$1|1 revizyon|$1 revizyon}} u {{PLURAL:$2|1 dosya|$2 dosya}} ameyê halê xo yê verıni',
@@ -2648,10 +2649,10 @@ $1',
 'undelete-show-file-submit' => 'E',
 
 # Namespace form on various pages
-'namespace' => 'Heruna naman:',
-'invert' => 'Weçinayan ğariç bıasné',
+'namespace' => 'Heruna nameyan:',
+'invert' => 'Weçinıtışi açarne',
 'tooltip-invert' => 'nameyo ke nışan biyo (u nameyo elekeyın zi nışanyyayo se) vurnayışan  zerrekan nımtışi re ena dore tesdiqi nışan kerê',
-'namespace_association' => 'Elaqedar nameyé cayan',
+'namespace_association' => 'Heruna nameyanê elaqedaran',
 'tooltip-namespace_association' => 'Herunda canemiya elekeyın nışan kerdışi sero qıse kerdışi yana zerre dekerdışi rê ena dora tesdiqi nışan kerê',
 'blanknamespace' => '(Ser)',
 
@@ -2684,7 +2685,7 @@ Cıkewtışo tewr peyêno ke bloke biyo, cêr seba referansi belikerdeyo:',
 'sp-contributions-submit' => 'Cı geyre',
 
 # What links here
-'whatlinkshere' => 'Gırey perer',
+'whatlinkshere' => 'Gıreyê pele',
 'whatlinkshere-title' => 'Per da "$1" rê perê ke gre danê',
 'whatlinkshere-page' => 'Pele:',
 'linkshere' => "Ena peleyan grey biya '''[[:$1]]''':",
@@ -2911,7 +2912,7 @@ Yewna name bınus.',
 'delete_and_move_text' => '==gani hewn a bıbıo/bıesteriyo==
 
 " no [[:$1]]" name de yew pel ca ra esto. şıma wazeni pê hewn a kerdışê ey peli vurnayişê nameyi bıkeri?',
-'delete_and_move_confirm' => 'E na perer bestern',
+'delete_and_move_confirm' => 'Eya, na pele bestere',
 'delete_and_move_reason' => '"[[$1]]" qande nami re ca akerdışi re besteriyaye',
 'selfmove' => 'name yo ke şıma wazeni bıbo, ın name û name yo ke ca ra esto eyni yê /zepê yê. vurnayiş mumkin niyo.',
 'immobile-source-namespace' => '"$1" pelê cayi de nameyi nêkırışyenî',
@@ -3073,10 +3074,10 @@ dosyaya emaneti vindbiyo',
 'tooltip-ca-addsection' => 'Zu bınnusteya newi ak',
 'tooltip-ca-viewsource' => 'Ena pele kılit biya.
 Şıma şenê çımeyê aye bıvênê',
-'tooltip-ca-history' => 'Verén rewziyoné ena perer bıvin',
-'tooltip-ca-protect' => 'Na perer star fi',
+'tooltip-ca-history' => 'Versiyonê verênê ena pele',
+'tooltip-ca-protect' => 'Ena pele bışevekne',
 'tooltip-ca-unprotect' => 'Starkerdışe ena peler bıvurne',
-'tooltip-ca-delete' => 'Ena perer bestern',
+'tooltip-ca-delete' => 'Ena pele bestere',
 'tooltip-ca-undelete' => 'peli biyarê halê ver hewnakerdışi',
 'tooltip-ca-move' => 'Ena pele bere',
 'tooltip-ca-watch' => 'Ena pele lista xoya seyrkerdışi ke',
@@ -3111,7 +3112,7 @@ dosyaya emaneti vindbiyo',
 'tooltip-ca-nstab-mediawiki' => 'Mesacané sistemi bıvin',
 'tooltip-ca-nstab-template' => 'Şabloni bıvin',
 'tooltip-ca-nstab-help' => 'Pela peşti bıvêne',
-'tooltip-ca-nstab-category' => 'Pera kategori bıvin',
+'tooltip-ca-nstab-category' => 'Pela kategoriye bıvêne',
 'tooltip-minoredit' => 'Nay vırnayışa werdi nışan bıkeré',
 'tooltip-save' => 'Vurnayışa qeyd ke',
 'tooltip-preview' => 'Vurnayışané ğo çımra ravyarné. Verdé qeyd kerdışi eneri bıkarné!',
@@ -3180,7 +3181,7 @@ Ney '''Mefiyé de'''!",
 'pageinfo-redirects-name' => 'Hetenayışê na perer',
 'pageinfo-redirects-value' => '$1',
 'pageinfo-subpages-name' => 'Bınpelê na pela',
-'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|hetenayış|hetenayışi}}; $3 {{PLURAL:$3|raykerdışt|raykerdışi}})',
+'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|serçarnayış|serçarnayışi}}; $3 {{PLURAL:$3|nêserçarnayış|nêserçarnayışi}})',
 'pageinfo-firstuser' => 'Pela vıraşter',
 'pageinfo-firsttime' => 'Demê pela vıraştışi',
 'pageinfo-lastuser' => 'Vurnayoğo peyên',
@@ -3541,7 +3542,7 @@ Eg ena dosya, kondisyonê orcinali ra bıvuriya, belki detayanê hemi nıeseno.'
 'exif-writer' => 'Nuştekar',
 'exif-languagecode' => 'Zıwan',
 'exif-iimversion' => 'Verqaydê IIM',
-'exif-iimcategory' => 'Kategori',
+'exif-iimcategory' => 'Kategoriye',
 'exif-iimsupplementalcategory' => 'Oleyê Kategoriyan',
 'exif-datetimeexpires' => 'No peyra mekarênê',
 'exif-datetimereleased' => 'Bıroşe',
@@ -3794,7 +3795,7 @@ $8',
 'exif-dc-publisher' => 'Hesrekar',
 'exif-dc-relation' => 'Medyay cı',
 'exif-dc-rights' => 'Heqi',
-'exif-dc-source' => 'Medyay çımi',
+'exif-dc-source' => 'Medyaya çımey',
 'exif-dc-type' => 'Babeta medyay',
 
 'exif-rating-rejected' => 'Red ke',
@@ -4106,6 +4107,7 @@ Ti hem zi eşkeno [[Special:EditWatchlist|use the standard editor]].',
 'version-version' => '(Versiyon $1)',
 'version-svn-revision' => '(r$2)',
 'version-license' => 'Lisans',
+'version-ext-license' => 'Lisans',
 'version-poweredby-credits' => "Ena wiki, dezginda '''[https://www.mediawiki.org/ MediaWiki]''' ya piya vıraziyaya, heqê telifi © 2001-$1 $2.",
 'version-poweredby-others' => 'Zewmi',
 'version-poweredby-translators' => "Açernere translatewiki.net'i",
index 35882db..388e0a0 100644 (file)
@@ -170,7 +170,6 @@ $messages = array(
 'tog-numberheadings' => 'Nadpisma awtomatiski numerěrowaś',
 'tog-showtoolbar' => 'Wobźěłowańsku rědku pokazaś',
 'tog-editondblclick' => 'Boki z dwójnym kliknjenim wobźěłaś',
-'tog-editsection' => 'Wobźěłanje wótstawkow pśez wótkaze [wobźěłaś] zmóžniś',
 'tog-editsectiononrightclick' => 'Wobźěłowanje wótrězkow pśez kliknjenje z pšaweju tastu myški zmóžniś',
 'tog-showtoc' => 'Wopśimjeśe pokazaś, jolic ma bok wěcej nježli 3 nadpisma',
 'tog-rememberpassword' => 'Z toś tym wobglědowakom pśizjawjony wóstaś (za maksimalnje $1 {{PLURAL:$1|źeń|dnja|dny|dnjow}})',
@@ -956,6 +955,8 @@ Eksistěrujo južo.',
 'content-not-allowed-here' => 'Wopśimjeśe "$1" njejo na boku [[$2]] dowólone',
 'editwarning-warning' => 'Gaž toś ten bok se spušća, mógu se změny zgubiś, kótarež sy pśewjadł.
 Jolic sy pśizjawjeny, móžoš toś to warnowanje we wótrězku „Wobźěłaś“ swójich nastajenjow znjemóžniś.',
+'editpage-notsupportedcontentformat-title' => 'Wopśimjeśowy format se njepódpěra.',
+'editpage-notsupportedcontentformat-text' => 'Wopśimjeśowy format $1 njepódpěra se pśez wopśimjeśowy model $2.',
 
 # Content models
 'content-model-wikitext' => 'wikitekst',
@@ -1204,6 +1205,7 @@ Drobnostki móžoš w [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}
 'search-result-score' => 'Relewanca: $1 %',
 'search-redirect' => '(pśesměrowanje $1)',
 'search-section' => '(sekcija $1)',
+'search-file-match' => '(wótpowědujo datajowemu wopśimjeśeju)',
 'search-suggest' => 'Měnjašo $1?',
 'search-interwiki-caption' => 'Sotšine projekty',
 'search-interwiki-default' => '$1 wuslědki:',
@@ -2295,7 +2297,7 @@ Pšašanja a dalšna pomoc:
 'delete-toobig' => 'Toś ten bok ma z wěcej nježli $1 {{PLURAL:$1|wersiju|wersijomaj|wersijami|wersijami}} dłujku historiju. Lašowanje takich bokow bu wobgranicowane, aby wobškoźenju {{GRAMMAR:genitiw|{{SITENAME}}}} z pśigódy zajźowało.',
 'delete-warning-toobig' => 'Toś ten bok ma z wěcej ako $1 {{PLURAL:$1|wersiju|wersijomaj|wersijami|wersijami}} dłujke stawizny. Jich wulašowanje móžo źěło datoweje banki na {{SITENAME}} kazyś;
 póstupujśo z glědanim.',
-'deleting-backlinks-warning' => "'''Warnowanje:''' Druge boki wótkazuju k bokoju, kótaryž coš wulašowaś.",
+'deleting-backlinks-warning' => "'''Warnowanje:''' Druge boki wótkazuju k bokoju abo bok jo hynźi zapśěgnjony, kótaryž coš wulašowaś.",
 
 # Rollback
 'rollback' => 'Wobźěłanja slědk wześ',
@@ -2583,7 +2585,7 @@ Glědaj do [[Special:BlockList|lisćiny blokěrowanjow]], aby blokěrowanja pśe
 'range_block_disabled' => 'Móžnosć administratora, blokěrowaś cełe adresowe rumy, njejo aktiwěrowana.',
 'ipb_expiry_invalid' => 'Pódany cas jo njepłaśecy.',
 'ipb_expiry_temp' => 'Blokěrowanja schowanych wužywarskich mjenjow deje permanentne byś.',
-'ipb_hide_invalid' => 'Njejo móžno toś to konto pódtłocyś; jo snaź pśewjele změnow.',
+'ipb_hide_invalid' => 'Njejo móžno toś to konto pódtłocyś; ma wěcej ako {{PLURAL:$1|jadnu změnu|$1 změnje|$1 změny|$1 změnow}}.',
 'ipb_already_blocked' => '"$1" jo južo blokěrowany.',
 'ipb-needreblock' => '$1 jo južo zablokěrowany. Coš nastajenja změniś?',
 'ipb-otherblocks-header' => '{{PLURAL:$1|Druge blokěrowanje|Drugej blokěrowani|Druge blokěrowanja|Druge blokěrowanja}}',
@@ -3682,7 +3684,7 @@ Móžoš teke [[Special:EditWatchlist|standardny wobźěłowański bok wužywaś
 'version-parser-function-hooks' => 'Parserowe funkcije',
 'version-hook-name' => 'Mě kokule',
 'version-hook-subscribedby' => 'Aboněrowany wót',
-'version-version' => '(Wersija $1)',
+'version-version' => '($1)',
 'version-license' => 'Licenca MediaWiki',
 'version-ext-license' => 'Licenca',
 'version-ext-colheader-name' => 'Rozšyrjenje',
@@ -3967,4 +3969,6 @@ Hować móžoš slědujucy jadnory formular wužywaś. Twój komentar pśidajo s
 'expand_templates_generate_rawhtml' => 'Gropny HTML pokazaś',
 'expand_templates_preview' => 'Pśeglěd',
 
+# Unknown messages
+'uploadinvalidxml' => 'XML w nagratej dataji njedajo se parsowaś.',
 );
index cbdd0b9..d4bc18e 100644 (file)
@@ -16,6 +16,7 @@ $fallback = 'it';
 $messages = array(
 # User preference toggles
 'tog-underline' => "Tîra 'na rîga sòta i colegamèint.",
+'tog-justify' => 'Mésa in ōrdin di carâter di peréiod.',
 'tog-hideminor' => "Lōga 'l mudéfichi pió céchi int al j ûltmi mudéfichi.",
 'tog-hidepatrolled' => "Lōga 'l mudéfichi verifichêdi int al j ûltmi mudéfichi",
 'tog-newpageshidepatrolled' => "Lōga al pàgini verifichêdi da l'elèinch dal pàgini pió nōvi.",
@@ -24,7 +25,6 @@ $messages = array(
 'tog-numberheadings' => 'Cûnta automâtica di tétol ed sesiòun.',
 'tog-showtoolbar' => 'Fà vèder la bâra di strumèint ed mudéfica.',
 'tog-editondblclick' => "Mudéfica 'l pàgini cun un cléch dòpi.",
-'tog-editsection' => 'Mudéfica dal sesiòun per mèz dal colegamèint [mudéfica].',
 'tog-editsectiononrightclick' => 'Mudéfica dal sesiòun per mèz dal cléch a dréta insém al tétol.',
 'tog-showtoc' => "Fà vèder al sûnt (p'r al pàgini cun pió 'd 3 sesiòun)",
 'tog-rememberpassword' => "Tîn a mèint la cêva 'd ingrès insém a cól navigadōr ché (per un mâsim ed $1{{PLURAL:$1|dé}}).",
@@ -63,6 +63,7 @@ $messages = array(
 
 # Font style option in Special:Preferences
 'editfont-style' => "Stîl dal carâter int la caşèla 'd mudéfica:",
+'editfont-default' => 'Pre-stabilî dal navigadōr',
 'editfont-monospace' => 'Carâter a larghésa fésa',
 'editfont-sansserif' => 'Carâter sans-serif',
 'editfont-serif' => 'Carâter serif',
@@ -146,6 +147,8 @@ $messages = array(
 'category-file-count' => "{{PLURAL:$2|In cla categoréia ché a gh'é sōl un file, sgnê ché.|In cla categoréia ché gh'é{{PLURAL:$1|un file sgnê ché| i file $1, sgnê}} ed sègvit, in un totêl ed $2.}}",
 'category-file-count-limited' => "In cla categoréia ché a gh'é {{PLURAL:$1|al file nutê|i $1 file nutê}} ché 'd sègvit.",
 'listingcontinuesabbrev' => 'cunt.',
+'index-category' => 'Pàgini gancêdi',
+'noindex-category' => 'Pàgini mìa gancêdi',
 'broken-file-category' => "Pàgini cun dèinter di file ch' an gh'în mìa.",
 
 'about' => 'Infumasiòun',
@@ -176,6 +179,7 @@ $messages = array(
 'vector-action-protect' => 'Prutēz',
 'vector-action-undelete' => 'Fà al recóper',
 'vector-action-unprotect' => 'Câmbia la prutesiòun',
+'vector-simplesearch-preference' => 'Drōva la bâra per la sērca pió fâcila (sōl per la skin Vector)',
 'vector-view-create' => 'Invèinta',
 'vector-view-edit' => 'Mudéfica',
 'vector-view-history' => 'Guêrda la stôria',
@@ -242,6 +246,11 @@ $messages = array(
 'jumpto' => 'Và a:',
 'jumptonavigation' => 'Navigasiòun',
 'jumptosearch' => 'Sērca',
+'view-pool-error' => 'In cól mumèint ché i terminêl în trôp câregh.
+Trôp utèint în drē serchêr ed vèder cla pàgina ché.
+Spèta soquânt minût préma ed pruvêr incòra a carghêr la pgina.
+
+$1',
 'pool-timeout' => "Tèimp che gh'é da spetêr préma dal sblôch.",
 'pool-queuefull' => 'A ghé la fîla, trôpa gînta a vōl vèder la pàgina, prōva tra soquânt minût',
 'pool-errorunknown' => 'Erōr mìa cgnusû',
@@ -278,6 +287,8 @@ $messages = array(
 'youhavenewmessagesfromusers' => '{{PLURAL:$4|Ét ghê}} $1 da {{PLURAL:$3|un êter utèint|$3 utèint}} ($2).',
 'youhavenewmessagesmanyusers' => "Ét gh'ê $1 da dimòndi utèint $2.",
 'newmessageslinkplural' => '{{PLURAL:$1|un nōv mesâg|999=nōv mesâg}}',
+'newmessagesdifflinkplural' => '{{PLURAL:$1|ûltma mudéfica|999=ûltmi mudéfichi}}',
+'youhavenewmessagesmulti' => "Ét gh'ê di mesâg nōv insém a $1",
 'editsection' => 'Mudéfica',
 'editold' => 'mudéfica',
 'viewsourceold' => 'guêrda la surzéia',
@@ -315,25 +326,116 @@ $messages = array(
 'nstab-help' => 'Per quî rivê da pôch',
 'nstab-category' => 'Categoréia',
 
+# Main script and global functions
+'nosuchaction' => 'Operasiòun mìa arcgnusûda',
+'nosuchactiontext' => "Còl che t'é scrét int l' URL an n'é mìa vâlid.
+L'é anca pusébil che la URL la sia stêda scréta şbaliêda o che sia stê fât un colegamèint mìa vâlid.
+Còst al pré ânca dîr che gh'é un bug in {{SITENAME}}.",
+'nosuchspecialpage' => "La pàgina specêla l'an gh'é mìa.",
+'nospecialpagetext' => "<strong>La pàgina specêla serchêda an n'é mìa stêda arcgnusûda</strong>
+
+L'elèinch dal pàgini specêli vâlidi a 's câta in [[Special:SpecialPages|Elèinch dal pàgini specêli]].",
+
 # General errors
 'error' => 'Erōr',
 'databaseerror' => "Erōr dal 'database'",
+'databaseerror-text' => 'È sucès un erōr de dmânda insém al databêş.
+A pré ânch èser un bug int al prugrâma.',
+'databaseerror-textcl' => 'È sucès un erōr de dmânda insém al databêş.',
+'databaseerror-query' => 'Istrusiòun SQL: $1',
+'databaseerror-function' => 'Funsiòun: $1',
+'databaseerror-error' => 'Erōr: $1',
+'laggedslavemode' => "'''Atèinti:''' la pàgina la pré avèir mìa al revisiòun pió nōv.",
 'readonly' => "'Database' bluchê",
+'enterlockreason' => "Scréver al mutîv dal blôch, precişêr quând a 's pèinsa che 'l vègna tôt via.",
+'readonlytext' => "In cól mumèint ché al databêş l'é bluchê e an 's pōlen fêr né zûnti né mudéfichi. Al blôch ed sôlit l'é lighê a 'na revişiòun normêla e quând la srà finîda al gnirà sbluchê. 
+
+L'aminitradōr dal sistēma ch' al l'à bluchê l'à dê cla spiegasiòun ché: $1",
 'missing-article' => "Al datebêş an n'à mìa catê al tèst ed 'na pàgina ch' l' aré duvû catêres sòt' al nòm \"\$1\" \$2. Ed sôlit còst a sucēd quând a vîn arciamê, a partîr da la stòria dal mudéfichi o dal cunfrûnt tra versiòun, un colegamèint a 'na pàgina scanşlêda, a un cunfrûnt tra versiòun che gh'în mìa o a un cunfrûnt tra versiòun cun la stòria dal mudéfichi scanşlêda. In chês cuntrâri, a s'é pubabilmèint catê un erōr int al prugrâma ed Media Wiki. A se dmânda al piaşèir ed comunichêr còl ch'é sucès a un [[Special:ListUsers/sysop|amministadōr]] e comunichêregh l'indirés (URL) in quistiòun.",
 'missingarticle-rev' => '(nómer ed la versiòun: $1)',
 'missingarticle-diff' => '(Diff: $1, $2)',
+'readonly_lag' => "Al databêş l'é stê bluchê in avtomàtich per permèter a i terminêl cun al databêş schiêv ed mètres in pâs cun al master",
 'internalerror' => 'Erōr intêren',
 'internalerror_info' => 'Erōr intêren: $1',
+'fileappenderrorread' => 'An n\'é mìa stê pusébil lēşer "$1" mèinter es fêva la zûnta.',
+'fileappenderror' => 'An n\'é mìa pusébil zuntêr "$1" a "$2".',
+'filecopyerror' => 'An n\'é mìa pusébil cupiêr al file "$1" in "$2".',
+'filerenameerror' => 'An n\'é mìa pusébil cambiêr al nòm ed "$1" in "$2".',
+'filedeleteerror' => 'An n\'é mìa pusébil scanşlêr al file "$1".',
+'directorycreateerror' => 'An n\'é mìa pusébil fêr la directory "$1".',
+'filenotfound' => 'An n\'é mìa pusébil catêr al file "$1".',
+'fileexistserror' => 'An n\'é mìa pusébil scréver al file "$1": al file al gh\'é bèle.',
+'unexpected' => 'Valōr mìa pervést "$1"="$2".',
+'formerror' => "Erōr: an n'é ma pusébil spidîr al môdul.",
+'badarticleerror' => 'Operasiòun mìa permésa per cla pàgina ché.',
+'cannotdelete' => 'An n\'é mìa stê pusébil scanşlêr la pàgina o al file "$1".
+Al pré èser bèle stê scanşlê da quelchidûn êter.',
+'cannotdelete-title' => 'Impusébil scanşlêr la pàgina "$1".',
+'delete-hook-aborted' => "L' hook an n'à mia permés la scanşladûra.
+An n'é mìa stê dê la spiegasiòun.",
+'no-null-revision' => 'An pōl èser fât \'na versiòun mìa vâlida per la pàgina "$1"',
 'badtitle' => 'Tétol mìa curèt.',
 'badtitletext' => "Al tétol ed la pàgina serchêda l'é vōd, şbaliê opór al deşvîn da 'n erōr int i colegamèint di côdis o int i colegamèint druvê in wiki. In pió al pré avèir ûn o pió carâter ch'an pōlen mìa èser druvê int i tétol.",
+'perfcached' => 'Al j infurmasiòun ché sòta vînen registrêdi int la "cache" dal databêş e an pōlen mìa èser arnuvê. Int la "cache" a gh\'é  un mâsim ed {{PLURAL:$1|un rişultêt |$1 rişultêt}} ch\' es pōl/en druvêr.',
+'perfcachedts' => 'Al j infurmasiòun ché sòta vînen registrêdi int la "cache" dal databêş e l\'ûltma vôlta l\' è stê arnuvê al  $ 1. Int la "cache" a gh\'é  un mâsim ed {{PLURAL:$4|un rişultêt |$4 rişultêt}} ch\' es pōl/en druvêr.',
+'querypage-no-updates' => "J arnuvamèint ed la pàgina în p'r al mumèint fērom. Al j infurmasiòun dèinter a la pàgina a gnirân mia arnuvêdi.",
 'viewsource' => 'Guêrda la surzéia',
 'viewsource-title' => "Guêrda la surzéia 'd $1",
+'actionthrottled' => "L'asiòun la vîn tardêda.",
+'actionthrottledtext' => "Cme mişûra 'd sicurèsa cûnt'r al spam soquânti operasiòun a vînen limitêdi a 'n nómer mâsim ed vôlti in un precîş peréiod ed tèimp, in cól chêş ché a s'é bèle andê d'ed là 'd cól lémit. A se dmânda ed turnêr a pruvêr tra soquânt minût.",
+'protectedpagetext' => "Cla pàgina ché l'é stêda prutèta per impidîr la mudéfica o êtri operasiòun.",
+'viewsourcetext' => "L'é pusébil vèder e cupiêr al côdis surzéia ed cla pàgina ché.",
+'viewyourtext' => 'L\'é pusébil vèder e cupiêr al côdis surzéia dal "tō mudéfichi" ed cla pàgina ché:',
+'protectedinterface' => "Cla pàgina ché la gh'à 'n elemèint ch' al fa pêrt dal colegamèint tra utèint e al progrâma 'd cól sît ché e l'é prutèta per schivşêr pusébil abûş. Per zuntêr o mudufichêr tradusiòun per tót i sistēma wiki druvêr [//translatewiki.net/ translatewiki.net], al prugèt 'd adatamèint a ògni léngva 'd MediaWiki.",
+'editinginterface' => "'''Atèinti:'' Al tèst ed cla pàgina ché 'l fa pêrt dal colegamèint tra utèint e 'l progrâma dal sît.  Tót' al modéfichi fâti a cla pàgina ché a gnîran spustêdi insém a i mesâg vést da tót j utèint ed cól wiki ché. Per zuntêr o mudufichêr tradusiòun vâlidi per tót i wiki, cunsîdra la pusibilitê 'd druvêr [/ / translatewiki.net / translatewiki.net], al prugèt 'd adatamèint a ògni léngva 'd MediaWiki.",
+'cascadeprotected' => "Insém a cla pàgina ché an n'é mìa pusébil fêr dal mudéfichi perchè l'é dèinter {{PLURAL:$1|int la pàgina sgnêda ché  'd sègvit, ch' l'é stêda prutèta|int al pàgini sgnêdi ché  'd sègvit, ch' în stêdi prutèti}} cun la prutesiòun ch' la 's arfà in cuntinvasiòun:
+$2",
+'namespaceprotected' => "An 's gh'à mìa i permès necesâri per mudifichêr al pàgini dal spâsi di nòm '''$1'''.",
+'customcssprotected' => "An 's gh'à mìa i permès necesâri per mudifichêr cla pàgina CSS ché, perchè la gh'à dèinter al j impustasiòun personêli 'd n' êter utèint.",
+'customjsprotected' => "An 's gh'à mìa i permès necesâri per mudifichêr cla pàgina JavaScript ché, perchè la gh'à dèinter al j impustasiòun personêli 'd n' êter utèint.",
+'mycustomcssprotected' => "An 's gh'à mìa i permès necesâri per mudifichêr cla pàgina CSS ché.",
+'mycustomjsprotected' => "An 's gh'à mìa i permès necesâri per mudifichêr cla pàgina JavaScript ché .",
+'myprivateinfoprotected' => "An 's gh'à mìa i permès necesâri per cambiê 'l j infurmasiòun personêli.",
+'mypreferencesprotected' => "An 's gh'à mìa i permès necesâri per cambiêr al preferèinsi personêli.",
+'ns-specialprotected' => "An n'é mìa pusébil mudifichêr al pàgini specêli.",
+'titleprotected' => 'Al tétol ed cla pagina ché l\'é stê bluchê da [[User:$1|$1]].
+Còst l\'é al mutîv:"$2".',
+'filereadonlyerror' => 'An n\'é mìa stê pusébil mudifichêr al file "$1" perchè al depôsit di file "$2" a \'s pōl sōl lēzer.
+
+L\'aministradōr ch\' al l\'à bluchê l\'à dê cla spiegasiòun ché:"$3".',
+'invalidtitle-knownnamespace' => 'Tétol mìa vâlid cme spâsi di nòm "$2" e tèst "$3"',
+'invalidtitle-unknownnamespace' => 'Tétol mìa vâlid cun spâsi di nòm mìa cgnusû "$1" e tèst "$2"',
+'exception-nologin' => "An t'é mìa gnû dèinter",
+'exception-nologin-text' => "Per andêr dèinter a cla pàgina ché o fêr còl ch'ét pèins ét gh'ê da [[Special:Userlogin|fêr l'ingrès]].",
+'exception-nologin-text-manual' => 'Per prèir andêr dèinter a cla pàgina ché o fêr còl ch\'ét pèins ét gh\'ê da "$1".',
+
+# Virus scanner
+'virus-badscanner' => 'Erōr \'d impustasiòun: antivîrus mìa cgnusû:"$1"',
+'virus-scanfailed' => "Al cuntròl antivìrus l'é andê mêl (côdis $1)",
+'virus-unknownscanner' => 'Antivìrus scgnusû:',
 
 # Login and logout pages
+'logouttext' => "'''An t'é pió coleghê.'''
+
+Guêrda che soquânti pàgini a prén vèdres incòra cme s'ét fós incòra coleghê, còst fintânt ch' an vîn mìa pulî la memôria dal tó navigadōr.",
+'welcomeuser' => 'Beinvgnû, $1',
+'welcomecreation-msg' => "Al j infurmasiòun per l'ingrès în stêdi dêdi  'n mōd gióst. An scurdêret mìa 'd dîr quèl' în al [[Special:Preferences|preferèinsi in {{SITENAME}}]].",
 'yourname' => 'Nòm utèint:',
+'userlogin-yourname' => 'Nòm utèint',
+'userlogin-yourname-ph' => 'Mèt dèinter al tó nòm utèint',
+'createacct-another-username-ph' => 'Mèt dèinter al nòm utèint',
 'yourpassword' => "Cêva 'd ingrès:",
+'userlogin-yourpassword' => "Cêva 'd ingrès",
+'userlogin-yourpassword-ph' => "Mèt dèinter la tó cêva 'd ingrès",
+'createacct-yourpassword-ph' => "Mèt dèinter 'na cêva 'd ingrès",
 'yourpasswordagain' => "Scrév incòra la cêva 'd ingrès:",
+'createacct-yourpasswordagain' => "Cunfērma la cêva 'd ingrès",
+'createacct-yourpasswordagain-ph' => "Tōrna mèter dèinter la cêva 'd ingrès",
 'remembermypassword' => "Tîn a mèint la cêva 'd ingrès insém a cól navigadōr ché (per un mâsim ed $1{{PLURAL:$1|dé}}).",
+'userlogin-remembermypassword' => 'Sèimper coleghê',
+'userlogin-signwithsecure' => 'Drōva un colegamèint sicûr',
+'password-change-forbidden' => "An n'é mìa pusébil mudifichêr la cêva 'd ingrès insém a sté wiki.",
+'externaldberror' => "È sucès un erōr cun al terminêl ed certificasiòun ed validitê d'ed fōra, opór an 's gh'à mìa al j autorişasiòun necesâri per arnuvêr l' ingrès d'ed fōra.",
 'login' => 'Và dèinter',
 'nav-login-createaccount' => 'Và dèinter / Fà la tó inscrisiòun',
 'loginprompt' => "Per andêr dèinter a {{SITENAME}} l'é necesâri permèter i cookie.",
@@ -342,16 +444,67 @@ $messages = array(
 'logout' => 'Và fōra',
 'userlogout' => 'Và fōra',
 'notloggedin' => "An t'é mìa gnû dèinter",
+'userlogin-noaccount' => 'Ét mìa incòra fât la registrasiòun?',
+'userlogin-joinproject' => 'Da {{SITENAME}}',
 'nologin' => "An gh'èt mìa incòra un ingrès? $1",
 'nologinlink' => 'Fà la tó inscrisiòun',
 'createaccount' => 'Fà la tó inscrisiòun',
 'gotaccount' => "Gh'èt bèle un ingrès? $1",
 'gotaccountlink' => 'Và dèinter',
 'userlogin-resetlink' => "T'ét scurdê j elemèint p'r al tó ingrès?",
+'userlogin-resetpassword-link' => "T' ét scurdê la cêva 'd ingrès?",
+'helplogin-url' => "Help: Per l'ingrès",
+'userlogin-helplink' => "[[{{MediaWiki:helplogin-url}}|Ajót cun l' ingrès]]",
+'userlogin-loggedin' => "T'ét bèle coleghê {{GENDER:$1|$1}}. 
+Drōva al mōdul ché sòta cme un êter utèint.",
+'userlogin-createanother' => "Fà 'n' êtra utèinsa.",
+'createacct-join' => 'Mèt dèinter al tō infurmasiòun ché sòta.',
+'createacct-another-join' => 'Mèt dèinter al j infurmasiòun per la registrasiòun ché sòta.',
+'createacct-emailrequired' => 'Indirés pôsta eletrônica',
+'createacct-emailoptional' => "Indirés pôsta eletrônica (se 's vōl)",
+'createacct-email-ph' => 'Scrév al tó indirés ed pôsta eletrônica',
+'createacct-another-email-ph' => "Scrév l'indirés ed pôsta eletrônica",
 'createaccountmail' => "Drōva 'na cêva 'd ingrès a chêş pruvişôria e spidésla a l'indirés ed pôsta eletrônica sgnê.",
+'createacct-realname' => "Al nòm vèira (se 's vōl)",
 'createaccountreason' => 'Mutîv:',
+'createacct-reason' => 'Mutîv',
+'createacct-reason-ph' => "Perchè ét drē fêr 'n' êtra utèinsa",
+'createacct-captcha' => "Cuntròl 'd sicurèsa",
+'createacct-imgcaptcha-ph' => "Mèt dèinter al tèst ch'é vèd ché sōver",
+'createacct-submit' => 'Fà la tó utèinsa',
+'createacct-another-submit' => "Fà 'n' êtra utèinsa.",
+'createacct-benefit-heading' => '{{SITENAME}} crès grâsia a persòuni cme té.',
+'createacct-benefit-body1' => '{{PLURAL:$1|mudéfica|mudéfichi}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|pàgina|pàgini}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|iscrét nōv}}',
+'badretype' => "Al cêvi 'd ingrès scréti an cumbînen tra 'd lōr.",
+'userexists' => "Al nòm utèint scrét l'é bèle druvê.
+Siēlier 'n' êter nòm utèint.",
 'loginerror' => "Erōr 'd ingrès",
+'createacct-error' => "A gh'é stê un erōr ind al fêr l'utèinsa.",
+'createaccounterror' => "Imposébil fêr l'iscrisiòun: $1",
+'nocookiesnew' => "La registrasiòun  an n' é mìa finîda, e an n'é mìa stê pusébil andêr dèinter a {{SITENAME}} perchè i cookie în blûchê. Tōrna fêr l'ingrès cun al nòm e la cêva 'd ingrès apèina fât dôp avèir şbluchê i cookie int al tó navigadōr.",
+'nocookieslogin' => "Per fêr l'ingrès a {{SITENAME}} a 's dēv druvêr i cookie che rişûlten bluchê. Tōrna fêr l'ingrès dôp avèir şbluchê i cookie int al tó navigadōr.",
+'nocookiesfornew' => "L'iscrisiòun utèint an n'é mìa stêda fâta, perchè òm mìa prû cunfermêr la só urégin. Veréfica 'd avèir şbluchê i cookie, tōrna carghêr cla pàgina ché e prōva incòra.",
+'noname' => "Al nòm utèint scrét an n'é mìa vâlid.",
+'loginsuccesstitle' => 'Ingrès fât.',
+'loginsuccess' => "''' T'é stê coleghê al terminêl {{SITENAME}} cun al nòm utèint '''$1'''.",
+'nosuchuser' => 'An n\'é mìa registrê nisûn utèint cun al nòm "$1". I nòm utèin în sensébil al lètri grândi. Veréfica al nòm scrét o [[Special:UserLogin/signup|fà un nōv ingrès]].',
+'nosuchusershort' => "An gh'é mìa registrê un utèint ciamê ''$1''. Veréfica al nòm scrét.",
+'nouserspecified' => "L'é necesâri precişêr un nòm utèint.",
+'login-userblocked' => "Cl'utèinsa ché l'é bluchêda. An n'é pusébil fêr l'ingrès.",
+'wrongpassword' => "La cêv 'd ingrès e-scréta an n'é mìa giósta. Tōrna a pruvêr.",
+'wrongpasswordempty' => "An n'é mìa stê scrét nisóna cêva 'd ingrès. Tōrna pruvêr.",
+'passwordtooshort' => "La cêva 'd ingrès la dēv avèir almēno {{PLURAL:$1|1 carâter|$1 carâter}}",
+'password-name-match' => "La cêva 'd ingrès l'an dēv mìa èser cumpâgn al nòm utèint.",
+'password-login-forbidden' => "L'ûş de sté nòm e cêva 'd ingrès l'é stê pruibî.",
 'mailmypassword' => "Tōrna mèter la cêva 'd ingrès",
+'passwordremindertitle' => "Nōva cêva 'd ingrès pruvişôria per {{SITENAME}}",
+'passwordremindertext' => "Quelchiûn (prubabilmèit té, cun l'indirés IP \$1) l'à dmandê de spidîregh 'na nōva cêva 'd ingrès a {{SITENAME}} (\$4). 'Na nōva cêva 'd ingrès pruvişôria per l'utèint \"\$2\" l'é stêda impustêda a \"\$3\". L'é necesâri fêr un ingrès al pió prèst e cambiêr la cêva 'd ingrès subét. La cêva 'd ingrès pruvişôria la scadrà dôp {{PLURAL:\$5un dé|\$5 dé}}. S' an t'é mia stê té a fêr la dmânda, opór t'é turnê a catêr la vècia cêva 'd ingrès e an 't vō pió cambiêrla, ét pō trascurêr cól mesâg ché e cuntinvêr a druvêr la vècia cêva 'd ingrès.",
+'noemail' => "Nisûn indirés ed pôsta eletrônica registrê per l'utèint $1.",
+'noemailcreate' => "L'é necesâri dêr un 'indirés ed pôsta eletrônica vâlid.",
+'passwordsent' => "'Na nōva cêva 'd ingrès l'é stêda spidîda a l'indiré ed pôsta eletrônica per l'utèint \"\$1\". Per piaşèir, fà un ingrès apèina 't la ricēv.",
+'blocked-mailpassword' => "Per pervèder abûş, an n'é mìa permès druvêr la funsiòun \"spidés 'na nōva cêva 'd ingrès\" da un indirés IP bluchê.",
 'accountcreated' => 'Ingrès fât',
 'loginlanguagelabel' => 'Léngva: $1',
 
@@ -438,9 +591,9 @@ Per cumditê còst l'é l'èlèinch dal scanşladûri e di spustamèint relatîv
 'previousrevision' => '← Versiòun pió vècia',
 'nextrevision' => 'Versiòun pió nōva →',
 'currentrevisionlink' => 'Ûltma versiòun',
-'cur' => 'cur',
+'cur' => 'adès',
 'next' => 'Còl dôp',
-'last' => 'Còl préma',
+'last' => 'préma',
 'page_first' => 'préma',
 'page_last' => 'ûltem',
 'histlegend' => "Cunfrûnt tra 'l versiòun:  sernés al caşèli cumpâgni al versiòun vrûdi e schésa Invio o al ptòun in bâs. Spiegasiòun: : '''({{int:cur}})''' = diferèinsi cun la versiòun d' adèsa, '''({{int:last}})''' = diferèinsi cun la versiòun ed préma, '''{{int:minoreditletter}}''' = mudéfica céca.",
@@ -705,8 +858,8 @@ Per cumditê còst l'é l'èlèinch dal scanşladûri e di spustamèint relatîv
 'emailmessage' => 'Mesâg',
 
 # Watchlist
-'watchlist' => 'Sòt uservasiòun',
-'mywatchlist' => 'Sòt uservasiòun',
+'watchlist' => 'Tgnîr sòt ôc',
+'mywatchlist' => 'Tgnîr sòt ôc',
 'watchlistfor2' => "Da l'utèint $1 $2",
 'watchnologin' => "An t'é mìa gnû dèinter",
 'watch' => 'Và adrē',
@@ -900,7 +1053,7 @@ Per cumditê còst l'é l'èlèinch dal scanşladûri e di spustamèint relatîv
 # Info page
 'pageinfo-header-edits' => 'Stòria dal mudéfichi',
 'pageinfo-views' => 'Nómer dal vîşiti',
-'pageinfo-watchers' => "Nómer  'd utèint che gh'àn la pàgina sòt uservasiòun.",
+'pageinfo-watchers' => "Nómer  'd utèint che gh'àn la pàgina sòt ôc.",
 'pageinfo-edits' => 'Nómer totêl dal mudéfichi',
 'pageinfo-authors' => 'Nómer totêl di divêrs avtôr',
 
index 7171d50..94796ac 100644 (file)
@@ -381,7 +381,6 @@ $messages = array(
 'tog-numberheadings' => 'Αυτόματη αρίθμηση επικεφαλίδων',
 'tog-showtoolbar' => 'Εμφάνιση μπάρας εργαλείων επεξεργασίας',
 'tog-editondblclick' => 'Επεξεργασία σελίδων με διπλό κλικ',
-'tog-editsection' => 'Ενεργοποίηση επεξεργασίας ενοτήτων μέσω των συνδέσμων [επεξεργασία]',
 'tog-editsectiononrightclick' => 'Ενεργοποίηση επεξεργασίας ενοτήτων με δεξί κλικ στους τίτλους των ενοτήτων',
 'tog-showtoc' => 'Εμφάνιση πίνακα περιεχομένων (για σελίδες με περισσότερες από τρεις κεφαλίδες)',
 'tog-rememberpassword' => 'Διατήρηση της σύνδεσής μου σε αυτόν τον περιηγητή (για μέγιστο $1 {{PLURAL:$1|ημέρας|ημερών}})',
@@ -1737,7 +1736,9 @@ $1",
 'recentchanges-label-minor' => 'Αυτή είναι μια μικροαλλαγή',
 'recentchanges-label-bot' => 'Αυτή η επεξεργασία έγινε από ένα ρομπότ',
 'recentchanges-label-unpatrolled' => 'Αυτή η επεξεργασία δεν έχει ελεγχθεί ακόμα',
-'recentchanges-legend-newpage' => '$1 - νέα σελίδα',
+'recentchanges-label-plusminus' => 'Μεταβολή του μεγέθους της σελίδας σε bytes',
+'recentchanges-legend-heading' => "'''Υπόμνημα:'''",
+'recentchanges-legend-newpage' => '(δείτε [[Special:NewPages|Νέες σελίδες]])',
 'rcnotefrom' => "Παρακάτω είναι οι αλλαγές από τις '''$2''' (εμφανίζονται μέχρι '''$1''').",
 'rclistfrom' => 'Εμφάνιση νέων αλλαγών αρχίζοντας από $1',
 'rcshowhideminor' => '$1 μικροεπεξεργασιών',
index 2a10a78..3e009e8 100644 (file)
@@ -404,6 +404,7 @@ $specialPageAliases = array(
        'CreateAccount'             => array( 'CreateAccount' ),
        'Deadendpages'              => array( 'DeadendPages' ),
        'DeletedContributions'      => array( 'DeletedContributions' ),
+       'Diff'                      => array( 'Diff' ),
        'DoubleRedirects'           => array( 'DoubleRedirects' ),
        'EditWatchlist'             => array( 'EditWatchlist' ),
        'Emailuser'                 => array( 'EmailUser' ),
@@ -667,9 +668,7 @@ future releases. Also note that since each list value is wrapped in a unique
 'tog-numberheadings'          => 'Auto-number headings',
 'tog-showtoolbar'             => 'Show edit toolbar',
 'tog-editondblclick'          => 'Edit pages on double click',
-'tog-editsection'             => 'Enable section editing via [edit] links',
 'tog-editsectiononrightclick' => 'Enable section editing by right clicking on section titles',
-'tog-showtoc'                 => 'Show table of contents (for pages with more than 3 headings)',
 'tog-rememberpassword'        => 'Remember my login on this browser (for a maximum of $1 {{PLURAL:$1|day|days}})',
 'tog-watchcreations'          => 'Add pages I create and files I upload to my watchlist',
 'tog-watchdefault'            => 'Add pages and files I edit to my watchlist',
@@ -782,7 +781,7 @@ future releases. Also note that since each list value is wrapped in a unique
 'category_header'                => 'Pages in category "$1"',
 'subcategories'                  => 'Subcategories',
 'category-media-header'          => 'Media in category "$1"',
-'category-empty'                 => "''This category currently contains no pages or media.''",
+'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.}}',
@@ -1009,7 +1008,7 @@ This may indicate a bug in the software.',
 'databaseerror-query'           => 'Query: $1',
 'databaseerror-function'        => 'Function: $1',
 'databaseerror-error'           => 'Error: $1',
-'laggedslavemode'               => "'''Warning:''' Page may not contain recent updates.",
+'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.
@@ -1057,15 +1056,15 @@ Data here will not presently be refreshed.',
 Please 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 '''your edits''' to 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.
 To add or change translations for all wikis, please use [//translatewiki.net/ translatewiki.net], the MediaWiki localisation project.',
-'editinginterface'              => "'''Warning:''' You are editing a page that is used to provide interface text for the software.
+'editinginterface'              => '<strong>Warning:</strong> You are editing a page that is used to provide interface text for the software.
 Changes to this page will affect the appearance of the user interface for other users on this wiki.
-To add or change translations for all wikis, please use [//translatewiki.net/ translatewiki.net], the MediaWiki localisation project.",
+To 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:
 $2',
-'namespaceprotected'            => "You do not have permission to edit pages in the '''$1''' namespace.",
+'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.',
@@ -1074,7 +1073,7 @@ $2',
 '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]].
-The reason given is "\'\'$2\'\'".',
+The reason given is "<em>$2</em>".',
 'filereadonlyerror'             => 'Unable to modify the file "$1" because the file repository "$2" is in read-only mode.
 
 The administrator who locked it offered this explanation: "$3".',
@@ -1085,12 +1084,12 @@ The administrator who locked it offered this explanation: "$3".',
 'exception-nologin-text-manual' => 'Please $1 to be able to access this page or action.',
 
 # Virus scanner
-'virus-badscanner'     => "Bad configuration: Unknown virus scanner: ''$1''",
+'virus-badscanner'     => "Bad configuration: Unknown virus scanner: <em>$1</em>",
 'virus-scanfailed'     => 'scan failed (code $1)',
 'virus-unknownscanner' => 'unknown antivirus:',
 
 # Login and logout pages
-'logouttext'                      => "'''You are now logged out.'''
+'logouttext'                      => "<strong>You are now logged out.</strong>
 
 Note that some pages may continue to be displayed as if you were still logged in, until you clear your browser cache.",
 'welcomeuser'                     => 'Welcome, $1!',
@@ -1181,7 +1180,7 @@ Ensure you have cookies enabled, reload this page and try again.',
 'nocookiesforlogin'               => '{{int:nocookieslogin}}', # only translate this message to other languages if you have to change it
 'noname'                          => 'You have not specified a valid username.',
 'loginsuccesstitle'               => 'Login successful',
-'loginsuccess'                    => "'''You are now logged in to {{SITENAME}} as \"\$1\".'''",
+'loginsuccess'                    => "<strong>You are now logged in to {{SITENAME}} as \"\$1\".</strong>",
 'nosuchuser'                      => 'There is no user by the name "$1".
 Usernames are case sensitive.
 Check your spelling, or [[Special:UserLogin/signup|create a new account]].',
@@ -1268,6 +1267,8 @@ If you choose to provide it, this will be used for giving the user attribution f
 # Change password dialog
 'changepassword'            => 'Change password',
 'changepassword-summary'    => '', # do not translate or duplicate this message to other languages
+'changepassword-throttled'  => 'You have made too many recent login attempts.
+Please wait $1 before trying again.',
 'resetpass_announce'        => 'You logged in with a temporary emailed code.
 To finish logging in, you must set a new password here:',
 'resetpass_text'            => '<!-- Add text here -->', # only translate this message to other languages if you have to change it
@@ -1338,6 +1339,8 @@ Temporary password: $2',
 'changeemail-password' => 'Your {{SITENAME}} password:',
 'changeemail-submit'   => 'Change email',
 'changeemail-cancel'   => 'Cancel',
+'changeemail-throttled' => 'You have made too many login attempts.
+Please wait $1 before trying again.',
 
 # Special:ResetTokens
 'resettokens'                 => 'Reset tokens',
@@ -1383,21 +1386,21 @@ You should do it if you accidentally shared them with someone or if your account
 'showpreview'                      => 'Show preview',
 'showlivepreview'                  => 'Live preview',
 'showdiff'                         => 'Show changes',
-'anoneditwarning'                  => "'''Warning:''' You are not logged in.
+'anoneditwarning'                  => "<strong>Warning:</strong> You are not logged in.
 Your IP address will be recorded in this page's edit history.",
-'anonpreviewwarning'               => "''You are not logged in. Saving will record your IP address in this page's edit history.''",
-'missingsummary'                   => "'''Reminder:''' You have not provided an edit summary.
+'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.
 If you click \"{{int:savearticle}}\" again, your edit will be saved without one.",
 'missingcommenttext'               => 'Please enter a comment below.',
-'missingcommentheader'             => "'''Reminder:''' You have not provided a subject/headline for this comment.
+'missingcommentheader'             => "<strong>Reminder:</strong> You have not provided a subject/headline for this comment.
 If 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'                      => "'''Your username or IP address has been blocked.'''
+'blockedtext'                      => "<strong>Your username or IP address has been blocked.</strong>
 
 The block was made by $1.
-The reason given is ''$2''.
+The reason given is <em>$2</em>.
 
 * Start of block: $8
 * Expiry of block: $6
@@ -1410,7 +1413,7 @@ Please 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.
 The reason given is:
 
-:''$2''
+:<em>$2</em>
 
 * Start of block: $8
 * Expiry of block: $6
@@ -1433,15 +1436,15 @@ It may have been moved or deleted while you were viewing the page.',
 '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 ''[[Special:ChangePassword|change password]]'' page upon logging in.",
+'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.
 To create the page, start typing in the box below (see the [[{{MediaWiki:Helppage}}|help page]] for more info).
-If you are here by mistake, click your browser's '''back''' button.",
+If you are here by mistake, click your browser's <strong>back</strong> button.",
 'newarticletextanon'               => '{{int:newarticletext}}', # do not translate or duplicate this message to other languages
 'talkpagetext'                     => '<!-- MediaWiki:talkpagetext -->', # do not translate or duplicate this message to other languages
 'anontalkpagetext'                 => "----
-''This is the discussion page for an anonymous user who has not created an account yet, or who does not use it.''
+<em>This is the discussion page for an anonymous user who has not created an account yet, or who does not use it.</em>
 We therefore have to use the numerical IP address to identify him/her.
 Such an IP address can be shared by several users.
 If you are an anonymous user and feel that irrelevant comments have been directed at you, please [[Special:UserLogin/signup|create an account]] or [[Special:UserLogin|log in]] to avoid future confusion with other anonymous users.",
@@ -1461,42 +1464,42 @@ Please 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.
 The latest block log entry is provided below for reference:',
-'clearyourcache'                   => "'''Note:''' After saving, you may have to bypass your browser's cache to see the changes.
-* '''Firefox / Safari:''' Hold ''Shift'' while clicking ''Reload'', or press either ''Ctrl-F5'' or ''Ctrl-R'' (''⌘-R'' on a Mac)
-* '''Google Chrome:''' Press ''Ctrl-Shift-R'' (''⌘-Shift-R'' on a Mac)
-* '''Internet Explorer:''' Hold ''Ctrl'' while clicking ''Refresh'', or press ''Ctrl-F5''
-* '''Opera:''' Clear the cache in ''Tools → Preferences''",
-'usercssyoucanpreview'             => "'''Tip:''' Use the \"{{int:showpreview}}\" button to test your new CSS before saving.",
-'userjsyoucanpreview'              => "'''Tip:''' Use the \"{{int:showpreview}}\" button to test your new JavaScript before saving.",
-'usercsspreview'                   => "'''Remember that you are only previewing your user CSS.'''
-'''It has not yet been saved!'''",
-'userjspreview'                    => "'''Remember that you are only testing/previewing your user JavaScript.'''
-'''It has not yet been saved!'''",
-'sitecsspreview'                   => "'''Remember that you are only previewing this CSS.'''
-'''It has not yet been saved!'''",
-'sitejspreview'                    => "'''Remember that you are only previewing this JavaScript code.'''
-'''It has not yet been saved!'''",
-'userinvalidcssjstitle'            => "'''Warning:''' There is no skin \"\$1\".
+'clearyourcache'                   => "<strong>Note:</strong> After saving, you may have to bypass your browser's cache to see the changes.
+* <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)
+* <strong>Google Chrome:</strong> Press <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> on a Mac)
+* <strong>Internet Explorer:</strong> Hold <em>Ctrl</em> while clicking <em>Refresh</em>, or press <em>Ctrl-F5</em>
+* <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.
+It has not yet been saved!</strong>",
+'userjspreview'                    => "<strong>Remember that you are only testing/previewing your user JavaScript.
+It has not yet been saved!</strong>",
+'sitecsspreview'                   => "<strong>Remember that you are only previewing this CSS.
+It has not yet been saved!</strong>",
+'sitejspreview'                    => "<strong>Remember that you are only previewing this JavaScript code.
+It has not yet been saved!</strong>",
+'userinvalidcssjstitle'            => "<strong>Warning:</strong> There is no skin \"\$1\".
 Custom .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'                             => "'''Note:'''",
-'previewnote'                      => "'''Remember that this is only a preview.'''
+'note'                             => "<strong>Note:</strong>",
+'previewnote'                      => "<strong>Remember that this is only a preview.</strong>
 Your 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'             => "'''Sorry! We could not process your edit due to a loss of session data.'''
+'session_fail_preview'             => "<strong>Sorry! We could not process your edit due to a loss of session data.</strong>
 Please try again.
 If it still does not work, try [[Special:UserLogout|logging out]] and logging back in.",
-'session_fail_preview_html'        => "'''Sorry! We could not process your edit due to a loss of session data.'''
+'session_fail_preview_html'        => "<strong>Sorry! We could not process your edit due to a loss of session data.</strong>
 
-''Because {{SITENAME}} has raw HTML enabled, the preview is hidden as a precaution against JavaScript attacks.''
+<em>Because {{SITENAME}} has raw HTML enabled, the preview is hidden as a precaution against JavaScript attacks.</em>
 
-'''If this is a legitimate edit attempt, please try again.'''
+<strong>If this is a legitimate edit attempt, please try again.</strong>
 If it still does not work, try [[Special:UserLogout|logging out]] and logging back in.",
-'token_suffix_mismatch'            => "'''Your edit has been rejected because your client mangled the punctuation characters in the edit token.'''
+'token_suffix_mismatch'            => "<strong>Your edit has been rejected because your client mangled the punctuation characters in the edit token.</strong>
 The edit has been rejected to prevent corruption of the page text.
 This sometimes happens when you are using a buggy web-based anonymous proxy service.",
-'edit_form_incomplete'             => "'''Some parts of the edit form did not reach the server; double-check that your edits are intact and try again.'''",
+'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)',
@@ -1506,37 +1509,37 @@ This sometimes happens when you are using a buggy web-based anonymous proxy serv
 The upper text area contains the page text as it currently exists.
 Your changes are shown in the lower text area.
 You will have to merge your changes into the existing text.
-'''Only''' the text in the upper text area will be saved when you press \"{{int:savearticle}}\".",
+<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'                => "'''Warning: Your browser is not Unicode compliant.'''
+'nonunicodebrowser'                => "<strong>Warning: Your browser is not Unicode compliant.</strong>
 A workaround is in place to allow you to safely edit pages: Non-ASCII characters will appear in the edit box as hexadecimal codes.",
-'editingold'                       => "'''Warning: You are editing an out-of-date revision of this page.'''
+'editingold'                       => "<strong>Warning: You are editing an out-of-date revision of this page.</strong>
 If 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).
 If you do not want your writing to be edited mercilessly and redistributed at will, then do not submit it here.<br />
 You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource.
-'''Do not submit copyrighted work without permission!'''",
+<strong>Do not submit copyrighted work without permission!</strong>",
 'copyrightwarning2'                => "Please note that all contributions to {{SITENAME}} may be edited, altered, or removed by other contributors.
 If you do not want your writing to be edited mercilessly, then do not submit it here.<br />
 You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource (see $1 for details).
-'''Do not submit copyrighted work without permission!'''",
+<strong>Do not submit copyrighted work without permission!</strong>",
 'editpage-head-copy-warn'          => '-', # do not translate or duplicate this message to other languages
 'editpage-tos-summary'             => '-', # do not translate or duplicate this message to other languages
 'longpage-hint'                    => '-', # do not translate or duplicate this message to other languages
-'longpageerror'                    => "'''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}}.'''
+'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>
 It cannot be saved.",
-'readonlywarning'                  => "'''Warning: The database has been locked for maintenance, so you will not be able to save your edits right now.'''
+'readonlywarning'                  => "<strong>Warning: The database has been locked for maintenance, so you will not be able to save your edits right now.</strong>
 You may wish to copy and paste your text into a text file and save it for later.
 
 The administrator who locked it offered this explanation: $1",
-'protectedpagewarning'             => "'''Warning: This page has been protected so that only users with administrator privileges can edit it.'''
+'protectedpagewarning'             => "<strong>Warning: This page has been protected so that only users with administrator privileges can edit it.</strong>
 The latest log entry is provided below for reference:",
-'semiprotectedpagewarning'         => "'''Note:''' This page has been protected so that only registered users can edit it.
+'semiprotectedpagewarning'         => "<strong>Note:</strong> This page has been protected so that only registered users can edit it.
 The latest log entry is provided below for reference:",
-'cascadeprotectedwarning'          => "'''Warning:''' 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'            => "'''Warning: This page has been protected so that [[Special:ListGroupRights|specific rights]] are needed to create it.'''
+'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>
 The 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:',
@@ -1554,7 +1557,7 @@ You can go back and edit an existing page, or [[Special:UserLogin|log in or crea
 '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'       => "'''Warning: You are recreating a page that was previously deleted.'''
+'recreate-moveddeleted-warn'       => "<strong>Warning: You are recreating a page that was previously deleted.</strong>
 
 You should consider whether it is appropriate to continue editing this page.
 The deletion and move log for this page are provided here for convenience:",
@@ -1578,6 +1581,8 @@ It already exists.',
 '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.
 If you are logged in, you can disable this warning in the "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 models
 'content-model-wikitext'   => 'wikitext',
@@ -1586,14 +1591,14 @@ If you are logged in, you can disable this warning in the "Editing" section of y
 'content-model-css'        => 'CSS',
 
 # Parser/template warnings
-'expensive-parserfunction-warning'        => "'''Warning:''' This page contains too many expensive parser function calls.
+'expensive-parserfunction-warning'        => "<strong>Warning:</strong> This page contains too many expensive parser function calls.
 
 It 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'  => "'''Warning:''' Template include size is too large.
+'post-expand-template-inclusion-warning'  => "<strong>Warning:</strong> Template include size is too large.
 Some templates will not be included.",
 'post-expand-template-inclusion-category' => 'Pages where template include size is exceeded',
-'post-expand-template-argument-warning'   => "'''Warning:''' This page contains at least one template argument that has a too large expansion size.
+'post-expand-template-argument-warning'   => "<strong>Warning:</strong> This page contains at least one template argument that has a too large expansion size.
 These arguments have been omitted.",
 'post-expand-template-argument-category'  => 'Pages containing omitted template arguments',
 'parser-template-loop-warning'            => 'Template loop detected: [[$1]]',
@@ -1620,9 +1625,10 @@ Please check the comparison below to verify that this is what you want to do, an
 '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]].
 
 The reason given by $3 is ''$2''",
-'cantcreateaccount-text' => "Account creation from this IP address ('''$1''') has been blocked by [[User:$3|$3]].
+'cantcreateaccount-text' => "Account creation from this IP address (<strong>$1</strong>) has been blocked by [[User:$3|$3]].
 
-The reason given by $3 is ''$2''",
+The reason given by $3 is <em>$2</em>",
+'createaccount-hook-aborted' => '$1', # do not translate or duplicate this message to other languages
 
 # History pages
 'viewpagelogs'           => 'View logs for this page',
@@ -1642,7 +1648,7 @@ The reason given by $3 is ''$2''",
 '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 />
-Legend: '''({{int:cur}})''' = difference with latest revision, '''({{int:last}})''' = difference with preceding revision, '''{{int:minoreditletter}}''' = minor edit.",
+Legend: <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'      => '-', # do not translate or duplicate this message to other languages
@@ -1664,30 +1670,30 @@ Try [[Special:Search|searching on the wiki]] for relevant new pages.',
 '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 '''deleted'''.
+'rev-deleted-text-permission' => "This page revision has been <strong>deleted</strong>.
 Details can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].",
-'rev-deleted-text-unhide'     => "This page revision has been '''deleted'''.
+'rev-deleted-text-unhide'     => "This page revision has been <strong>deleted</strong>.
 Details can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].
 You can still [$1 view this revision] if you wish to proceed.",
-'rev-suppressed-text-unhide'  => "This page revision has been '''suppressed'''.
+'rev-suppressed-text-unhide'  => "This page revision has been <strong>suppressed</strong>.
 Details can be found in the [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} suppression log].
 You can still [$1 view this revision] if you wish to proceed.",
-'rev-deleted-text-view'       => "This page revision has been '''deleted'''.
+'rev-deleted-text-view'       => "This page revision has been <strong>deleted</strong>.
 You 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 '''suppressed'''.
+'rev-suppressed-text-view'    => "This page revision has been <strong>suppressed</strong>.
 You 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 '''deleted'''.
+'rev-deleted-no-diff'         => "You cannot view this diff because one of the revisions has been <strong>deleted</strong>.
 Details 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 '''deleted'''.",
-'rev-deleted-unhide-diff'     => "One of the revisions of this diff has been '''deleted'''.
+'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>.
 Details can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].
 You can still [$1 view this diff] if you wish to proceed.",
-'rev-suppressed-unhide-diff'  => "One of the revisions of this diff has been '''suppressed'''.
+'rev-suppressed-unhide-diff'  => "One of the revisions of this diff has been <strong>suppressed</strong>.
 Details can be found in the [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} suppression log].
 You can still [$1 view this diff] if you wish to proceed.",
-'rev-deleted-diff-view'       => "One of the revisions of this diff has been '''deleted'''.
+'rev-deleted-diff-view'       => "One of the revisions of this diff has been <strong>deleted</strong>.
 You 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 '''suppressed'''.
+'rev-suppressed-diff-view'    => "One of the revisions of this diff has been <strong>suppressed</strong>.
 You 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',
@@ -1698,15 +1704,15 @@ function, the specified revision does not exist, or you are attempting to hide t
 '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'          => "'''{{PLURAL:$2|Selected revision|Selected revisions}} of [[:$1]]:'''",
-'logdelete-selected'          => "'''{{PLURAL:$1|Selected log event|Selected log events}}:'''",
-'revdelete-text'              => "'''Deleted revisions and events will still appear in the page history and logs, but parts of their content will be inaccessible to the public.'''
+'revdelete-selected'          => "<strong>{{PLURAL:$2|Selected revision|Selected revisions}} of [[:$1]]:</strong>",
+'logdelete-selected'          => "<strong>{{PLURAL:$1|Selected log event|Selected log events}}:</strong>",
+'revdelete-text'              => "<strong>Deleted revisions and events will still appear in the page history and logs, but parts of their content will be inaccessible to the public.</strong>
 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 '''only''' be used for the following cases:
+'revdelete-suppress-text'     => "Suppression should <strong>only</strong> be used for the following cases:
 * potentially libelous information
 * inappropriate personal information
-*: ''home addresses and telephone numbers, national identification numbers, etc.''",
+*: <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',
@@ -1721,11 +1727,11 @@ Other administrators on {{SITENAME}} will still be able to access the hidden con
 'revdelete-unsuppress'        => 'Remove restrictions on restored revisions',
 'revdelete-log'               => 'Reason:',
 'revdelete-submit'            => 'Apply to selected {{PLURAL:$1|revision|revisions}}',
-'revdelete-success'           => "'''Revision visibility successfully updated.'''",
-'revdelete-failure'           => "'''Revision visibility could not be updated:'''
+'revdelete-success'           => "<strong>Revision visibility successfully updated.</strong>",
+'revdelete-failure'           => "<strong>Revision visibility could not be updated:</strong>
 $1",
-'logdelete-success'           => "'''Log visibility successfully set.'''",
-'logdelete-failure'           => "'''Log visibility could not be set:'''
+'logdelete-success'           => "<strong>Log visibility successfully set.</strong>",
+'logdelete-failure'           => "<strong>Log visibility could not be set:</strong>
 $1",
 'revdel-restore'              => 'change visibility',
 'pagehist'                    => 'Page history',
@@ -1737,7 +1743,7 @@ You do not have access to it.',
 'revdelete-modify-no-access'  => 'Error modifying the item dated $2, $1: This item has been marked "restricted".
 You do not have access to it.',
 'revdelete-modify-missing'    => 'Error modifying item ID $1: It is missing from the database!',
-'revdelete-no-change'         => "'''Warning:''' The item dated $2, $1 already had the requested visibility settings.",
+'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.
 Please 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.',
@@ -1819,8 +1825,8 @@ Details can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENA
 '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'                => "'''There is a page named \"[[:\$1]]\" on this wiki.''' {{PLURAL:$2|0=|See also the other search results found.}}",
-'searchmenu-new'                   => "'''Create the page \"[[:\$1]]\" on this wiki!''' {{PLURAL:$2|0=|See also the page found with your search.|See also the search results found.}}",
+'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'          => '', # do not translate or duplicate this message to other languages
 'searchprofile-articles'           => 'Content pages',
 'searchprofile-project'            => 'Help and Project pages',
@@ -1837,6 +1843,7 @@ Details can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENA
 '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'         => '$1 results:',
@@ -1846,9 +1853,9 @@ Details can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENA
 'searcheverything-enable'          => 'Search in all namespaces',
 'searchrelated'                    => 'related',
 'searchall'                        => 'all',
-'showingresults'                   => "Showing below up to {{PLURAL:$1|'''1''' result|'''$1''' results}} starting with #'''$2'''.",
-'showingresultsnum'                => "Showing below {{PLURAL:$3|'''1''' result|'''$3''' results}} starting with #'''$2'''.",
-'showingresultsheader'             => "{{PLURAL:$5|Result '''$1''' of '''$3'''|Results '''$1 - $2''' of '''$3'''}} for '''$4'''",
+'showingresults'                   => "Showing below up to {{PLURAL:$1|<strong>1</strong> result|<strong>$1</strong> results}} starting with #<strong>$2</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:',
@@ -2010,7 +2017,7 @@ Your email address is not revealed when other users contact you.',
 'userrights-lookup-user'         => 'Manage user groups',
 'userrights-user-editname'       => 'Enter a username:',
 'editusergroup'                  => 'Edit user groups',
-'editinguser'                    => "Changing user rights of user '''[[User:$1|$1]]''' $2",
+'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:',
@@ -2192,8 +2199,8 @@ Your email address is not revealed when other users contact you.',
 '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'    => "(''±123'')",
-'rcnotefrom'                        => "Below are the changes since '''$2''' (up to '''$1''' shown).",
+'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 $1',
 'rcshowhideminor'                   => '$1 minor edits',
 'rcshowhidebots'                    => '$1 bots',
@@ -2227,7 +2234,7 @@ Your email address is not revealed when other users contact you.',
 '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).
-Pages on [[Special:Watchlist|your watchlist]] are '''bold'''.",
+Pages 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',
 
@@ -2242,16 +2249,16 @@ Pages on [[Special:Watchlist|your watchlist]] are '''bold'''.",
 'upload_directory_read_only'  => 'The upload directory ($1) is not writable by the webserver.',
 'uploaderror'                 => 'Upload error',
 'upload-summary'              => '', # do not translate or duplicate this message to other languages
-'upload-recreate-warning'     => "'''Warning: A file by that name has been deleted or moved.'''
+'upload-recreate-warning'     => "<strong>Warning: A file by that name has been deleted or moved.</strong>
 
 The deletion and move log for this page are provided here for convenience:",
 'uploadtext'                  => "Use the form below to upload files.
 To 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]].
 
 To include a file in a page, use a link in one of the following forms:
-* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' to use the full version of the file
-* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code>''' to use a 200 pixel wide rendition in a box in the left margin with \"alt text\" as description
-* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' for directly linking to the file without displaying the file",
+* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code></strong> to use the full version of the file
+* <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
+* <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.',
@@ -2278,9 +2285,9 @@ Please rename the file and try uploading it again.',
 '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'      => "'''\".\$1\"''' is an unwanted file type.
+'filetype-unwanted-type'      => "<strong>\".\$1\"</strong> is an unwanted file type.
 Preferred {{PLURAL:\$3|file type is|file types are}} \$2.",
-'filetype-banned-type'        => '\'\'\'".$1"\'\'\' {{PLURAL:$4|is not a permitted file type|are not permitted file types}}.
+'filetype-banned-type'        => '<strong>".$1"</strong> {{PLURAL:$4|is not a permitted file type|are not permitted file types}}.
 Permitted {{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.',
@@ -2311,12 +2318,12 @@ To make your summary appear there, you will need to manually edit it.
 * Name of the uploading file: <strong>[[:$1]]</strong>
 * Name of the existing file: <strong>[[:$2]]</strong>
 Please choose a different name.',
-'fileexists-thumbnail-yes'    => "The file seems to be an image of reduced size ''(thumbnail)''.
+'fileexists-thumbnail-yes'    => "The file seems to be an image of reduced size <em>(thumbnail)</em>.
 [[$1|thumb]]
 Please check the file <strong>[[:$1]]</strong>.
 If 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>.
-It seems to be an image of reduced size ''(thumbnail)''.
+It seems to be an image of reduced size <em>(thumbnail)</em>.
 If 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.
 If you still want to upload your file, please go back and use a new name.
@@ -2341,6 +2348,7 @@ You should ask someone with the ability to view suppressed file data to review t
 'php-uploaddisabledtext'      => 'File uploads are disabled in PHP.
 Please check the file_uploads setting.',
 'uploadscripted'              => 'This file contains HTML or script code that may be erroneously interpreted by a web browser.',
+'uploadinvalidxml'            => 'The XML in the uploaded file could not be parsed.',
 'uploadvirus'                 => 'The file contains a virus!
 Details: $1',
 'uploadjava'                  => 'The file is a ZIP file that contains a Java .class file.
@@ -2355,7 +2363,7 @@ Uploading Java files is not allowed because they can cause security restrictions
 'watchthisupload'             => 'Watch this file',
 'filewasdeleted'              => 'A file of this name has been previously uploaded and subsequently deleted.
 You should check the $1 before proceeding to upload it again.',
-'filename-bad-prefix'         => "The name of the file you are uploading begins with '''\"\$1\"''', which is a non-descriptive name typically assigned automatically by digital cameras.
+'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.
 Please choose a more descriptive name for your file.",
 'filename-prefix-blacklist'   => ' #<!-- leave this line exactly as it is --> <pre>
 # Syntax is as follows:
@@ -2413,7 +2421,7 @@ If the problem persists, contact an [[Special:ListUsers/sysop|administrator]].',
 '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: "\'\'$2\'\'"',
+'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".',
@@ -2565,24 +2573,24 @@ Maybe you want to edit the description on its [$2 file description page] there.'
 # File reversion
 'filerevert'                => 'Revert $1',
 'filerevert-legend'         => 'Revert file',
-'filerevert-intro'          => "You are about to revert the file '''[[Media:$1|$1]]''' to the [$4 version as of $3, $2].",
+'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'        => "'''[[Media:$1|$1]]''' has been reverted to the [$4 version as of $3, $2].",
+'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.',
 
 # File deletion
 'filedelete'                   => 'Delete $1',
 'filedelete-legend'            => 'Delete file',
-'filedelete-intro'             => "You are about to delete the file '''[[Media:$1|$1]]''' along with all of its history.",
-'filedelete-intro-old'         => "You are deleting the version of '''[[Media:$1|$1]]''' as of [$4 $3, $2].",
+'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'           => "'''$1''' has been deleted.",
-'filedelete-success-old'       => "The version of '''[[Media:$1|$1]]''' as of $3, $2 has been deleted.",
-'filedelete-nofile'            => "'''$1''' does not exist.",
-'filedelete-nofile-old'        => "There is no archived version of '''$1''' with the specified attributes.",
+'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
@@ -2959,12 +2967,12 @@ Future changes to this page and its associated talk page will be listed there.',
 'notvisiblerev'        => 'The last revision by a different user has been deleted',
 'watchlist-details'    => '{{PLURAL:$1|$1 page|$1 pages}} on your watchlist, not counting talk pages.',
 'wlheader-enotif'      => 'Email notification is enabled.',
-'wlheader-showupdated' => "Pages that have been changed since you last visited them are shown in '''bold'''.",
+'wlheader-showupdated' => "Pages that have been changed since you last visited them are shown in <strong>bold</strong>.",
 'watchmethod-recent'   => 'checking recent edits for watched pages',
 'watchmethod-list'     => 'checking watched pages for recent edits',
 'watchlistcontains'    => 'Your watchlist contains $1 {{PLURAL:$1|page|pages}}.',
 'iteminvalidname'      => 'Problem with item "$1", invalid name...',
-'wlnote'               => "Below {{PLURAL:$1|is the last change|are the last '''$1''' changes}} in the last {{PLURAL:$2|hour|'''$2''' hours}}, as of $3, $4.",
+'wlnote'               => "Below {{PLURAL:$1|is the last change|are the last <strong>$1</strong> changes}} in the last {{PLURAL:$2|hour|<strong>$2</strong> hours}}, as of $3, $4.",
 'wlshowlast'           => 'Show last $1 hours $2 days $3',
 'watchlist-options'    => 'Watchlist options',
 
@@ -3027,10 +3035,10 @@ Feedback and further assistance:
 'exblank'                => 'page was empty',
 'delete-confirm'         => 'Delete "$1"',
 'delete-legend'          => 'Delete',
-'historywarning'         => "'''Warning:''' The page you are about to delete has a history with approximately $1 {{PLURAL:$1|revision|revisions}}:",
+'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.
 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]].',
-'deleting-backlinks-warning' => "'''Warning:''' Other pages link to the page you are about to delete.",
+'deleting-backlinks-warning' => "'''Warning:''' Other pages link to or transclude from the page you are about to delete.",
 'actioncomplete'         => 'Action complete',
 'actionfailed'           => 'Action failed',
 'deletedtext'            => '"$1" has been deleted.
@@ -3101,13 +3109,13 @@ See the [[Special:ProtectedPages|protected pages list]] for the list of currentl
 '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 '''$1'''.",
+'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.
-Here are the current settings for the page '''$1''':",
+Here are the current settings for the page <strong>$1</strong>:",
 'protect-locked-dblock'            => "Protection levels cannot be changed due to an active database lock.
-Here are the current settings for the page '''$1''':",
+Here are the current settings for the page <strong>$1</strong>:",
 'protect-locked-access'            => "Your account does not have permission to change page protection levels.
-Here are the current settings for the page '''$1''':",
+Here 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.
 You can change this page's protection level, but it will not affect the cascading protection.",
 'protect-default'                  => 'Allow all users',
@@ -3154,13 +3162,13 @@ You can change this page's protection level, but it will not affect the cascadin
 'undelete'                     => 'View deleted pages',
 'undelete-summary'             => '', # do not translate or duplicate this message to other languages
 'undeletepage'                 => 'View and restore deleted pages',
-'undeletepagetitle'            => "'''The following consists of deleted revisions of [[:$1|$1]]'''.",
+'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.
 The 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 '''''{{int:undeletebtn}}'''''.
-To perform a selective restoration, check the boxes corresponding to the revisions to be restored, and click '''''{{int:undeletebtn}}'''''.",
+'undeleteextrahelp'            => "To restore the page's entire history, leave all checkboxes deselected and click <strong><em>{{int:undeletebtn}}</em></strong>.
+To 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.
 If a new page with the same name has been created since the deletion, the restored revisions will appear in the prior history.',
@@ -3183,7 +3191,7 @@ You may have a bad link, or the revision may have been restored or removed from
 'undeletedfiles'               => '{{PLURAL:$1|1 file|$1 files}} restored',
 'cannotundelete'               => 'Undelete failed:
 $1',
-'undeletedpage'                => "'''$1 has been restored'''
+'undeletedpage'                => "<strong>$1 has been restored</strong>
 
 Consult 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.',
@@ -3252,9 +3260,9 @@ The latest block log entry is provided below for reference:',
 'whatlinkshere-title'      => 'Pages that link to "$1"',
 'whatlinkshere-summary'    => '', # do not translate or duplicate this message to other languages
 'whatlinkshere-page'       => 'Page:',
-'linkshere'                => "The following pages link to '''[[:$1]]''':",
-'nolinkshere'              => "No pages link to '''[[:$1]]'''.",
-'nolinkshere-ns'           => "No pages link to '''[[:$1]]''' in the chosen namespace.",
+'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',
@@ -3350,7 +3358,7 @@ See the [[Special:BlockList|block list]] to review blocks.',
 'contribslink'                    => 'contribs',
 'emaillink'                       => 'send email',
 'autoblocker'                     => 'Autoblocked because your IP address has been recently used by "[[User:$1|$1]]".
-The reason given for $1\'s block is "\'\'$2\'\'"',
+The reason given for $1\'s block is "<em>$2</em>"',
 'blocklogpage'                    => 'Block log',
 'blocklog-showlog'                => 'This user has been blocked previously.
 The block log is provided below for reference:',
@@ -3372,7 +3380,7 @@ See the [[Special:BlockList|block list]] for the list of currently operational b
 '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 may have too many edits.',
+'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}}',
@@ -3428,10 +3436,10 @@ You can update redirects that point to the original title automatically.
 If you choose not to, be sure to check for [[Special:DoubleRedirects|double]] or [[Special:BrokenRedirects|broken redirects]].
 You are responsible for making sure that links continue to point where they are supposed to go.
 
-Note that the page will '''not''' be moved if there is already a page at the new title, unless the latter is a redirect and has no past edit history.
+Note 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.
 This 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.
 
-'''Warning!'''
+<strong>Warning!</strong>
 This can be a drastic and unexpected change for a popular page;
 please 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.
@@ -3439,19 +3447,19 @@ The old title will become a redirect page to the new title.
 Be sure to check for [[Special:DoubleRedirects|double]] or [[Special:BrokenRedirects|broken redirects]].
 You are responsible for making sure that links continue to point where they are supposed to go.
 
-Note that the page will '''not''' be moved if there is already a page at the new title, unless it is a redirect and has no past edit history.
+Note 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.
 This 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.
 
-'''Warning!'''
+<strong>Warning!</strong>
 This can be a drastic and unexpected change for a popular page;
 please be sure you understand the consequences of this before proceeding.",
-'movepagetalktext'             => "The associated talk page will be automatically moved along with it '''unless:'''
+'movepagetalktext'             => "The associated talk page will be automatically moved along with it <strong>unless:</strong>
 *A non-empty talk page already exists under the new name, or
 *You uncheck the box below.
 
 In those cases, you will have to move or merge the page manually if desired.",
 'movearticle'                  => 'Move page:',
-'moveuserpage-warning'         => "'''Warning:''' You are about to move a user page. Please note that only the page will be moved and the user will ''not'' be renamed.",
+'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.',
@@ -3461,7 +3469,7 @@ In those cases, you will have to move or merge the page manually if desired.",
 'move-watch'                   => 'Watch source page and target page',
 'movepagebtn'                  => 'Move page',
 'pagemovedsub'                 => 'Move succeeded',
-'movepage-moved'               => '\'\'\'"$1" has been moved to "$2"\'\'\'',
+'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.
@@ -3502,9 +3510,9 @@ cannot move a page over itself.',
 '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'     => "'''Warning:''' This page has been protected so that only users with administrator privileges can move it.
+'protectedpagemovewarning'     => "<strong>Warning:</strong> This page has been protected so that only users with administrator privileges can move it.
 The latest log entry is provided below for reference:",
-'semiprotectedpagemovewarning' => "'''Note:''' This page has been protected so that only registered users can move it.
+'semiprotectedpagemovewarning' => "<strong>Note:</strong> This page has been protected so that only registered users can move it.
 The latest log entry is provided below for reference:",
 'move-over-sharedrepo'         => '== File exists ==
 [[:$1]] exists on a shared repository. Moving a file to this title will override the shared file.',
@@ -3523,7 +3531,7 @@ In the latter case you can also use a link, for example [[{{#Special:Export}}/{{
 'exportall'         => 'Export all pages',
 'exportcuronly'     => 'Include only the current revision, not the full history',
 'exportnohistory'   => "----
-'''Note:''' Exporting the full history of pages through this form has been disabled due to performance reasons.",
+<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:',
@@ -3541,7 +3549,7 @@ In the latter case you can also use a link, for example [[{{#Special:Export}}/{{
 'allmessagescurrent'            => 'Current message text',
 'allmessagestext'               => 'This is a list of system messages available in the MediaWiki namespace.
 Please visit [https://www.mediawiki.org/wiki/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 '''\$wgUseDatabaseMessages''' has been disabled.",
+'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',
@@ -3550,6 +3558,7 @@ Please visit [https://www.mediawiki.org/wiki/Localisation MediaWiki Localisation
 'allmessages-prefix'            => 'Filter by prefix:',
 'allmessages-language'          => 'Language:',
 'allmessages-filter-submit'     => 'Go',
+'allmessages-filter-translate'  => 'Translate',
 
 # Thumbnails
 'thumbnail-more'           => 'Enlarge',
@@ -3832,7 +3841,7 @@ This is probably caused by a link to a blacklisted external site.',
 'spam_blanking'       => 'All revisions contained links to $1, blanking',
 'spam_deleting'       => 'All revisions contained links to $1, deleting',
 'simpleantispam-label' => "Anti-spam check.
-Do '''NOT''' fill this in!",
+Do <strong>NOT</strong> fill this in!",
 
 # Info page
 'pageinfo-header'                 => '-', # do not translate or duplicate this message to other languages
@@ -3925,9 +3934,9 @@ $1',
 'nextdiff'     => 'Newer edit →',
 
 # Media information
-'mediawarning'                => "'''Warning:''' This file type may contain malicious code.
+'mediawarning'                => "<strong>Warning:</strong> This file type may contain malicious code.
 By executing it, your system may be compromised.",
-'imagemaxsize'                => "Image size limit:<br />''(for file description pages)''",
+'imagemaxsize'                => "Image size limit:<br /><em>(for file description pages)</em>",
 'thumbsize'                   => 'Thumbnail size:',
 'widthheight'                 => '$1 × $2', # only translate this message to other languages if you have to change it
 'widthheightpage'             => '$1 × $2, $3 {{PLURAL:$3|page|pages}}',
@@ -3947,12 +3956,12 @@ By executing it, your system may be compromised.",
 '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'     => "'''Note: Due to technical limitations, thumbnails of this file will not be animated.'''",
-'file-no-thumb-animation-gif' => "'''Note: Due to technical limitations, thumbnails of high resolution GIF images such as this one will not be animated.'''",
+'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>",
 
 # Special:NewFiles
 'newimages'             => 'Gallery of new files',
-'imagelisttext'         => "Below is a list of '''$1''' {{PLURAL:$1|file|files}} sorted $2.",
+'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):',
@@ -4073,7 +4082,7 @@ Others will be hidden by default.
 * gpslatitude
 * gpslongitude
 * gpsaltitude',
-'metadata-langitem'         => "'''$2:''' $1", # only translate this message to other languages if you have to change it
+'metadata-langitem'         => "<strong>$2:</strong> $1", # only translate this message to other languages if you have to change it
 'metadata-langitem-default' => '$1', # only translate this message to other languages if you have to change it
 
 # Exif tags
@@ -4591,9 +4600,9 @@ This confirmation code will expire at $4.',
 'scarytranscludetoolong'           => '[URL is too long]',
 
 # Delete conflict
-'deletedwhileediting'      => "'''Warning:''' This page was deleted after you started editing!",
+'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:
-: ''$2''
+: <em>$2</em>
 Please 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',
@@ -4804,7 +4813,7 @@ You can also [[Special:EditWatchlist|use the standard editor]].',
 
 # Core parser functions
 'unknown_extension_tag' => 'Unknown extension tag "$1"',
-'duplicate-defaultsort' => '\'\'\'Warning:\'\'\' Default sort key "$2" overrides earlier default sort key "$1".',
+'duplicate-defaultsort' => '<strong>Warning:</strong> Default sort key "$2" overrides earlier default sort key "$1".',
 
 # Special:Version
 'version'                               => 'Version',
@@ -4836,7 +4845,7 @@ You can also [[Special:EditWatchlist|use the standard editor]].',
 'version-ext-colheader-license'         => 'License',
 'version-ext-colheader-description'     => 'Description',
 'version-ext-colheader-credits'         => 'Authors',
-'version-poweredby-credits'             => "This wiki is powered by '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
+'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]].',
@@ -4848,6 +4857,13 @@ You should have received [{{SERVER}}{{SCRIPTPATH}}/COPYING a copy of the GNU Gen
 'version-software'                      => 'Installed software',
 'version-software-product'              => 'Product',
 'version-software-version'              => 'Version',
+'version-db-mysql-url'                  => 'http://www.mysql.com/', # do not translate or duplicate this message to other languages
+'version-db-mariadb-url'                => 'http://mariadb.org/', # do not translate or duplicate this message to other languages
+'version-db-percona-url'                => 'http://www.percona.com/software/percona-server', # do not translate or duplicate this message to other languages
+'version-db-postgres-url'               => 'http://www.postgresql.org/', # do not translate or duplicate this message to other languages
+'version-db-oracle-url'                 => 'http://www.oracle.com/database/', # do not translate or duplicate this message to other languages
+'version-db-sqlite-url'                 => 'http://www.sqlite.org/', # do not translate or duplicate this message to other languages
+'version-db-mssql-url'                  => 'http://www.microsoft.com/sql/', # do not translate or duplicate this message to other languages
 'version-entrypoints'                   => 'Entry point URLs',
 'version-entrypoints-header-entrypoint' => 'Entry point',
 'version-entrypoints-header-url'        => 'URL',
index 9c01d64..a332727 100644 (file)
@@ -335,7 +335,6 @@ $messages = array(
 'tog-numberheadings' => 'Aŭtomate numerigi sekciojn',
 'tog-showtoolbar' => 'Montri redakto-breton (per JavaScript)',
 'tog-editondblclick' => 'Redakti per duobla alklako (per JavaScript)',
-'tog-editsection' => 'Montri [redakti]-ligilojn por sekcioj',
 'tog-editsectiononrightclick' => 'Ŝalti sekcian redaktadon per dekstra musklako de sekciaj titoloj (kun JavaScript)',
 'tog-showtoc' => 'Montri enhavliston (por paĝoj kun pli ol 3 sekcioj)',
 'tog-rememberpassword' => 'Memori mian ensalutadon ĉe ĉi tiu retumilo (daŭrante maksimume $1 {{PLURAL:$1|tagon|tagojn}})',
@@ -747,8 +746,10 @@ Ne forgesu ŝanĝi viajn [[Special:Preferences|{{SITENAME}}-preferojn]]',
 'yourpassword' => 'Pasvorto:',
 'userlogin-yourpassword' => 'Pasvorto',
 'userlogin-yourpassword-ph' => 'Enigu vian pasvorton',
+'createacct-yourpassword-ph' => 'Tajpu pasvorton',
 'yourpasswordagain' => 'Retajpu pasvorton',
 'createacct-yourpasswordagain' => 'Konfirmu pasvorton',
+'createacct-yourpasswordagain-ph' => 'Retajpu pasvorton',
 'remembermypassword' => 'Memori mian ensalutadon ĉe ĉi tiu komputilo (daŭrante maksimume $1 {{PLURAL:$1|tagon|tagojn}})',
 'userlogin-remembermypassword' => 'Memoru mian ensaluton',
 'userlogin-signwithsecure' => 'Uzu sekurigitan konekton',
index cde556d..3bc309c 100644 (file)
@@ -87,6 +87,7 @@
  * @author Remember the dot
  * @author Remux
  * @author Richard Wolf VI
+ * @author Salvador alc
  * @author Sanbec
  * @author Savh
  * @author Shirayuki
@@ -393,7 +394,6 @@ $messages = array(
 'tog-numberheadings' => 'Numerar automáticamente los encabezados',
 'tog-showtoolbar' => 'Mostrar la barra de edición',
 'tog-editondblclick' => 'Editar las páginas al pulsar dos veces en ellos con el ratón',
-'tog-editsection' => 'Activar la edición de secciones mediante el enlace [editar]',
 'tog-editsectiononrightclick' => 'Activar la edición de secciones pulsando el botón derecho en los títulos de secciones',
 'tog-showtoc' => 'Mostrar el índice (para páginas con más de 3 encabezados)',
 'tog-rememberpassword' => 'Recordar mi nombre de usuario y contraseña entre sesiones en este navegador (por un máximo de $1 {{PLURAL:$1|día|días}})',
@@ -423,7 +423,7 @@ $messages = array(
 'tog-diffonly' => "No mostrar bajo las ''diferencias'' el contenido de la página",
 'tog-showhiddencats' => 'Mostrar las categorías escondidas',
 'tog-noconvertlink' => 'Desactivar la conversión de título de enlace',
-'tog-norollbackdiff' => "Omitir la ''diferencia'' después de revertir",
+'tog-norollbackdiff' => 'Omitir la diferencia después de revertir',
 'tog-useeditwarning' => 'Advertirme cuando abandone una página editada con cambios sin grabar',
 'tog-prefershttps' => 'Utiliza una conexión segura siempre que haya iniciado una sesión',
 
@@ -452,7 +452,7 @@ $messages = array(
 'wed' => 'mié',
 'thu' => 'jue',
 'fri' => 'vie',
-'sat' => 'sab',
+'sat' => 'sáb',
 'january' => 'enero',
 'february' => 'febrero',
 'march' => 'marzo',
@@ -611,7 +611,7 @@ $messages = array(
 'redirectedfrom' => '(Redirigido desde «$1»)',
 'redirectpagesub' => 'Página de redirección',
 'lastmodifiedat' => 'Esta página fue modificada por última vez el $1, a las $2.',
-'viewcount' => 'Esta página ha sido visitada {{PLURAL:$1|una vez|$1 veces}}.',
+'viewcount' => 'Esta página se ha visitado {{PLURAL:$1|una vez|$1 veces}}.',
 'protectedpage' => 'Página protegida',
 'jumpto' => 'Saltar a:',
 'jumptonavigation' => 'navegación',
@@ -747,7 +747,7 @@ Por favor, avisa a un [[Special:ListUsers/sysop|administrador]], tomando nota de
 Puede que ya haya sido borrado por alguien más.',
 'cannotdelete-title' => 'No se puede borrar la página «$1»',
 'delete-hook-aborted' => 'La modificación que intentaste hacer fue cancelada por un gancho de extensión. No hay explicación disponible.',
-'no-null-revision' => 'No se pudo crear la nueva revisión nula para la página "$1"',
+'no-null-revision' => 'No se pudo crear la revisión nula para la página «$1»',
 'badtitle' => 'Título incorrecto',
 'badtitletext' => 'El título de la página solicitada está vacío, no es válido, o es un enlace interidioma o interwiki incorrecto.
 Puede que contenga uno o más caracteres que no se pueden usar en los títulos.',
@@ -788,7 +788,7 @@ El administrador que lo ha bloqueado ofrece esta explicación: "$3".',
 
 # Virus scanner
 'virus-badscanner' => "Error de configuración: Antivirus desconocido: ''$1''",
-'virus-scanfailed' => 'Escaneo fallido (código $1)',
+'virus-scanfailed' => 'falló el análisis (código $1)',
 'virus-unknownscanner' => 'antivirus desconocido:',
 
 # Login and logout pages
@@ -800,7 +800,7 @@ No olvides personalizar tus [[Special:Preferences|preferencias de {{SITENAME}}]]
 'yourname' => 'Nombre de usuario:',
 'userlogin-yourname' => 'Usuario',
 'userlogin-yourname-ph' => 'Escribe tu nombre de usuario',
-'createacct-another-username-ph' => 'Ingrese el nombre de usuario',
+'createacct-another-username-ph' => 'Escribe el nombre de usuario',
 'yourpassword' => 'Contraseña:',
 'userlogin-yourpassword' => 'Contraseña',
 'userlogin-yourpassword-ph' => 'Escribe tu contraseña',
@@ -924,8 +924,8 @@ Puedes ignorar este mensaje si esta cuenta fue creada por error.',
 'login-abort-generic' => 'Tu inicio de sesión no fue exitoso - Cancelado',
 '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.
-Si elige proporcionarlo, se usará para dar al usuario la atribución de su trabajo.',
+'createacct-another-realname-tip' => 'El nombre real es opcional.
+Si se proporciona, se usará para dar al usuario la atribución de su trabajo.',
 
 # Email sending
 'php-mail-error-unknown' => 'Error desconocido en la función mail() de PHP.',
@@ -935,7 +935,7 @@ Si elige proporcionarlo, se usará para dar al usuario la atribución de su trab
 # Change password dialog
 'changepassword' => 'Cambiar contraseña',
 'resetpass_announce' => 'Has iniciado sesión con una contraseña temporal que fue enviada por correo electrónico.
-Por favor, introduce una nueva contraseña aquí:',
+Establece una contraseña nueva aquí:',
 'resetpass_text' => '<!-- Añada texto aquí -->',
 'resetpass_header' => 'Cambiar la contraseña de la cuenta',
 'oldpassword' => 'Contraseña antigua:',
@@ -994,8 +994,8 @@ Contraseña temporal: $2',
 'changeemail-header' => 'Cambiar la dirección de correo de la cuenta',
 'changeemail-text' => 'Rellena este formulario para cambiar tu dirección de correo electrónico. Debes introducir la contraseña para confirmar este cambio.',
 'changeemail-no-info' => 'Debes iniciar sesión para acceder directamente a esta página.',
-'changeemail-oldemail' => 'Dirección de correo electrónico actual:',
-'changeemail-newemail' => 'Nueva dirección de correo electrónico:',
+'changeemail-oldemail' => 'Dirección electrónica actual:',
+'changeemail-newemail' => 'Dirección electrónica nueva:',
 'changeemail-none' => '(ninguna)',
 'changeemail-password' => 'Tu contraseña en {{SITENAME}}:',
 'changeemail-submit' => 'Cambiar correo electrónico',
@@ -1218,6 +1218,8 @@ Ya existe.',
 'content-not-allowed-here' => 'El contenido "$1" no está permitido en la página [[$2]]',
 'editwarning-warning' => 'Si abandonas esta página perderás tus cambios.
 Si estás identificado, puedes deshabilitar esta advertencia en la sección "Edición" de tus preferencias.',
+'editpage-notsupportedcontentformat-title' => 'Formato de contenido no admitido',
+'editpage-notsupportedcontentformat-text' => 'El formato de contenido $1 no es compatible con el modelo de contenido  $2.',
 
 # Content models
 'content-model-wikitext' => 'texto wiki',
@@ -1469,6 +1471,7 @@ Los detalles pueden encontrarse en el [{{fullurl:{{#Special:Log}}/delete|page={{
 'search-result-score' => 'Relevancia: $1%',
 'search-redirect' => '(redirige desde $1)',
 'search-section' => '(sección $1)',
+'search-file-match' => '(coincide con el contenido del archivo)',
 'search-suggest' => 'Quizás quieres buscar: $1',
 'search-interwiki-caption' => 'Proyectos hermanos',
 'search-interwiki-default' => 'Resultados de $1:',
@@ -2469,7 +2472,7 @@ La dirección de correo electrónico que indicaste en [[Special:Preferences|tus
 'addwatch' => 'Añadir a la lista de seguimiento',
 'addedwatchtext' => 'La página «[[:$1]]» ha sido añadida a tu [[Special:Watchlist|lista de seguimiento]]. Los cambios futuros en esta página y en su página de discusión asociada se indicarán ahí.',
 'removewatch' => 'Quitar de la lista de seguimiento',
-'removedwatchtext' => 'La página «[[:$1]]» ha sido eliminada de tu [[Special:Watchlist|lista de seguimiento]].',
+'removedwatchtext' => 'Se ha eliminado la página «[[:$1]]» de tu [[Special:Watchlist|lista de seguimiento]].',
 'watch' => 'Vigilar',
 'watchthispage' => 'Vigilar esta página',
 'unwatch' => 'Dejar de vigilar',
@@ -4284,4 +4287,6 @@ También expande las funciones sintácticas como <code><nowiki>{{</nowiki>#langu
 'expand_templates_generate_rawhtml' => 'Mostrar HTML en crudo',
 'expand_templates_preview' => 'Previsualización',
 
+# Unknown messages
+'uploadinvalidxml' => 'No se pudo analizar el XML del archivo cargado.',
 );
index 4fd5ebe..3958796 100644 (file)
@@ -316,7 +316,6 @@ $messages = array(
 'tog-numberheadings' => 'Pealkirjade automaatnummerdus',
 'tog-showtoolbar' => 'Näita redigeerimise tööriistariba',
 'tog-editondblclick' => 'Redigeeri lehekülgi topeltklõpsu peale',
-'tog-editsection' => 'Näita alaosade redigeerimise linke',
 'tog-editsectiononrightclick' => 'Alusta alaosa redigeerimist paremklõpsuga alaosa pealkirjal',
 'tog-showtoc' => 'Näita sisukorda (lehtedel, millel on rohkem kui 3 pealkirja)',
 'tog-rememberpassword' => 'Parooli meeldejätmine tulevasteks seanssideks (kuni $1 {{PLURAL:$1|päevaks|päevaks}})',
@@ -668,10 +667,11 @@ Sellisel juhul tuleks teavitada [[Special:ListUsers/sysop|administraatorit]], ed
 'cannotdelete' => 'Lehekülge või faili "$1" ei saa kustutada.
 Võimalik, et keegi on selle juba kustutanud.',
 'cannotdelete-title' => 'Lehekülge "$1" ei saa kustutada',
+'no-null-revision' => 'Lehekülje "$1" nullredaktsiooni ei õnnestunud teha.',
 'badtitle' => 'Vigane pealkiri',
 'badtitletext' => 'Soovitud lehekülje pealkiri oli vigane, tühi või teisest keeleversioonist või vikist valesti lingitud.
 See võib sisaldada ühte või enamat märki, mida ei saa pealkirjades kasutada.',
-'perfcached' => 'Järgnevad andmed on puhverdatud ja ei pruugi olla kõige värskemad. Puhvris on saadaval kuni {{PLURAL:$1|üks tulemus|$1 tulemust}}.',
+'perfcached' => 'Järgmised andmed on puhverdatud ja ei pruugi olla kõige värskemad. Puhvris on saadaval kuni {{PLURAL:$1|üks tulemus|$1 tulemust}}.',
 'perfcachedts' => 'Järgmised andmed on vahemälus. Viimane uuendamisaeg: $2, kell $3. Puhvris on saadaval kuni {{PLURAL:$4|üks tulemus|$4 tulemust}}.',
 'querypage-no-updates' => 'Lehekülje uuendamine ei ole hetkel lubatud ning andmeid ei värskendata.',
 'viewsource' => 'Vaata lähteteksti',
@@ -752,7 +752,7 @@ Pane tähele, et seni kuni sa pole oma võrgulehitseja puhvrit tühjendanud, võ
 'gotaccount' => "Kui sul on juba konto, '''$1'''.",
 'gotaccountlink' => 'logi sisse',
 'userlogin-resetlink' => 'Kas oled unustanud oma sisselogimisandmed?',
-'userlogin-resetpassword-link' => 'Unustasid parooli?',
+'userlogin-resetpassword-link' => 'Kas unustasid parooli?',
 'helplogin-url' => 'Help:Sisselogimine',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Sisselogimisabi]]',
 'userlogin-loggedin' => 'Oled juba sisse logitud nimega {{GENDER:$1|$1}}.
@@ -820,8 +820,8 @@ Väärtarvitamise vältimiseks saadetakse {{PLURAL:$1|tunni|$1 tunni}} jooksul a
 Seetõttu ei saa seda IP-aadressi kasutades hetkel rohkem kontosid luua.',
 'emailauthenticated' => 'Sinu e-posti aadressi kinnitamisaeg: $2 kell $3.',
 'emailnotauthenticated' => 'Sinu e-posti aadress pole veel kinnitatud.
-Järgnevate funktsioonidega seotud e-kirju ei saadeta.',
-'noemailprefs' => 'Järgnevate võimaluste toimimiseks on vaja sisestada e-posti aadress.',
+Järgmiste funktsioonidega seotud e-kirju ei saadeta.',
+'noemailprefs' => 'Järgmiste võimaluste toimimiseks on vaja määrata e-posti aadress.',
 'emailconfirmlink' => 'Kinnita oma e-posti aadress',
 'invalidemailaddress' => 'E-posti aadress ei ole aktsepteeritav, sest see on vigaselt kirjutatud.
 Ole hea ja sisesta õige e-posti aadress või jäta väli tühjaks.',
@@ -1095,7 +1095,7 @@ Allpool on toodud uusim logisissekanne:",
 'cascadeprotectedwarning' => "'''Hoiatus:''' See lehekülg on nii lukustatud, et ainult administraatori õigustega kasutajad saavad seda redigeerida, sest lehekülg on osa {{PLURAL:$1|järgmisest|järgmisest}} kaskaadkaitsega {{PLURAL:$1|leheküljest|lehekülgedest}}:",
 'titleprotectedwarning' => "'''Hoiatus: See lehekülg on nii lukustatud, et selle loomiseks on tarvis [[Special:ListGroupRights|eriõigusi]].'''
 Allpool on toodud uusim logisissekanne:",
-'templatesused' => 'Sellel leheküljel on kasutusel {{PLURAL:$1|järgnev mall|järgnevad mallid}}:',
+'templatesused' => 'Sellel leheküljel on kasutusel {{PLURAL:$1|järgmine mall|järgmised mallid}}:',
 'templatesusedpreview' => 'Eelvaates {{PLURAL:$1|kasutatav mall|kasutatavad mallid}}:',
 'templatesusedsection' => 'Selles alaosas {{PLURAL:$1|kasutatav mall|kasutatavad mallid}}:',
 'template-protected' => '(kaitstud)',
@@ -1108,7 +1108,7 @@ Võid pöörduda tagasi ja toimetada olemasolevat lehekülge või [[Special:User
 'sectioneditnotsupported-text' => 'Sellel leheküljel pole alaosa redigeerimine lubatud.',
 'permissionserrors' => 'Loatõrge',
 'permissionserrorstext' => 'Sul pole õigust seda teha {{PLURAL:$1|järgmisel põhjusel|järgmistel põhjustel}}:',
-'permissionserrorstext-withaction' => 'Sul pole lubatud {{lcfirst:$2}} {{PLURAL:$1|järgneval põhjusel|järgnevatel põhjustel}}:',
+'permissionserrorstext-withaction' => 'Sul pole lubatud {{lcfirst:$2}} {{PLURAL:$1|järgmisel põhjusel|järgmistel põhjustel}}:',
 'recreate-moveddeleted-warn' => "'''Hoiatus: Lood uuesti lehekülge, mis on varem kustutatud.'''
 
 Kaalu, kas lehekülje uuesti loomine on kohane.
@@ -1130,6 +1130,8 @@ See on juba olemas.',
 'content-not-allowed-here' => 'Lehekülg [[$2]] ei või sisaldada $1i.',
 'editwarning-warning' => 'Sellelt leheküljelt lahkumise tõttu võivad tehtud muudatused kaotsi minna.
 Kui oled sisse loginud, saad selle hoiatuse eelistuste alaosas "Toimetamine" keelata.',
+'editpage-notsupportedcontentformat-title' => 'Sisuvormingu tugi puudub',
+'editpage-notsupportedcontentformat-text' => 'Sisumudelil $2 puudub sisuvormingu $1 tugi.',
 
 # Content models
 'content-model-wikitext' => 'vikitekst',
@@ -1152,6 +1154,7 @@ Need argumendid on välja jäetud.",
 'node-count-exceeded-warning' => 'Lehekülg ületas sõlmemäära.',
 'expansion-depth-exceeded-category' => 'Ületatud hõrendussügavusega leheküljed',
 'expansion-depth-exceeded-warning' => 'Lehekülg ületas hõrendussügavuse.',
+'converter-manual-rule-error' => 'Tõrge keelevariandi käsivahetusreeglis',
 
 # "Undo" feature
 'undo-success' => 'Selle redaktsiooni käigus tehtud muudatusi saab eemaldada. Palun kontrolli allolevat võrdlust veendumaks, et tahad need muudatused tõepoolest eemaldada. Seejärel saad lehekülje salvestada.',
@@ -1244,9 +1247,9 @@ Saad seda muudatust vaadata. [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAG
 'revdelete-text' => "'''Kustutatud redaktsioonid ja sündmused kajastuvad endiselt lehekülje ajaloos ja logides, kuid osa nende sisust pole avalikult nähtav.'''
 {{GRAMMAR:genitive|{{SITENAME}}}} administraatorid saavad peidetud sisu siiski vaadata ning seda vajadusel selle liidese kaudu taastada, kui see pole just täiendavalt keelatud.",
 'revdelete-confirm' => 'Kinnita, et soovid tõesti seda teha ning et saad aru tagajärgedest ja tegevus on kooskõlas [[{{MediaWiki:Policy-url}}|siinsete kokkulepetega]].',
-'revdelete-suppress-text' => "Andmed tuleks varjata '''ainult''' järgnevatel juhtudel:
-* Võimalik laim
-* Sobimatu isiklik teave
+'revdelete-suppress-text' => "Andmed tuleks varjata '''ainult''' järgmistel juhtudel:
+* võimalik laim
+* sobimatu isiklik teave
 *: ''kodune aadress ja telefoninumber, isikukood jne''",
 'revdelete-legend' => 'Nähtavuse piirangute seadmine',
 'revdelete-hide-text' => 'Redaktsiooni tekst',
@@ -1375,6 +1378,7 @@ Harilikult tähendab see seda, et sind siia juhatanud link on vananenud ja siin
 'search-result-score' => 'Vastavus: $1%',
 'search-redirect' => '(ümbersuunamine $1)',
 'search-section' => '(alaosa $1)',
+'search-file-match' => '(vastab faili sisule)',
 'search-suggest' => 'Kas mõtlesid: $1',
 'search-interwiki-caption' => 'Sõsarprojektid',
 'search-interwiki-default' => '$1 tulemused:',
@@ -1750,14 +1754,14 @@ Sinu [[Special:Watchlist|jälgimisloendi]] leheküljed on  '''rasvaselt''' esile
 'upload-recreate-warning' => "'''Hoiatus: Sellise nimega fail on kustutatud või teisaldatud.'''
 
 Selle lehe kustutamis- ja teisaldamislogi on kuvatud siin:",
-'uploadtext' => "Kasuta allpool olevat vormi failide üleslaadimiseks.
-Et näha või leida eelnevalt üles laaditud faile vaata [[Special:FileList|failide loendit]].
+'uploadtext' => "Kasuta allpool olevat vormi, et faile üles laadida.
+Et näha või leida varem üles laaditud faile, vaata [[Special:FileList|failide loendit]].
 Üleslaadimiste ajalugu saab uurida [[Special:Log/upload|üleslaadimislogist]], kustutamiste ajalugu [[Special:Log/delete|kustutamislogist]].
 
-Faili lisamiseks artiklile kasuta linki ühel kujul järgnevatest.
-* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Fail.jpg]]</nowiki></code>''', et lisada täissuuruses pilt.
-* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Fail.png|200px|thumb|left|kirjeldus]]</nowiki></code>''', et lisada lehekülje vasakusse serva raamiga 200 piksli laiune pisipilt koos pildiallkirjaga (''kirjeldus'').
-* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Fail.ogg]]</nowiki></code>''', et linkida otse failile ilma seda kuvamata.",
+Et lisada fail artiklile, kasuta üht järgmistest süntaksitest:
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Fail.jpg]]</nowiki></code>''', et lisada täissuuruses pilt
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Fail.png|200px|thumb|left|kirjeldus]]</nowiki></code>''', et lisada lehekülje vasakusse serva raamiga 200 piksli laiune pisipilt koos pildiallkirjaga (''kirjeldus'')
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Fail.ogg]]</nowiki></code>''', et linkida otse failile ilma seda kuvamata",
 'upload-permitted' => 'Lubatud failitüübid: $1.',
 'upload-preferred' => 'Eelistatud failitüübid: $1.',
 'upload-prohibited' => 'Keelatud failitüübid: $1.',
@@ -1822,9 +1826,11 @@ Palun pöörduge tagasi ja laadige fail üles mõne teise nime all. [[File:$1|th
 'fileexists-shared-forbidden' => 'Samanimeline fail on juba olemas jagatud meediavaramus.
 Kui soovid siiski oma faili üles laadida, siis palun mine tagasi ja kasuta teist failinime.
 [[File:$1|thumb|center|$1]]',
-'file-exists-duplicate' => 'See fail on {{PLURAL:$1|järgneva faili|järgnevate failide}} duplikaat:',
+'file-exists-duplicate' => 'See fail on {{PLURAL:$1|järgmise faili|järgmiste failide}} duplikaat:',
 'file-deleted-duplicate' => 'Selle failiga ([[:$1]]) identne fail on hiljuti kustutatud.
 Vaata selle faili kustutamise ajalugu enne jätkamist.',
+'file-deleted-duplicate-notitle' => 'Selle failiga identne fail on varem kustutatud ja pealkiri on varjatud.
+Enne kui jätkad uuesti üleslaadimisega, peaksid paluma olukorda hinnata kellelgi, kes saab vaadata varjatud andmeid.',
 'uploadwarning' => 'Üleslaadimise hoiatus',
 'uploadwarning-text' => 'Muuda allpool olevat faili kirjeldust ning proovi uuesti.',
 'savefile' => 'Salvesta fail',
@@ -1919,6 +1925,7 @@ Selle turvalisust ei saa kontrollida.',
 'uploadstash-badtoken' => 'Toiming ebaõnnestus; võib-olla redigeerimisloa aegumise tõttu. Proovi uuesti.',
 'uploadstash-errclear' => 'Failide kustutamine ebaõnnestus.',
 'uploadstash-refresh' => 'Värskenda faililoendit',
+'invalid-chunk-offset' => 'Tüki vigane nihe',
 
 # img_auth script messages
 'img-auth-accessdenied' => 'Juurdepääs keelatud',
@@ -2000,13 +2007,13 @@ Samuti võid proovida siis, kui võrgukoht on vähem hõivatud.',
 'filehist-missing' => 'Fail puudub',
 'imagelinks' => 'Failikasutus',
 'linkstoimage' => 'Sellele pildile {{PLURAL:$1|viitab järgmine lehekülg|viitavad järgmised leheküljed}}:',
-'linkstoimage-more' => 'Sellele failile viitab enam kui $1 {{PLURAL:$1|lehekülg|lehekülge}}.
-Järgnevas loetelus on kuvatud ainult {{PLURAL:$1|esimene viitav lehekülg|esimesed $1 viitavat lehekülge}}.
+'linkstoimage-more' => 'Sellele failile viitab enam kui {{PLURAL:$1|üks lehekülg|$1 lehekülge}}.
+Järgmises loendis on näidatud ainult {{PLURAL:$1|esimene viitav lehekülg|esimesed $1 viitavat lehekülge}}.
 [[Special:WhatLinksHere/$2|Kogu loetelu]] on saadaval.',
 'nolinkstoimage' => 'Sellele pildile ei viita ükski lehekülg.',
 'morelinkstoimage' => 'Vaata [[Special:WhatLinksHere/$1|veel linke]], mis sellele failile viitavad.',
 'linkstoimage-redirect' => '$1 (failiümbersuunamine) $2',
-'duplicatesoffile' => '{{PLURAL:$1|Järgnev fail|Järgnevad $1 faili}} on selle faili {{PLURAL:$1|duplikaat|duplikaadid}} ([[Special:FileDuplicateSearch/$2|üksikasjad]]):',
+'duplicatesoffile' => '{{PLURAL:$1|Järgmine fail|Järgmised $1 faili}} on selle faili {{PLURAL:$1|duplikaat|duplikaadid}} ([[Special:FileDuplicateSearch/$2|üksikasjad]]):',
 'sharedupload' => 'See fail pärineb allikast $1 ning võib olla kasutusel ka teistes projektides.',
 'sharedupload-desc-there' => 'See fail pärineb kesksest failivaramust $1. Palun vaata [$2 faili kirjelduse lehekülge], et saada rohkem teavet.',
 'sharedupload-desc-here' => 'See on jagatud fail allikast $1 ja seda saab kasutada ka teistes projektides. Faili sealne [$2 kirjeldus] on kuvatud allpool.',
@@ -2178,6 +2185,7 @@ Igal real on ära toodud esimene ja teine ümbersuunamisleht ning samuti teise 
 'protectedpages' => 'Kaitstud leheküljed',
 'protectedpages-indef' => 'Ainult määramata ajani kaitstud',
 'protectedpages-cascade' => 'Ainult kaskaadkaitsega',
+'protectedpages-noredirect' => 'Peida ümbersuunamised',
 'protectedpagesempty' => 'Selliste parameetritega ei ole praegu ühtegi lehekülge kaitstud.',
 'protectedtitles' => 'Kaitstud pealkirjad',
 'protectedtitlesempty' => 'Hetkel pole ükski pealkiri kaitstud.',
@@ -2192,7 +2200,7 @@ Igal real on ära toodud esimene ja teine ümbersuunamisleht ning samuti teise 
 'ancientpages' => 'Vanimad leheküljed',
 'move' => 'Teisalda',
 'movethispage' => 'Muuda pealkirja',
-'unusedimagestext' => 'Järgnevad failid on olemas, aga pole ühelegi leheküljele lisatud.
+'unusedimagestext' => 'Järgmised failid on olemas, aga pole ühelegi leheküljele lisatud.
 Pane tähele, et teised võrgukohad võivad viidata failile otselingiga ja seega võivad siin toodud failid olla ikkagi aktiivses kasutuses.',
 'unusedcategoriestext' => 'Need kategooriad pole ühelgi leheküljel ega teises kategoorias kasutuses.',
 'notargettitle' => 'Puudub sihtlehekülg',
@@ -2452,6 +2460,7 @@ Palun kinnita, et tahad seda tõepoolest teha, et sa mõistad tagajärgi ja et s
 Selle kustutamine on keelatud, et ära hoida ekslikku {{GRAMMAR:genitive|{{SITENAME}}}} töö häirimist.',
 'delete-warning-toobig' => 'See lehekülg on pika redigeerimislooga – üle {{PLURAL:$1|ühe muudatuse|$1 muudatuse}}.
 Ettevaatust, selle kustutamine võib esile kutsuda häireid {{GRAMMAR:genitive|{{SITENAME}}}} andmebaasi töös.',
+'deleting-backlinks-warning' => "'''Hoiatus:''' Teised leheküljed viitavad leheküljele, mida oled kustutamas, või see lehekülg on kasutuses mallina.",
 
 # Rollback
 'rollback' => 'Tühista muudatused',
@@ -2549,7 +2558,8 @@ Sa saad muuta selle lehekülje kaitse staatust, kuid see ei mõjuta kaskaadkaits
 'undeletepage' => 'Kustutatud lehekülgede vaatamine ja taastamine',
 'undeletepagetitle' => "'''Kustutatud redaktsioonid leheküljest [[:$1|$1]]'''.",
 'viewdeletedpage' => 'Kustutatud lehekülgede vaatamine',
-'undeletepagetext' => '{{PLURAL:$1|Järgnev lehekülg on kustutatud|Järgnevad leheküljed on kustutatud}}, kuid arhiivis veel olemas ja taastatavad. Arhiivi sisu kustutatakse perioodiliselt.',
+'undeletepagetext' => '{{PLURAL:$1|Järgmine lehekülg|Järgmised leheküljed}} on kustutatud, kuid arhiivis veel olemas ja taastatavad.
+Arhiivi sisu võidakse perioodiliselt kustutada.',
 'undelete-fieldset-title' => 'Redaktsioonide taastamine',
 'undeleteextrahelp' => "Kogu lehe ja selle ajaloo taastamiseks jäta kõik linnukesed tühjaks ja vajuta '''''{{int:undeletebtn}}'''''.
 Et taastada valikuliselt, tee linnukesed kastidesse, mida soovid taastada ja vajuta '''''{{int:undeletebtn}}'''''.",
@@ -2750,7 +2760,7 @@ Praegu jõus olevad blokeeringud ja redigeerimiskeelud leiad [[Special:BlockList
 'range_block_disabled' => 'Administraatori õigus blokeerida IP-aadresside vahemik on ära võetud.',
 'ipb_expiry_invalid' => 'Vigane aegumise tähtaeg.',
 'ipb_expiry_temp' => 'Peidetud kasutajanime blokeeringud peavad olema alalised.',
-'ipb_hide_invalid' => 'Selle konto varjamine ei õnnestunud. Sellelt võib olla tehtud liiga palju redigeerimisi.',
+'ipb_hide_invalid' => 'Seda kontot ei saa varjata, sest sellega on tehtud üle {{PLURAL:$1|ühe|$1}} muudatuse.',
 'ipb_already_blocked' => '"$1" on juba blokeeritud.',
 'ipb-needreblock' => '$1 on juba blokeeritud.
 Kas soovid muuta blokeeringu sätteid?',
@@ -2767,6 +2777,7 @@ See kuulub aga blokeeritud IP-vahemikku $2, mille blokeeringut saab eemaldada.',
 'sorbsreason' => 'Sinu IP-aadress on {{GRAMMAR:genitive|{{SITENAME}}}} kasutatavas DNS-põhises mustas nimekirjas märgitud kui avatud proksi.',
 'sorbs_create_account_reason' => 'Sinu IP-aadress on {{GRAMMAR:genitive|{{SITENAME}}}} kasutatavas DNS-põhises mustas nimekirjas märgitud kui avatud proksi.
 Sa ei saa kasutajakontot luua.',
+'xffblockreason' => 'X-Forwarded-Fori päises esinev IP-aadress, mis kuulub kas sulle või proksiserverile, mida kasutad, on blokeeritud. Blokeerimise algne põhjus oli: $1',
 'cant-see-hidden-user' => 'Kasutaja, keda blokeerida üritad, on juba blokeeritud ning peidetud. Kuna sul pole õigust blokeerida kasutajanimesid, peites need avalikkuse eest, ei saa sa selle kasutaja blokeeringut vaadata ega muuta.',
 'ipbblocked' => 'Sa ei saa teisi blokeerida ega nende blokeeringuid eemaldada, sest oled ise blokeeritud.',
 'ipbnounblockself' => 'Sul pole lubatud enda blokeeringut eemaldada.',
@@ -3103,7 +3114,7 @@ Samuti võimaldab see resümee reale põhjenduse lisamist.',
 'spamprotectiontitle' => 'Spämmitõrjefilter',
 'spamprotectiontext' => 'Rämpspostifilter oli lehekülje, mida sa salvestada tahtsid, blokeerinud.
 See on ilmselt põhjustatud linkimisest mustas nimekirjas olevasse välisvõrgukohta.',
-'spamprotectionmatch' => 'Järgnev tekst vallandas meie rämpspostifiltri: $1',
+'spamprotectionmatch' => 'Järgmine tekst vallandas meie rämpspostifiltri: $1',
 'spambot_username' => 'MediaWiki spämmieemaldus',
 'spam_reverting' => 'Taastan viimase versiooni, mis ei sisalda linke aadressile $1.',
 'spam_blanking' => 'Kõik versioonid sisaldasid linke veebilehele $1. Lehekülg tühjendatud.',
@@ -3224,8 +3235,7 @@ Selle avamine võib su arvutit kahjustada.",
 
 # Special:NewFiles
 'newimages' => 'Uute failide galerii',
-'imagelisttext' => "
-Järgnevas loendis, mis on sorteeritud $2, on '''$1''' {{PLURAL:$1|fail|faili}}.",
+'imagelisttext' => "Allpool on {{PLURAL:$1|'''ühe''' fail|'''$1''' faili}} $2 järjestatud loend.",
 'newimages-summary' => 'Sellel erilehel on viimati üles laaditud failid.',
 'newimages-legend' => 'Filter',
 'newimages-label' => 'Failinimi (või selle osa):',
@@ -3706,11 +3716,11 @@ Võid nüüd [[Special:UserLogin|sisse logida]].',
 'confirmemail_subject' => '{{GRAMMAR:genitive|{{SITENAME}}}} e-posti aadressi kinnitamine',
 'confirmemail_body' => 'Keegi IP-aadressilt $1, ilmselt sa ise, registreeris selle e-posti aadressiga {{GRAMMAR:inessive|{{SITENAME}}}} konto "$2".
 
-Kinnitamaks, et see kasutajakonto tõepoolest kuulub sulle ning e-posti teenuste aktiveerimiseks, ava oma võrgulehitsejas järgnev link:
+Kinnitamaks, et see kasutajakonto tõepoolest kuulub sulle ning e-posti teenuste aktiveerimiseks, ava oma võrgulehitsejas järgmine link:
 
 $3
 
-Kui see *pole* sinu loodud konto, ava järgnev link kinnituse tühistamiseks:
+Kui see *pole* sinu loodud konto, ava järgmine link kinnituse tühistamiseks:
 
 $5
 
@@ -3718,11 +3728,11 @@ Kinnituskood aegub kuupäeval $4.',
 'confirmemail_body_changed' => 'Keegi IP-aadressilt $1, ilmselt sa ise,
 muutis {{GRAMMAR:inessive|{{SITENAME}}}} konto "$2" e-posti aadressiks selle aadressi.
 
-Kinnitamaks, et see konto tõepoolest kuulub sulle ja e-posti teenuste taasaktiveerimiseks, ava oma veebilehitsejas järgnev link:
+Kinnitamaks, et see konto tõepoolest kuulub sulle ja e-posti teenuste taasaktiveerimiseks, ava oma veebilehitsejas järgmine link:
 
 $3
 
-Kui see *pole* sinu konto, ava järgnev link
+Kui see *pole* sinu konto, ava järgmine link
 kinnituse tühistamiseks:
 
 $5
@@ -3744,6 +3754,8 @@ Selle kinnituskoodi aegumistähtaeg on $4.',
 
 # Scary transclusion
 'scarytranscludedisabled' => '[Vikidevaheline mallina kasutamine on keelatud]',
+'scarytranscludefailed' => '[Malli $1 hankimine ebaõnnestus]',
+'scarytranscludefailed-httpstatus' => '[Malli $1 hankimine ebaõnnestus: HTTP $2]',
 'scarytranscludetoolong' => '[URL on liiga pikk]',
 
 # Delete conflict
@@ -3849,12 +3861,22 @@ Sa võid [[Special:EditWatchlist|kasutada ka harilikku tekstiredaktorit]].',
 'version-other' => 'Muu',
 'version-mediahandlers' => 'Meediatöötlejad',
 'version-hooks' => 'Haagid',
-'version-parser-extensiontags' => 'Parseri lisamärgendid',
+'version-parser-extensiontags' => 'Parseri lisasildid',
 'version-parser-function-hooks' => 'Parserifunktsioonid',
 'version-hook-name' => 'Haagi nimi',
 'version-hook-subscribedby' => 'Tellijad',
 'version-version' => '(Versioon $1)',
-'version-license' => 'Litsents',
+'version-license' => 'MediaWiki litsents',
+'version-ext-license' => 'Litsents',
+'version-ext-colheader-name' => 'Lisa',
+'version-ext-colheader-version' => 'Versioon',
+'version-ext-colheader-license' => 'Litsents',
+'version-ext-colheader-description' => 'Kirjeldus',
+'version-ext-colheader-credits' => 'Autorid',
+'version-license-title' => 'Tarkvaralisa $1 litsents',
+'version-license-not-found' => 'Selle lisa kohta ei leitud üksikasjalikku litsentsiteavet.',
+'version-credits-title' => 'Tarkvaralisa $1 tegijad',
+'version-credits-not-found' => 'Selle lisa tegijate kohta ei leitud üksikasjalikku teavet.',
 'version-poweredby-credits' => "See viki kasutab '''[https://www.mediawiki.org/ MediaWiki]''' tarkvara. Autoriõigus © 2001–$1 $2.",
 'version-poweredby-others' => 'teised',
 'version-poweredby-translators' => 'translatewiki.net-i tõlkijad',
@@ -3966,7 +3988,7 @@ GNU Üldise Avaliku Litsentsi [{{SERVER}}{{SCRIPTPATH}}/COPYING eksemplar] peaks
 
 # HTML forms
 'htmlform-invalid-input' => 'Osaga sinu sisestatust on probleeme',
-'htmlform-select-badoption' => 'Antud number ei ole kõlbulik.',
+'htmlform-select-badoption' => 'Antud väärtus ei sobi.',
 'htmlform-int-invalid' => 'Antud väärtus ei ole täisarv.',
 'htmlform-float-invalid' => 'Määratud väärtus ei ole arvuline.',
 'htmlform-int-toolow' => 'Antud suurus on väiksem kui minimaalne $1',
@@ -4072,6 +4094,7 @@ Kui ei, kasuta allolevat lihtsat vormi. Sinu kommentaar lisatakse koos kasutajan
 'api-error-overwrite' => 'Olemasolevate failide ülekirjutamine pole lubatud.',
 'api-error-stashfailed' => 'Sisetõrge: Serveril ei õnnestunud ajutist faili talletada.',
 'api-error-publishfailed' => 'Sisetõrge: Serveril ebaõnnestus ajutise faili avaldamine.',
+'api-error-stasherror' => 'Selle faili hoidlasse üleslaadimisel ilmnes tõrge.',
 'api-error-timeout' => 'Server ei vastanud oodatud aja sees.',
 'api-error-unclassified' => 'Ilmnes teadmata tõrge.',
 'api-error-unknown-code' => 'Teadmata tõrge: "$1"',
@@ -4125,8 +4148,10 @@ Samuti hõrendab see parserifunktsioonid nagu
 'expand_templates_ok' => 'Hõrenda',
 'expand_templates_remove_comments' => 'Eemalda selgitavad märkused',
 'expand_templates_remove_nowiki' => 'Ära näita tulemuses <nowiki>-silte',
-'expand_templates_generate_xml' => 'Näita XML sõelumispuud',
+'expand_templates_generate_xml' => 'Näita XML-liigenduspuud',
 'expand_templates_generate_rawhtml' => 'Näita toor-HTMLi',
 'expand_templates_preview' => 'Eelvaade',
 
+# Unknown messages
+'uploadinvalidxml' => 'Üleslaaditud failis sisalduvat XMLi ei õnnestunud liigendada.',
 );
index dd75860..d2b01cf 100644 (file)
@@ -9,6 +9,7 @@
  *
  * @author An13sa
  * @author Bengoa
+ * @author Fitoschido
  * @author Helix84
  * @author Kaganer
  * @author Kaustubh
@@ -135,7 +136,6 @@ $messages = array(
 'tog-numberheadings' => 'Goiburukoak automatikoki zenbakitu',
 'tog-showtoolbar' => 'Aldaketen tresna-barra erakutsi',
 'tog-editondblclick' => 'Klik bikoitzaren bitartez orrialdeak aldatu',
-'tog-editsection' => 'Atalak [aldatu] loturen bitartez aldatzeko aukera gaitu',
 'tog-editsectiononrightclick' => 'Atalen izenburuetan eskuin klik eginez aldatzea gaitu',
 'tog-showtoc' => 'Edukien taula erakutsi (3 goiburukotik gorako orrialdeentzako)',
 'tog-rememberpassword' => 'Nire saioa ordenagailu honetan gorde ({{PLURAL:$1|egun baterako| $1 egunerako}} gehienez)',
@@ -491,7 +491,7 @@ Baliteke beste norbaitek ezabatu izana.',
 Ez du arrazoirik eman.',
 'no-null-revision' => 'Ezin izan da "$1" orrialdearen berrikuspen huts bat sortu',
 'badtitle' => 'Izenburu ezegokia',
-'badtitletext' => 'Eskatutako orrialde izenburua ez da baliozkoa, hutsik dago, edo gaizki lotutako hizkuntzen arteko lotura da. Baliteke izenburuetan erabili ezin den karaktereren bat izatea.',
+'badtitletext' => 'Eskatutako orri izenburua ez da baliozkoa, hutsik dago, edo gaizki lotutako hizkuntzen arteko lotura da. Baliteke izenburuetan erabili ezin den karaktereren bat edukitzea.',
 'perfcached' => 'Hurrengo datuak katxean gordeta daude eta litekeena da guztiz eguneratuta ez egotea. Gehienez {{PLURAL:$1|emaitza 1 dago|$1 emaitza daude}} eskuragarri katxean.',
 'perfcachedts' => 'Hurrengo datuak katxean daude, $1 eguneratu zen azkenekoz. {{PLURAL:$4|emaitza 1 dago|$4 emaitza daude}} eskuragarri katxean.',
 'querypage-no-updates' => 'Orrialde honen berritzeak ez dira baimentzen. Hemen dagoen data ez da zuzenean berrituko.',
@@ -988,9 +988,10 @@ $3(e)k emandako arrazoia: ''$2''",
 'last' => 'azkena',
 'page_first' => 'lehena',
 'page_last' => 'azkena',
-'histlegend' => 'Diff hautapena: hautatu alderatu nahi dituzun bi bertsioak eta beheko botoian klik egin.<br />
-Legenda: (orain) = oraingo bertsioarekiko ezberdintasuna,
-(azkena) = aurreko bertsioarekiko ezberdintasuna, t = aldaketa txikia.',
+'histlegend' => "Alderaketa hautatzea: marka itzazu alderatu nahi dituzun bi bertsioak, eta saka ezazu «Enter» edo klika ezazu beheko botoia.<br />
+Azalpenak: '''({{int:cur}})''' = oraingo bertsioarekiko aldeak,
+'''({{int:last}})''' = aurreko bertsioarekiko aldeak, 
+'''{{int:minoreditletter}}''' = aldaketa txikia.",
 'history-fieldset-title' => 'Historia erakutsi',
 'history-show-deleted' => 'Ezabatuak soilik',
 'histfirst' => 'zaharrena',
@@ -1131,10 +1132,10 @@ Kontura zaitez nabigazio loturek, zutabea ezabatu dezakela.',
 'mergelogpagetext' => 'Jarraian dagoen zerrendak orrialde baten historiatik beste batera egindako azken bateratzeak erakusten ditu.',
 
 # Diffs
-'history-title' => '"$1" orrialdearen historia berrikuspena',
+'history-title' => '«$1» orrialdearen historia berrikuspena',
 'difference-title' => '«$1»: berrikuspenen arteko aldeak',
-'difference-title-multipage' => '"$1" eta "$2" orrialdeen arteko ezberditasunak',
-'difference-multipage' => '(Orrialdeen arteko ezberdintasunak)',
+'difference-title-multipage' => '«$1» eta «$2» orrien arteko aldeak',
+'difference-multipage' => '(Orrien arteko aldeak)',
 'lineno' => '$1. lerroa:',
 'compareselectedversions' => 'Hautatutako bertsioak alderatu',
 'showhideselectedversions' => 'Erakutsi/ezkutatu aukeratutako berrikuspenak',
@@ -1523,7 +1524,7 @@ Informazio hau publikoa da.',
 'recentchangeslinked' => 'Lotutako orrietako aldaketak',
 'recentchangeslinked-feed' => 'Lotutako orrietako aldaketak',
 'recentchangeslinked-toolbox' => 'Lotutako orrietako aldaketak',
-'recentchangeslinked-title' => '"$1"(e)kin harremanetan dauden aldaketak',
+'recentchangeslinked-title' => '«$1»(e)kin harremanetan dauden aldaketak',
 'recentchangeslinked-summary' => "Zerrenda honetan zehazturiko orrialde bati (edo kategoria berezi bateko azkeneko kideei) lotura duten orrietan eginiko azken aldaketak agertzen dira.
 [[Special:Watchlist|Zurre jarraitze zerrenda]]n agertzen diren orrialdeak '''beltze'''z agertzen dira.",
 'recentchangeslinked-page' => 'Orriaren izena:',
@@ -1992,7 +1993,8 @@ Erregistro mota, erabiltzailearen izena edota orrialdearen izena iragaziz bistar
 'allinnamespace' => 'Orrialde guztiak ($1 izen-tartea)',
 'allpagessubmit' => 'Joan',
 'allpagesprefix' => 'Aurrizki hau duten orrialdeak bistaratu:',
-'allpagesbadtitle' => 'Orrialdearen izena baliogabekoa da edo interwiki edo hizkuntzen arteko aurrizkia dauka. Izenburuetan erabili ezin daitezkeen karaktere bat edo gehiago izan ditzake.',
+'allpagesbadtitle' => 'Orriaren izena baliogabea da, edo interwiki edo hizkuntzen arteko aurrizkia dauka. 
+Baliteke izenburuetan erabili ezin daitekeen karaktere bat edo gehiago edukitzea.',
 'allpages-bad-ns' => '{{SITENAME}}(e)k ez dauka "$1" izeneko izen-tarterik.',
 'allpages-hide-redirects' => 'Birzuzenketak ezkutatu',
 
@@ -2237,7 +2239,7 @@ Ikus [[Special:ProtectedPages|orri babestuen zerrenda]], orain indarrean dauden
 'modifiedarticleprotection' => '"[[$1]]"(r)en babes maila aldatu da',
 'unprotectedarticle' => '"[[$1]]"-(r)i babesa kendu zaio',
 'movedarticleprotection' => 'babes hobespenak "[[$2]]"tik "[[$1]]"(e)ra mugitu dira',
-'protect-title' => '"$1" babesten',
+'protect-title' => '«$1» babesten',
 'protect-title-notallowed' => '"$1"en babes maila ikusi',
 'prot_1movedto2' => '$1 izenburua $2(r)engatik aldatu da',
 'protect-badnamespace-title' => 'Izen-tarte ez babesgarria',
@@ -2681,7 +2683,7 @@ $2',
 'importnotext' => 'Hutsik dago edo testurik gabe',
 'importsuccess' => 'Inportazioa burutu da!',
 'importhistoryconflict' => 'Gatazka sortzen ari den berrikuspen historia dago (baliteke orrialdea lehenago inportatu izana)',
-'importnosources' => 'Ez dago wikien arteko inportazio iturririk eta historialak zuzenean igotzea ezgaituta dago.',
+'importnosources' => 'Ez dago wikien arteko inportazio iturririk definituta, eta historialak zuzenean igotzea ezgaituta dago.',
 'importnofile' => 'Ez da inportazio fitxategirik igo.',
 'importuploaderrorsize' => 'Inportatutako artxiboaren igoera-porrota.
 Artxiboa onartutako igoera-tamaina baino handiagoa da.',
@@ -2702,7 +2704,7 @@ Fitxategiaren atal bat baino ez zen igo.',
 'import-error-invalid' => '"$1" orrialdea ez da inportatu izena ez delako baliagarria.',
 'import-options-wrong' => 'Aukera {{PLURAL:$2|ez-egokia|ez-egokiak}}:<nowiki>$1</nowiki>',
 'import-rootpage-invalid' => 'Emandako jatorri orrialdea izenburu ez-baliagarria da.',
-'import-rootpage-nosubpage' => 'Jatorri orrialdearen "$1" izen-tarteak ez du baimentzen azpi-orrialderik.',
+'import-rootpage-nosubpage' => 'Jatorri orrialdearen «$1» izen-tarteak ez du baimentzen azpi-orrialderik.',
 
 # Import log
 'importlogpage' => 'Inportazio erregistroa',
@@ -2780,7 +2782,7 @@ Fitxategiaren atal bat baino ez zen igo.',
 'tooltip-save' => 'Zure aldaketak gorde',
 'tooltip-preview' => 'Zure aldaketak aurreikusi, mesedez gorde aurretik erabili!',
 'tooltip-diff' => 'Testuari egindako aldaketak erakutsi.',
-'tooltip-compareselectedversions' => 'Orrialde honen bi hautatutako bertsioen arteko ezberdintasunak ikusi.',
+'tooltip-compareselectedversions' => 'Ikusi orri honen bi bertsio hautatuen arteko aldeak.',
 'tooltip-watch' => 'Orrialde hau zure segimendu zerrendan gehitu',
 'tooltip-watchlistedit-normal-submit' => 'Izenburuak kendu',
 'tooltip-watchlistedit-raw-submit' => 'Jarraipen zerrenda gaurkotu',
@@ -3587,7 +3589,7 @@ Halaber [[Special:EditWatchlist|aldatzaile estandarra]] erabil dezakezu.',
 
 # Special:SpecialPages
 'specialpages' => 'Orri bereziak',
-'specialpages-note-top' => 'Legenda',
+'specialpages-note-top' => 'Azalpenak',
 'specialpages-note' => '* Orri berezi arruntak.
 * <strong class="mw-specialpagerestricted">Mugatutako orri bereziak.</strong>',
 'specialpages-group-maintenance' => 'Mantentze-oharrak',
index b1e1676..4cbf6cd 100644 (file)
@@ -463,7 +463,6 @@ $messages = array(
 'tog-numberheadings' => 'شماره‌گذاری خودکار عنوان‌ها',
 'tog-showtoolbar' => 'نوار ابزار جعبهٔ ویرایش نمایش یابد',
 'tog-editondblclick' => 'ویرایش صفحه‌ها با دوکلیک (نیازمند جاوااسکریپت)',
-'tog-editsection' => 'ویرایش بخش‌ها از طریق پیوندهای [ویرایش] فعال باشد',
 'tog-editsectiononrightclick' => 'امکان ویرایش بخش‌ها با کلیک راست روی عنوان‌های بخش (نیازمند جاوااسکریپت)',
 'tog-showtoc' => 'فهرست مندرجات نمایش یابد (برای صفحه‌های دارای بیش از ۳ عنوان)',
 'tog-rememberpassword' => 'گذرواژهٔ من (حداکثر $1 {{PLURAL:$1|روز|روز}}) در این مرورگر به خاطر سپرده شود',
@@ -1303,6 +1302,8 @@ $2
 'content-not-allowed-here' => 'محتوای «$1» در صفحهٔ [[$2]] مجاز نیست',
 'editwarning-warning' => 'خروج از این صفحه ممکن است باعث از دست رفتن هرچه نوشته‌اید شود.
 اگر شما با نام کاربری وارد شده‌اید می‌توانید این هشدار را در بخش «در حال ویرایش» ترجیحاتتان بیابید.',
+'editpage-notsupportedcontentformat-title' => 'فرمت محتوا پشتیبانی نشده',
+'editpage-notsupportedcontentformat-text' => 'فرمت محتوای $1 توسط مدل محتوای $2 پشتیبانی نشده‌است.',
 
 # Content models
 'content-model-wikitext' => 'ویکی‌متن',
@@ -1551,6 +1552,7 @@ $1",
 'search-result-score' => 'ارتباط: $1٪',
 'search-redirect' => '(تغییرمسیر $1)',
 'search-section' => '(بخش $1)',
+'search-file-match' => '(تشابه محتوی پرونده)',
 'search-suggest' => 'آیا منظورتان این بود: $1',
 'search-interwiki-caption' => 'پروژه‌های خواهر',
 'search-interwiki-default' => '$1 نتیجه:',
@@ -2662,7 +2664,7 @@ $PAGEINTRO $NEWPAGE
 'delete-warning-toobig' => 'این صفحه تاریخچهٔ ویرایشی بزرگی دارد، که شامل بیش از $1 {{PLURAL:$1|نسخه|نسخه}} است.
 حذف آن ممکن است که عملکرد پایگاه دادهٔ {{SITENAME}} را مختل کند;
 با احتیاط ادامه دهید.',
-'deleting-backlinks-warning' => "''' هشدار:''' صفحات دیگر پیوند به صفحه شما  درباره حذف هستند.",
+'deleting-backlinks-warning' => "''' هشدار:''' صفحات دیگر پیوند یا تراگنجایش به صفحه شما  برای حذف هستند.",
 
 # Rollback
 'rollback' => 'واگردانی ویرایش‌ها',
@@ -2970,7 +2972,7 @@ $1',
 'range_block_disabled' => 'بستن یک بازه توسط مدیران غیر فعال است.',
 'ipb_expiry_invalid' => 'زمان سرآمدن نامعتبر.',
 'ipb_expiry_temp' => 'قطع دسترسی کاربرهای پهنان باید همیشگی باشد.',
-'ipb_hide_invalid' => 'Ù\86اتÙ\88اÙ\86 Ø§Ø² Ù\81رÙ\88Ù\86شاÙ\86دÙ\86 Ø§Û\8cÙ\86 Ø­Ø³Ø§Ø¨Ø\9b Ø´Ø§Û\8cد Ù\88Û\8cراÛ\8cØ´â\80\8cÙ\87اÛ\8c Ø²Û\8cادÛ\8c دارد.',
+'ipb_hide_invalid' => 'Ù\82ادر Ø¨Ù\87 Ø³Ø±Ú©Ù\88ب Ø§Û\8cÙ\86 Ø­Ø³Ø§Ø¨ Ù\86Û\8cست; Ø§Û\8cÙ\86 Ø¨Û\8cشتر Ø§Ø² {{PLURAL:$1|Û\8cÚ© Ù\88Û\8cراÛ\8cØ´|$1 Ù\88Û\8cراÛ\8cØ´â\80\8cÙ\87ا}} دارد.',
 'ipb_already_blocked' => '«$1» همین الان هم بسته‌است',
 'ipb-needreblock' => 'دسترسی $1 از قبل بسته است. آیا می‌خواهید تنظیمات آن را تغییر دهید؟',
 'ipb-otherblocks-header' => 'سایر {{PLURAL:$1|قطع دسترسی‌ها|قطع دسترسی‌ها}}',
@@ -4436,4 +4438,6 @@ $5
 'expand_templates_generate_rawhtml' => 'نمایش اچ‌تی‌ام‌ال خام',
 'expand_templates_preview' => 'پیش‌نمایش',
 
+# Unknown messages
+'uploadinvalidxml' => 'XML در پروندهٔ بارگذاری‌شده نمی‌تواند تجزیه شود.',
 );
index e0fa8d5..bad61d4 100644 (file)
@@ -330,7 +330,6 @@ $messages = array(
 'tog-numberheadings' => 'Numeroi otsikot automaattisesti',
 'tog-showtoolbar' => 'Näytä työkalupalkki',
 'tog-editondblclick' => 'Muokkaa sivuja kaksoisnapsautuksella',
-'tog-editsection' => 'Näytä muokkauslinkit jokaisen osion yläpuolella',
 'tog-editsectiononrightclick' => 'Muokkaa osioita napsauttamalla osion otsikkoa hiiren oikealla painikkeella',
 'tog-showtoc' => 'Näytä sisällysluettelo (sivuilla, joilla on yli kolme otsikkoa)',
 'tog-rememberpassword' => 'Muista kirjautuminen tässä selaimessa (enintään $1 {{PLURAL:$1|päivä|päivää}})',
@@ -1134,6 +1133,7 @@ Se on jo olemassa.',
 'content-not-allowed-here' => 'Sivun [[$2]] sisältö ei voi olla tyyppiä $1.',
 'editwarning-warning' => 'Tältä sivulta poistuminen saattaa aiheuttaa kaikkien tekemiesi muutosten katoamisen.
 Jos olet kirjautuneena sisään, voit poistaa tämän varoituksen käytöstä asetuksissa osiossa "Muokkaus".',
+'editpage-notsupportedcontentformat-title' => 'Sisällön muotoa ei tueta',
 
 # Content models
 'content-model-wikitext' => 'wikiteksti',
index 195d3dc..dcc9b04 100644 (file)
@@ -62,6 +62,7 @@
  * @author Louperivois
  * @author Ltrlg
  * @author Lucyin
+ * @author Manohisoa
  * @author Mattho69
  * @author McDutchie
  * @author Meithal
@@ -426,7 +427,6 @@ $messages = array(
 'tog-numberheadings' => 'Numéroter automatiquement les titres de section',
 'tog-showtoolbar' => "Montrer la barre d'outils de modification (nécessite JavaScript)",
 'tog-editondblclick' => 'Modifier des pages sur double-clic (nécessite JavaScript)',
-'tog-editsection' => 'Activer les modifications de sections grâce aux liens « [modifier] »',
 'tog-editsectiononrightclick' => 'Activer la modification de sections par clic droit sur les titres (nécessite JavaScript)',
 'tog-showtoc' => 'Afficher la table des matières (pour les pages ayant plus de 3 sections)',
 'tog-rememberpassword' => 'Se souvenir de mon identification avec ce navigateur (au maximum $1 {{PLURAL:$1|jour|jours}})',
@@ -686,8 +686,8 @@ $1",
 
 'ok' => 'Valider',
 'retrievedfrom' => 'Récupérée de « $1 »',
-'youhavenewmessages' => 'Vous avez $1 ($2).',
-'youhavenewmessagesfromusers' => "Vous avez $1 {{PLURAL:$3|d'un autre utilisateur|de $3 autres utilisateurs}} ($2).",
+'youhavenewmessages' => '{{PLURAL:$3|Vous avez}} $1 ($2).',
+'youhavenewmessagesfromusers' => "{{PLURAL:$4|Vous avez}} $1 {{PLURAL:$3|d'un autre utilisateur|de $3 autres utilisateurs}} ($2).",
 'youhavenewmessagesmanyusers' => 'Vous avez $1 de nombreux utilisateurs ($2).',
 'newmessageslinkplural' => '{{PLURAL:$1|un nouveau message|de nouveaux messages}}',
 'newmessagesdifflinkplural' => '{{PLURAL:$1|dernière modification|dernières modifications}}',
@@ -973,6 +973,8 @@ Si vous décidez de le fournir, il sera utilisé pour attribuer à l’utilisate
 'retypenew' => 'Confirmer le nouveau mot de passe :',
 'resetpass_submit' => 'Changer le mot de passe et se connecter',
 'changepassword-success' => 'Votre mot de passe a été changé avec succès !',
+'changepassword-throttled' => 'Vous avez fait trop de tentatives de connexion récemment.
+Veuillez attendre $1 avant de réessayer.',
 'resetpass_forbidden' => 'Les mots de passe ne peuvent pas être changés',
 'resetpass-no-info' => 'Vous devez être connecté(e) pour avoir accès à cette page.',
 'resetpass-submit-loggedin' => 'Changer de mot de passe',
@@ -1022,6 +1024,8 @@ Mot de passe temporaire : $2",
 'changeemail-password' => 'Votre mot de passe sur {{SITENAME}} :',
 'changeemail-submit' => 'Changer l’adresse de courriel',
 'changeemail-cancel' => 'Annuler',
+'changeemail-throttled' => 'Vous avez fait trop de tentatives de connexion.
+Veuillez attendre $1 avant de réessayer.',
 
 # Special:ResetTokens
 'resettokens' => 'Réinitialiser les jetons',
@@ -1118,11 +1122,11 @@ Elle a peut-être été déplacée ou supprimée depuis que vous avez lu cette p
 'accmailtext' => "Un mot de passe généré aléatoirement pour [[User talk:$1|$1]] a été envoyé à $2.
 Il peut être modifié sur la page ''[[Special:ChangePassword|Changement de mot de passe]]'' après s’être connecté{{GENDER:$1||e|(e)}}.",
 'newarticle' => '(Nouveau)',
-'newarticletext' => "Vous avez suivi un lien vers une page qui n'existe pas encore ou qui a été [{{fullurl:Special:Log|type=delete&page={{FULLPAGENAMEE}}}} effacée].
-Pour créer cette page, entrez votre texte dans la boîte ci-dessous (vous pouvez consulter [[{{MediaWiki:Helppage}}|la page d'aide]] pour plus d'informations).
+'newarticletext' => "Vous avez suivi un lien vers une page qui n’existe pas encore ou qui a été [{{fullurl:Special:Log|type=delete&page={{FULLPAGENAMEE}}}} effacée]. 
+Pour créer cette page, entrez votre texte dans la boîte ci-après (vous pouvez consulter [[{{MediaWiki:Helppage}}|la page d’aide]] pour plus d’informations). 
 Si vous êtes arrivé{{GENDER:||e|(e)}} ici par erreur, cliquez sur le bouton '''retour''' de votre navigateur.",
 'anontalkpagetext' => "---- ''Vous êtes sur la page de discussion d'un utilisateur anonyme qui n'a pas encore créé de compte ou qui n'en utilise pas. Pour cette raison, nous devons utiliser son adresse IP pour l'identifier. Une adresse IP peut être partagée par plusieurs utilisateurs. Si vous êtes un{{GENDER:||e|}} utilisat{{GENDER:|eur|rice|eur}} anonyme et si vous constatez que des commentaires qui ne vous concernent pas vous ont été adressés, vous pouvez [[Special:UserLogin/signup|créer un compte]] ou [[Special:UserLogin|vous connecter]] afin d'éviter toute confusion future avec d'autres contributeurs anonymes.''",
-'noarticletext' => 'Il n\'y a pour l\'instant aucun texte sur cette page.
+'noarticletext' => 'Il n’y a pour l’instant aucun texte sur cette page.
 Vous pouvez [[Special:Search/{{PAGENAME}}|lancer une recherche sur ce titre]] dans les autres pages,
 <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} rechercher dans les opérations liées]
 ou [{{fullurl:{{FULLPAGENAME}}|action=edit}} créer cette page]</span>.',
@@ -1239,6 +1243,8 @@ Elle existe déjà.",
 'content-not-allowed-here' => 'Le contenu « $1 » n’est pas autorisé sur la page [[$2]]',
 'editwarning-warning' => 'Quitter cette page vous fera perdre toutes les modifications que vous avez faites.
 Si vous êtes connecté, vous pouvez désactiver cet avertissement dans la section « Modification » de vos préférences.',
+'editpage-notsupportedcontentformat-title' => 'Format de contenu non pris en charge',
+'editpage-notsupportedcontentformat-text' => "Le format de contenu $1 n'est pas pris en charge par le modèle de contenu $2 .",
 
 # Content models
 'content-model-wikitext' => 'wikitexte',
@@ -1467,8 +1473,8 @@ Vous pouvez trouver des détails dans le [{{fullurl:{{#Special:Log}}/delete|page
 'nextn-title' => '$1 {{PLURAL:$1|résultat suivant|résultats suivants}}',
 'shown-title' => 'Afficher $1 résultat{{PLURAL:$1||s}} par page',
 'viewprevnext' => 'Voir ($1 {{int:pipe-separator}} $2) ($3).',
-'searchmenu-exists' => "'''Il existe une page nommée « [[:$1]] » sur ce wiki'''",
-'searchmenu-new' => "'''Créer la page « [[:$1|$1]] » sur ce wiki !'''",
+'searchmenu-exists' => "'''Il existe une page nommée « [[:$1]] » sur ce wiki.''' {{PLURAL:$2|0=|Voyez également les autres résultats de votre recherche.}}",
+'searchmenu-new' => "'''Créer la page « [[:$1|$1]] » sur ce wiki !''' {{PLURAL:$2|0=|Voyez également la page trouvée avec votre recherche.|Voyez également les résultats de votre recherche.}}",
 'searchprofile-articles' => 'Pages de contenu',
 'searchprofile-project' => "Pages d'aide et de projet",
 'searchprofile-images' => 'Multimédia',
@@ -1484,6 +1490,7 @@ Vous pouvez trouver des détails dans le [{{fullurl:{{#Special:Log}}/delete|page
 'search-result-score' => 'Pertinence : $1%',
 'search-redirect' => '(redirection depuis $1)',
 'search-section' => '(section $1)',
+'search-file-match' => '(correspond au contenu du fichier)',
 'search-suggest' => 'Essayez avec cette orthographe : $1',
 'search-interwiki-caption' => 'Projets frères',
 'search-interwiki-default' => 'Résultats sur $1 :',
@@ -2593,7 +2600,7 @@ La suppression de telles pages a été restreinte pour prévenir des perturbatio
 'delete-warning-toobig' => "Cette page possède un historique important de modifications, dépassant $1 version{{PLURAL:$1||s}}.
 La supprimer peut perturber le fonctionnement de la base de données de {{SITENAME}} ;
 veuiller ne procéder qu'avec prudence.",
-'deleting-backlinks-warning' => "'''Attention :''' D’autres pages ont un lien vers la page que vous allez supprimer.",
+'deleting-backlinks-warning' => "'''Attention :''' D’autres pages ont un lien vers ou incorporent la page que vous allez supprimer.",
 
 # Rollback
 'rollback' => 'Révoquer les modifications',
@@ -2897,7 +2904,7 @@ Consultez la [[Special:BlockList|liste des blocages]] pour voir les bannissement
 'range_block_disabled' => 'Le droit administrateur de créer des blocages de plages IP est désactivé.',
 'ipb_expiry_invalid' => "Durée d'expiration incorrecte.",
 'ipb_expiry_temp' => "Les blocages de noms d'utilisateurs cachés doivent être permanents.",
-'ipb_hide_invalid' => 'Impossible de supprimer ce compte ; il semble avoir trop de modifications.',
+'ipb_hide_invalid' => 'Impossible de supprimer ce compte ; il semble avoir plus {{PLURAL:$1|d’une modification|de $1 modifications}}.',
 'ipb_already_blocked' => '« $1 » est déjà bloqué',
 'ipb-needreblock' => '$1 est déjà bloqué. Voulez-vous modifier les paramètres ?',
 'ipb-otherblocks-header' => '{{PLURAL:$1|Autre blocage|Autres blocages}}',
@@ -4104,7 +4111,10 @@ Vous pouvez aussi [[Special:EditWatchlist|utiliser l'éditeur normal]].",
 'version-version' => '(version $1)',
 'version-license' => 'Licence MediaWiki',
 'version-ext-license' => 'Licence',
+'version-ext-colheader-name' => 'Extension',
+'version-ext-colheader-version' => 'Version',
 'version-ext-colheader-license' => 'Licence',
+'version-ext-colheader-description' => 'Description',
 'version-ext-colheader-credits' => 'Auteurs',
 'version-license-title' => 'Licence pour $1',
 'version-license-not-found' => "Aucune information détaillée de la licence n'a été trouvée pour cette extension.",
@@ -4388,4 +4398,6 @@ En fait, elle réalise l'expansion de pratiquement tout ce qui est encadré par
 'expand_templates_generate_rawhtml' => 'Afficher le HTML brut',
 'expand_templates_preview' => 'Aperçu du rendu',
 
+# Unknown messages
+'uploadinvalidxml' => 'Le XML dans le fichier importé n’a pas pu être analysé.',
 );
index 90f3556..8991d02 100644 (file)
@@ -322,7 +322,6 @@ $messages = array(
 'tog-numberheadings' => 'Numerotar ôtomaticament los titros de sèccion',
 'tog-showtoolbar' => 'Montrar la bârra d’outils de changement (at fôta de JavaScript)',
 'tog-editondblclick' => 'Changiér des pâges sur doblo-clic (at fôta de JavaScript)',
-'tog-editsection' => 'Activar lo changement de sèccions avouéc los lims « [changiér] »',
 'tog-editsectiononrightclick' => 'Activar lo changement de sèccions per clic drêt sur lors titros (at fôta de JavaScript)',
 'tog-showtoc' => 'Montrar la trâbla de les matiéres (por les pâges qu’ant més de 3 sèccions)',
 'tog-rememberpassword' => 'Sè rapelar de mon contresegno sur ceti navigator (por lo més $1 jorn{{PLURAL:$1||s}})',
index a65e0f1..1328f19 100644 (file)
@@ -31,7 +31,6 @@ $messages = array(
 'tog-numberheadings' => 'Auerskraften automaatisk numeriare',
 'tog-showtoolbar' => 'Werktjüch tu bewerkin wise',
 'tog-editondblclick' => 'Sidjen mä dobelklik bewerke',
-'tog-editsection' => "Ferwisangen tu't bewerkin faan enkelt kirwer",
 'tog-editsectiononrightclick' => 'Enkelt kirwer mä rochtsklik bewerke',
 'tog-showtoc' => 'Üüb sidjen mä muar üs trii auerskraften en indeks uunwise',
 'tog-rememberpassword' => 'Üüb diheer reegner üüb düür uunmelde (maksimaal för $1 {{PLURAL:$1|dai|daar}})',
@@ -852,6 +851,8 @@ Uun't strik- an fersküüw-logbuk oner stäänt muar diartu.",
 'content-not-allowed-here' => '„$1“ mut ei skrewen wurd üüb sidj [[$2]]',
 'editwarning-warning' => 'Wan dü detheer sidj slotst, kön feranrangen ferleesen gung.
 Üs uunmeldet brüker könst dü detheer wäärnang bi din iinstelangen oner „Bewerke“ wechknipse.',
+'editpage-notsupportedcontentformat-title' => 'Detdiar formoot gongt ei.',
+'editpage-notsupportedcontentformat-text' => 'Det formoot $1 gongt ei mä det model $2.',
 
 # Content models
 'content-model-wikitext' => 'wikitekst',
@@ -1368,10 +1369,10 @@ Arken koon det lees.',
 'action-createtalk' => 'diskusjuunssidjen maage',
 'action-createaccount' => 'jüdeer brükerkonto mååge',
 'action-minoredit' => 'detdiar feranrang üs letj kääntiakne',
-'action-move' => 'jüdeer sid ferschüwe',
-'action-move-subpages' => 'jüdeer sid än unerside ferschüwe',
+'action-move' => 'an fersküüw det diar sidj',
+'action-move-subpages' => 'an fersküüw detdiar sidj mä hör onersidjen',
 'action-move-rootuserpages' => 'hood-brükersidj fersküüw',
-'action-movefile' => 'jüdeer sid ferschüwe',
+'action-movefile' => 'an fersküüw detdiar datei',
 'action-upload' => 'Datein huuchschüür',
 'action-reupload' => 'det datei auerskriiw',
 'action-reupload-shared' => 'det datei auerskriiw, diar uun en gemiansoom archiif leit',
@@ -2500,7 +2501,7 @@ Fertel det dan ISP of dan süsteemsiinst. Eeben proxys stel det seekerhaid uun f
 
 # Move page
 'move-page' => 'Fersküüw $1',
-'move-page-legend' => 'Sid ferschüwe',
+'move-page-legend' => 'Sidj fersküüw',
 'movepagetext' => "Mä detdiar formulaar könst dü en sidj mä aal sin werjuunen amnääm.
 Di ual tiitel woort üüb di nei widjerfeerd.
 Dü könst widjerfeerangen, diar üüb di ual tiitel wise, automaatisk üüb di nei tiitel widjerfeer läät.
@@ -3535,7 +3536,7 @@ Dü könst uk det [[Special:EditWatchlist|normool sidj]] tu bewerkin nem.",
 'version-parser-function-hooks' => 'Parser function hooks',
 'version-hook-name' => 'Hook nööm',
 'version-hook-subscribedby' => 'Aprepen faan',
-'version-version' => '(Werjuun $1)',
+'version-version' => '($1)',
 'version-license' => 'MediaWiki-lisens',
 'version-ext-license' => 'Lisens',
 'version-ext-colheader-name' => 'Ütjwidjang',
index 4230691..1891fbc 100644 (file)
@@ -295,7 +295,6 @@ $messages = array(
 'tog-numberheadings' => 'Numerar automaticamente as cabeceiras',
 'tog-showtoolbar' => 'Mostrar a barra de ferramentas de edición',
 'tog-editondblclick' => 'Editar as páxinas logo de facer dobre clic',
-'tog-editsection' => 'Permitir a edición de seccións mediante as ligazóns "[editar]"',
 'tog-editsectiononrightclick' => 'Permitir a edición de seccións premendo co botón dereito nos títulos das seccións',
 'tog-showtoc' => 'Mostrar o índice (para as páxinas con máis de tres cabeceiras)',
 'tog-rememberpassword' => 'Lembrar o meu contrasinal neste navegador (ata $1 {{PLURAL:$1|día|días}})',
@@ -1136,6 +1135,8 @@ Esta xa existe.',
 'content-not-allowed-here' => 'O contido "$1" non está permitido na páxina "[[$2]]"',
 'editwarning-warning' => 'Deixar esta páxina pode causar a perda de calquera cambio feito.
 Se accedeu ao sistema, pode desactivar esta mensaxe de advertencia na sección "Edición" das súas preferencias.',
+'editpage-notsupportedcontentformat-title' => 'Formato de contido non admitido',
+'editpage-notsupportedcontentformat-text' => 'O formato de contido $1 non é compatible co modelo de contido  $2.',
 
 # Content models
 'content-model-wikitext' => 'texto wiki',
@@ -1178,9 +1179,9 @@ Comprobe a comparación que aparece a continuación para confirmar que isto é o
 'cantcreateaccount-text' => "A creación de contas desde este enderezo IP ('''$1''') foi bloqueada por [[User:$3|$3]].
 
 A razón dada por $3 foi ''$2''",
-'cantcreateaccount-range-text' => "A creación de contas dende direccións IP no rango '''$1''', e que inclúe á súa dirección IP ('''$4'''), foi bloqueada polo usuario [[User:$3|$3]].
+'cantcreateaccount-range-text' => "O usuario [[User:$3|$3]] bloqueou a creación de contas desde enderezos IP no rango '''$1''', no que se inclúe o seu enderezo IP ('''$4''').
 
-A razón dada por $3 foi ''$2''.",
+A razón que deu $3 foi ''$2''.",
 
 # History pages
 'viewpagelogs' => 'Ver os rexistros desta páxina',
@@ -1841,6 +1842,7 @@ Se aínda quere cargar o seu ficheiro, volva atrás e use outro nome.
 [[File:$1|thumb|center|$1]]',
 'file-exists-duplicate' => 'Este ficheiro é un duplicado {{PLURAL:$1|do seguinte|dos seguintes}}:',
 'file-deleted-duplicate' => 'Un ficheiro idéntico a este ("[[:$1]]") foi borrado previamente. Debería comprobar o historial de borrados do ficheiro antes de proceder a cargalo de novo.',
+'file-deleted-duplicate-notitle' => 'Un ficheiro idéntico a este foi borrado con anterioridade, e o título foi suprimido. Debería contactar con alguén capaz de ver os datos de ficheiros borrados para que revise esta situación antes de voltar a subilo de novo.',
 'uploadwarning' => 'Advertencia ao cargar o ficheiro',
 'uploadwarning-text' => 'Por favor, modifique a descrición do ficheiro e inténteo de novo.',
 'savefile' => 'Gardar o ficheiro',
@@ -2506,7 +2508,7 @@ Limitouse a eliminación destas páxinas para previr problemas de funcionamento
 'delete-warning-toobig' => 'Esta páxina conta cun historial de edicións longo, de máis {{PLURAL:$1|dunha revisión|de $1 revisións}}.
 Ao eliminala pódense provocar problemas de funcionamento nas operacións da base de datos de {{SITENAME}};
 proceda con coidado.',
-'deleting-backlinks-warning' => "'''Atención:''' Outras páxinas ligan á páxina que vostede quere borrar.",
+'deleting-backlinks-warning' => "'''Atención:''' Outras páxinas conteñen unha ligazón ou unha transclusión da páxina que está a piques de borrar.",
 
 # Rollback
 'rollback' => 'Reverter as edicións',
@@ -2744,6 +2746,7 @@ Explique a razón específica do bloqueo (por exemplo, citando as páxinas concr
 Olle a [[Special:BlockList|lista de bloqueos]] para revisalo.',
 'ipb-blockingself' => 'Está a piques de se bloquear! Está seguro de querer facelo?',
 'ipb-confirmhideuser' => 'Está a piques de bloquear un usuario coa opción "agochar o usuario" activada. Isto suprime o nome de usuario de todas as listas e entradas de rexistro. Está seguro de querer facelo?',
+'ipb-confirmaction' => 'Se está seguro de que quere facelo realmente, por favor marque o campo "{{int:ipb-confirm}}" abaixo.',
 'ipb-edit-dropdown' => 'Editar os motivos de bloqueo',
 'ipb-unblock-addr' => 'Desbloquear a $1',
 'ipb-unblock' => 'Desbloquear un usuario ou enderezo IP',
@@ -3938,8 +3941,18 @@ Tamén pode [[Special:EditWatchlist|empregar o editor normal]].',
 'version-parser-function-hooks' => 'Asociadores da función do analizador',
 'version-hook-name' => 'Nome do asociador',
 'version-hook-subscribedby' => 'Subscrito por',
-'version-version' => '(Versión $1)',
-'version-license' => 'Licenza',
+'version-version' => '($1)',
+'version-license' => 'Licenza de MediaWiki',
+'version-ext-license' => 'Licenza',
+'version-ext-colheader-name' => 'Extensión',
+'version-ext-colheader-version' => 'Versión',
+'version-ext-colheader-license' => 'Licenza',
+'version-ext-colheader-description' => 'Descrición',
+'version-ext-colheader-credits' => 'Autores',
+'version-license-title' => 'Licenza para $1',
+'version-license-not-found' => 'Non se atopou información detallada de licenza para esta extensión.',
+'version-credits-title' => 'Receñecemento para $1',
+'version-credits-not-found' => 'Non se atopou información detallada de recoñecemento para esta extensión.',
 'version-poweredby-credits' => "Este wiki está desenvolvido por '''[https://www.mediawiki.org/wiki/MediaWiki/gl MediaWiki]''', dereitos de autoría © 2001-$1 $2.",
 'version-poweredby-others' => 'outros',
 'version-poweredby-translators' => 'os tradutores de translatewiki.net',
@@ -4160,7 +4173,7 @@ En caso contrario, pode empregar o formulario sinxelo inferior. O seu comentario
 'api-error-overwrite' => 'Non está permitido sobrescribir un ficheiro existente.',
 'api-error-stashfailed' => 'Erro interno: O servidor non puido almacenar o ficheiro temporal.',
 'api-error-publishfailed' => 'Erro interno: O servidor non puido publicar o ficheiro temporal.',
-'api-error-stasherror' => 'Houbo un erro mentras se subía o ficheiro a stash.',
+'api-error-stasherror' => 'Houbo un erro ao subir o ficheiro ao depósito.',
 'api-error-timeout' => 'O servidor non respondeu no tempo esperado.',
 'api-error-unclassified' => 'Houbo un erro descoñecido.',
 'api-error-unknown-code' => 'Erro descoñecido: "$1"',
@@ -4218,4 +4231,6 @@ De feito, expande case calquera cousa entre dúas chaves.',
 'expand_templates_generate_rawhtml' => 'Mostrar o HTML en bruto',
 'expand_templates_preview' => 'Vista previa',
 
+# Unknown messages
+'uploadinvalidxml' => 'O XML do ficheiro cargado non pode ser interpretado.',
 );
index 18e996a..974bbe1 100644 (file)
@@ -144,7 +144,6 @@ $messages = array(
 'tog-numberheadings' => 'Überschrifte outomatisch numeriere',
 'tog-showtoolbar' => 'Wärchzyyglyscht zum Bearbeite aazeige',
 'tog-editondblclick' => 'Syte ändere mit Doppelklick',
-'tog-editsection' => 'Links aazeige für ds Bearbeite vo einzelnen Absätz',
 'tog-editsectiononrightclick' => 'Einzelni Absätz ändere mit Rächtsclick uf d Iberschrifte',
 'tog-showtoc' => 'Inhaltsverzeichnis aazeige bi Artikle mit meh als drei Überschrifte',
 'tog-rememberpassword' => 'Mit däm Browser duurhaft aamälde (Maximal fir $1 {{PLURAL:$1|Tag|Täg}})',
@@ -1297,7 +1296,7 @@ Des cha nimmi ruckgängig gmacht wäre.',
 'youremail' => 'E-Mail-Adräss:',
 'username' => '{{GENDER:$1|Benutzername}}:',
 'uid' => '{{GENDER:$1|Benutzernummere}}:',
-'prefs-memberingroups' => '{{GENDER:$2|Mitglid}} vu dr {{PLURAL:$1|Benutzergruppe|Benutzergruppe}}:',
+'prefs-memberingroups' => '{{GENDER:$2|Mitglid}} vu dr {{PLURAL:$1|Benutzergruppe}}:',
 'prefs-registration' => 'Aamäldzyt:',
 'yourrealname' => 'Echte Name:',
 'yourlanguage' => 'Sproch:',
@@ -1311,7 +1310,9 @@ Des cha nimmi ruckgängig gmacht wäre.',
 'gender-unknown' => 'Ich wett doderzue kei Aagab mache',
 'gender-male' => 'Är schafft an Syte',
 'gender-female' => 'Si schafft an Syte',
-'prefs-help-gender' => 'Optional: bruucht fir gschlächtsspezifischi Adrässierig dur d Software. Die Information isch effentlig.',
+'prefs-help-gender' => 'Optional: bruucht fir gschlächtsspezifischi Adrässierig dur d Software. Die Information isch effentlig.
+
+Des isch e frejwilligi Aagab. D Software brucht si go Di aarede un as Hiiwys fir anderi dur d Verwändig vum grammatische Gschlächt. Die Information isch effetli.',
 'email' => 'E-Mail',
 'prefs-help-realname' => '* <strong>Dyy ächte Name</strong> (optional): Wänn du wetsch, ass Dyyni Änderige uf Dii chenne zruckgfierd wäre.',
 'prefs-help-email' => 'D Aagab vun ere E-Mail isch optional, macht aber s Zueschicke vun eme Ersatzpasswort meglig, wänn Du dyy Passwort vergässe hesch.',
@@ -1322,7 +1323,7 @@ Des cha nimmi ruckgängig gmacht wäre.',
 'prefs-signature' => 'Unterschrift',
 'prefs-dateformat' => 'Datumsformat',
 'prefs-timeoffset' => 'Zytunterschid',
-'prefs-advancedediting' => 'Erwytereti Optione',
+'prefs-advancedediting' => 'Allgmeini Optione',
 'prefs-advancedrc' => 'Erwytereti Optione',
 'prefs-advancedrendering' => 'Erwytereti Optione',
 'prefs-advancedsearchoptions' => 'Erwytereti Optione',
@@ -1353,7 +1354,7 @@ Des cha nimmi ruckgängig gmacht wäre.',
 'userrights-no-interwiki' => 'Du hesch nit d Berächtigung, Benutzerrächt in andere Wiki z ändere.',
 'userrights-nodatabase' => 'D Datebank $1 git s nit oder si isch nit lokal.',
 'userrights-nologin' => 'Du muesch Di mit eme Ammanne-Benutzerkonto [[Special:UserLogin|aamälde]], zum Benutzerrächt z ändere.',
-'userrights-notallowed' => 'Du hesch nit d Berächtigung zum Benutzerrächt vergee.',
+'userrights-notallowed' => 'Du hesch nit d Berächtigung zum Benutzerrächt vergee oder ewägnee.',
 'userrights-changeable-col' => 'Gruppezuegherigkeit, wu Du chasch ändere',
 'userrights-unchangeable-col' => 'Gruppezuegherigkeit, wu Du nit chasch ändere',
 
@@ -1399,7 +1400,7 @@ Des cha nimmi ruckgängig gmacht wäre.',
 'right-reupload-shared' => 'Lokals Iberschryybe vun ere Datei, wu in eme gmeinsam gnutzte Repositorium vorhanden isch',
 'right-upload_by_url' => 'E Datei uffelade vun ere URL-Adräss',
 'right-purge' => 'Sytecache lääre ohni Ruckfrog',
-'right-autoconfirmed' => 'Halbgschitzti Syte bearbeite',
+'right-autoconfirmed' => 'Kei Bschränkig dur IP-basierti Limit',
 'right-bot' => 'Behandlig as automatische Prozess',
 'right-nominornewtalk' => 'Chleini Bearbeitige an Diskussionssyte fiehre nit zuen ere „Neiji Nochrichte“-Aazeig',
 'right-apihighlimits' => 'Hecheri Limit in API-Abfroge',
@@ -1420,7 +1421,7 @@ Des cha nimmi ruckgängig gmacht wäre.',
 'right-ipblock-exempt' => 'Uusnahm vu IP-Sperrine, Autoblock und Rangesperre',
 'right-proxyunbannable' => 'Uusnahm vu automatische Proxysperrine',
 'right-unblockself' => 'Sich sälber entsperre',
-'right-protect' => 'Syteschutzstatus änderen un gschitzti Syte bearbeite',
+'right-protect' => 'Syteschutzstatus änderen un kaskadegschitzti Syte bearbeite',
 'right-editprotected' => 'Gschitzti Syte bearbeite (ohni Kaskadeschutz)',
 'right-editinterface' => 'Benutzerinterface bearbeite',
 'right-editusercssjs' => 'Bearbeite vu CSS- und JS-Dateie vu andere Benutzer',
@@ -1494,17 +1495,17 @@ Des cha nimmi ruckgängig gmacht wäre.',
 'recentchanges-legend' => 'Optione vu dr Aazeig',
 'recentchanges-summary' => 'Uf däre Syte chasch di letschte Änderige in däm Wiki aaluege.',
 'recentchanges-feed-description' => 'Di letschten Änderige vo {{SITENAME}} i däm Feed abonniere.',
-'recentchanges-label-newpage' => 'Die Bearbeitig het e neji Syte aagleit',
+'recentchanges-label-newpage' => 'Mit däre Bearbeitig isch e neji Syte aagleit wore',
 'recentchanges-label-minor' => 'Des isch e chleini Änderig',
 'recentchanges-label-bot' => 'Die Bearbeitig isch dur e Bott uusgfiert wore',
 'recentchanges-label-unpatrolled' => 'Die Bearbeitig isch nonig vun eme Fäldhieter aagluegt wore',
 'recentchanges-label-plusminus' => 'Di gänderet Sytegreßi (Aazahl in Byte)',
-'recentchanges-legend-newpage' => '$1 - neji Syte',
+'recentchanges-legend-newpage' => '(lueg au d [[Special:NewPages|Lischt vu neie Syte]])',
 'rcnotefrom' => 'Des sin d Ändrige syter <b>$2</b> (bis zem <b>$1</b> zeigt).',
 'rclistfrom' => '<small>Nöji Änderige ab $1 aazeige (UTC)</small>',
 'rcshowhideminor' => 'Chlynigkeite $1',
 'rcshowhidebots' => 'Bots $1',
-'rcshowhideliu' => 'Aagmoldene Benützer $1',
+'rcshowhideliu' => 'Regischtrierti Benutzer $1',
 'rcshowhideanons' => 'Nid aagmäldete Benutzer $1',
 'rcshowhidepatr' => 'Vum Fäldhieter aagluegti Änderige $1',
 'rcshowhidemine' => 'Eigeni Änderige $1',
@@ -1677,6 +1678,7 @@ Wänn s Problem alno uftritt, informier e [[Special:ListUsers/sysop|Ammann]].',
 'backend-fail-notsame' => 'S git scho ne Datei $1, wu nit idäntisch isch.',
 'backend-fail-invalidpath' => '$1 isch kei giltige Pfad zum Spychere.',
 'backend-fail-delete' => 'D Datei $1 het nit glöscht werre kinne.',
+'backend-fail-describe' => 'D Metadate fir d Datei „$1“ hän nit chenne gänderet wäre.',
 'backend-fail-alreadyexists' => 'D Datei „$1“ git s scho.',
 'backend-fail-store' => 'D Datei $1 het nit chenne unter em Name $2 gspycheret wäre.',
 'backend-fail-copy' => 'D Datei $1 het nit no $2 chenne kopiert wäre.',
@@ -1771,7 +1773,7 @@ Us Sicherheitsgrinde isch img_auth.php deaktiviert.',
 'upload_source_file' => ' (e Datei uf Dyynem Computer)',
 
 # Special:ListFiles
-'listfiles-summary' => 'Die Spezialsyte lischtet alli uffegladene Dateie uf. Wänn noch eme bstimmte Benutzer gfilteret wird, wäre nume die Dateie zeigt, wun er di letschte Version uffeglade het.',
+'listfiles-summary' => 'Die Spezialsyte lischtet alli uffegladene Dateie uf.',
 'listfiles_search_for' => 'Suech noch Datei:',
 'imgfile' => 'Datei',
 'listfiles' => 'Lischte vo Bilder',
@@ -1900,6 +1902,12 @@ Iberprief anderi Link zue dr Vorlage, voreb Du die leschesch.',
 'statistics-users-active-desc' => 'Benutzer mit Bearbeitige {{PLURAL:$1|in dr letschte 24 Stund|in dr letschte $1 Täg}}',
 'statistics-mostpopular' => 'Am meischte aagluegti Syte',
 
+'pageswithprop' => 'Syte mit ere Syteneigeschaft',
+'pageswithprop-legend' => 'Syte mit ere Syteneigeschaft',
+'pageswithprop-text' => 'Die Spezialsyte lischet Syten auf, wu ne bstimmti Syteneigeschaft bruche.',
+'pageswithprop-prop' => 'Eigeschaftsname:',
+'pageswithprop-submit' => 'Gang ane',
+
 'doubleredirects' => 'Doppleti Wyterleitige (Redirects)',
 'doubleredirectstext' => 'Die Lischt zeigt Wyterleitige, wu uf anderi Wyterleitige verwyyse.
 In jedere Zyylete het s Link zue dr erschte un dr zwote Wyterleitig un s Ziil vu dr zwote Wyterleitig, wu normalerwys di gwinscht Ziilsyten isch. Do sott eigetli scho di erscht Wyterleitig druf zeige.
@@ -2045,7 +2053,7 @@ Lueg au d Lischt vu dr [[Special:WantedCategories|gwinschte Kategorie]].',
 'linksearch-pat' => 'Suechmuschter:',
 'linksearch-ns' => 'Namensruum:',
 'linksearch-ok' => 'Sueche',
-'linksearch-text' => 'Die Spezialsyte macht d Suechi no Syte megli, wu s bstimmti Weblink din het. Doderby chenne Platzhalter wie zem Byschpel <code>*.byschpel.de</code> brucht wäre. S mueß zmindecht ei Top-Level-Domain, z. B. „*.org“. aagee wäre. <br />Unterstitzti Protokoll: <code>$1</code> (Standard isch http, wänn kei Protokoll aagee isch).',
+'linksearch-text' => 'Die Spezialsyte macht d Suechi no Syte megli, wu s bstimmti Weblink din het. Doderby chenne Platzhalter wie zem Byschpel <code>*.byschpel.de</code> brucht wäre. S mueß zmindecht ei Top-Level-Domain, z. B. „*.org“. aagee wäre. <br />{{PLURAL:$2|Unterstitzt Protokoll|Unterstitzti Protokoll}}: <code>$1</code> (Standard isch http, wänn kei Protokoll aagee isch.)',
 'linksearch-line' => '$1 isch vo $2 verknüpft',
 'linksearch-error' => 'Platzhalter chönne numme am Aafang verwändet werre.',
 
@@ -2058,7 +2066,7 @@ Lueg au d Lischt vu dr [[Special:WantedCategories|gwinschte Kategorie]].',
 # Special:ActiveUsers
 'activeusers' => 'Lischt vu dr aktive Benutzer',
 'activeusers-intro' => 'Des isch e Lischt vu Benutzer, wu irgedebis bearbeitet hän {{PLURAL:$1|am letschte Tag|in dr letschte $1 Täg}}.',
-'activeusers-count' => '$1 {{PLURAL:$1|Bearbeitig|Bearbeitige}} {{PLURAL:$3|am letschte Tag|in dr letschte $3 Täg}}',
+'activeusers-count' => '$1 {{PLURAL:$1|Aktion|Aktione}} {{PLURAL:$3|am letschte Tag|in dr letschte $3 Täg}}',
 'activeusers-from' => 'Zeig Benutzer ab:',
 'activeusers-hidebots' => 'Bötli uusblände',
 'activeusers-hidesysops' => 'Ammanne (Administratore) uusblände',
@@ -2129,10 +2137,8 @@ As Absender wird d E-Mail-Adräss us Dyyne [[Special:Preferences|Yystellige]] yy
 'watchnologin' => 'Du bisch nit aagmäldet',
 'watchnologintext' => 'Du muesch [[Special:UserLogin|aagmäldet]] syy, zum Dyyni Beobachtigssyte z bearbeite.',
 'addwatch' => 'zue de Beobachtigslischte derzue tue',
-'addedwatchtext' => "D Syte \"[[:\$1]]\" stoht jetz uf Dyyre [[Special:Watchlist|Beobachtigslischt]].
-Neji Änderige an dr Syte oder dr Diskussionssyte drvo chasch jetz dert säh. Usserdem sin die Änderige uf dr [[Special:RecentChanges|letschte Änderige]] '''fett''' gschribe, ass De si schnäller findsch.
-
-Wänn Du d Syte speter wider vu dr Lischt witt stryyche, deno druck eifach uf „{{int:Unwatch}}“.",
+'addedwatchtext' => 'D Syte "[[:$1]]" stoht jetz uf Dyyre [[Special:Watchlist|Beobachtigslischt]].
+Neji Änderige an dr Syte oder dr Diskussionssyte drvo chasch jetz dert säh.',
 'removewatch' => 'Us der Beobachtigsliste usegnuu',
 'removedwatchtext' => 'D Syte «[[:$1]]» isch us dyre [[Special:Watchlist|Beobachtigsliste]] glösche worde.',
 'watch' => 'Beobachte',
@@ -2160,24 +2166,31 @@ Wänn Du d Syte speter wider vu dr Lischt witt stryyche, deno druck eifach uf 
 'enotif_mailer' => '{{SITENAME}} E-Mail-Benochrichtigungsdienscht',
 'enotif_reset' => 'Alli Syte as aagluegt markiere',
 'enotif_impersonal_salutation' => '{{SITENAME}}-Benutzer',
+'enotif_subject_deleted' => '{{SITENAME}}-Syte $1 isch vu {{GENDER:$2|$2}} glescht wore',
+'enotif_subject_created' => '{{SITENAME}}-Syte $1 isch vu {{GENDER:$2|$2}} aagleit wore',
+'enotif_subject_moved' => '{{SITENAME}}-Syte $1 isch vu {{GENDER:$2|$2}} verschobe wore',
+'enotif_subject_restored' => '{{SITENAME}}-Syte $1 isch vu {{GENDER:$2|$2}} widerhärgstellt wore',
+'enotif_subject_changed' => '{{SITENAME}}-Syte $1 isch vu {{GENDER:$2|$2}} gänderet',
+'enotif_body_intro_deleted' => 'D {{SITENAME}}-Syte $1 isch am $PAGEEDITDATE vu {{GENDER:$2|$2}} glescht wore. Lueg $3.',
+'enotif_body_intro_created' => 'D {{SITENAME}}-Syte $1 isch am $PAGEEDITDATE vu {{GENDER:$2|$2}} aagleit wore. Lueg $3 fir di aktuäll Version.',
+'enotif_body_intro_moved' => 'D {{SITENAME}}-Syte $1 isch am $PAGEEDITDATE vu {{GENDER:$2|$2}} verschobe wore. Lueg $3 fir di aktuäll Version.',
+'enotif_body_intro_restored' => 'D {{SITENAME}}-Syte $1 isch am $PAGEEDITDATE vu {{GENDER:$2|$2}} widerhärgstellt wore. Lueg $3 fir di aktuäll Version.',
+'enotif_body_intro_changed' => 'D {{SITENAME}}-Syte $1 isch am $PAGEEDITDATE vu {{GENDER:$2|$2}} verschobe wore. Lueg $3 fir di aktuäll Version.',
 'enotif_lastvisited' => '$1 zeigt alli Änderige uf s Mol.',
 'enotif_lastdiff' => 'Lueg $1 no däre Änderig.',
 'enotif_anon_editor' => 'Anonyme Benutzer $1',
-'enotif_body' => 'Liebe/Liebi $WATCHINGUSERNAME,
-
-d {{SITENAME}}-Syte $PAGETITLE isch vum $PAGEEDITOR am $PAGEEDITDATE $CHANGEDORCREATED wore, di aktuell Version isch: $PAGETITLE_URL
-
+'enotif_body' => 'Sali $WATCHINGUSERNAME,
 
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
 
 Zämmenfassig vum Autor: $PAGESUMMARY $PAGEMINOREDIT
+
 Kontakt zum Autor:
 Mail $PAGEEDITOR_EMAIL
 Wiki $PAGEEDITOR_WIKI
 
 
-Es wird kei wyteri Nochricht iber Änderige gschickt, bis Du uf sälli Syte gohsch.
-Uf Dyyre Beobachtigssyte chasch d Beobachtigsmarker fir alli Syte zrucksetze, wu Du beobachte tuesch.
+Es wird kei wyteri Nochricht iber Änderige gschickt, bis Du uf sälli Syte gohsch un di aamäldsch. Uf Dyyre Beobachtigssyte chasch d Beobachtigsmarker fir alli Syte zrucksetze, wu Du beobachte tuesch.
 
              Dyy fryndli {{SITENAME}}-Nochrichtesyschtem
 
@@ -2216,9 +2229,11 @@ Im $2 het s e Lischt vu dr letschte Leschige.',
 'deleteotherreason' => 'Andere/zuesätzleche Grund:',
 'deletereasonotherlist' => 'Andere Grund',
 'deletereason-dropdown' => '* Allgmeini Leschgrind
+** Spam
 ** Wunsch vum Autor
 ** Urheberrächtsverletzig
-** Vandalismus',
+** Vandalismus
+** Defekti Wyterleitung',
 'delete-edit-reasonlist' => 'Leschgrind bearbeite',
 'delete-toobig' => 'Die Syte het e arg langi Versionsgschicht mit meh as $1 {{PLURAL:$1|Version|Versione}}. S Lesche vu sonige Syte isch yygschränkt wore go verhindere, ass dr Server vu {{SITENAME}} us Versäh zytwys iberlaschtet wird.',
 'delete-warning-toobig' => 'Die Syte het e arg langi Versionsgschicht mit meh as $1 {{PLURAL:$1|Version|Versione}}. S Lesche cha dr Datebankbetriib vu {{SITENAME}} stere.',
@@ -2236,7 +2251,7 @@ Im $2 het s e Lischt vu dr letschte Leschige.',
 Di letscht Änderig het [[User:$3|$3]] ([[User talk:$3|Diskussion]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]) gmacht.',
 'editcomment' => "D Änderigszämmefassig isch: „''$1''“.",
 'revertpage' => 'Ruckgängig gmacht zue dr letschte Änderig vo [[Special:Contributions/$2|$2]] ([[User talk:$2|Diskussion]]) mit de letzte Version vo [[User:$1|$1]] widerhergstellt',
-'revertpage-nouser' => 'Bearbeitige ruckgängig gmacht vu (Benutzername uusegnuu), letschti Fassig vu [[User:$1|$1]] widerhärgstellt',
+'revertpage-nouser' => 'Bearbeitige ruckgängig gmacht vu (Benutzername uusegnuu), letschti Fassig vu {{GENDER:$1|[[User:$1|$1]]}} widerhärgstellt',
 'rollback-success' => 'D Änderige vu $1 sin ruckgängig gmacht wore un di letscht Version vu $2 isch widerhärgstellt wore.',
 
 # Edit tokens
@@ -2258,6 +2273,8 @@ Lueg d [[Special:ProtectedPages|Lischt vu dr gschitzte Syte]] fir alli zurzyt gs
 'prot_1movedto2' => '[[$1]] isch uf [[$2]] verschobe worde.',
 'protect-badnamespace-title' => 'Nit-schitzbare Namensruum',
 'protect-badnamespace-text' => 'Syte in däm Namensruum chenne nit gschitzt wäre.',
+'protect-norestrictiontypes-text' => 'Die Syte cha nit gschitzt wäre, wel kei Bschränkigstype verfiegbar sin.',
+'protect-norestrictiontypes-title' => 'Nit schitzbari Syte',
 'protect-legend' => 'Syteschutzstatus ändere',
 'protectcomment' => 'Grund:',
 'protectexpiry' => 'Gsperrt bis:',
@@ -2272,9 +2289,9 @@ Hie sy di aktuelle Schutzystellige vor Syte '''$1''':",
 'protect-cascadeon' => 'Die Syten isch gschützt, wil si {{PLURAL:$1|zur folgende Syte|zu de folgende Syte}} ghört, wo derfür e Kaskadesperrig gilt.
 Der Schutzstatus vo dere Syte lat sech la ändere, aber das het kei Yfluss uf d Kaskadesperrig.',
 'protect-default' => 'Alle Benutzer',
-'protect-fallback' => '«$1»-Berächtigung nötig',
-'protect-level-autoconfirmed' => 'Neji un nit regischtrierti Benutzer sperre',
-'protect-level-sysop' => 'Numme Ammanne',
+'protect-fallback' => 'Nume Benutzer mit dr „$1“-Berächtigung erlaube.',
+'protect-level-autoconfirmed' => 'Nume automatisch bstetigte Benutzer erlaube',
+'protect-level-sysop' => 'Numme Ammanne erlaube',
 'protect-summary-cascade' => 'Kaskade',
 'protect-expiring' => 'bis $1 (UTC)',
 'protect-expiring-local' => 'bis $1',
@@ -2512,7 +2529,7 @@ Go d Sperri ufhebe lueg d [[Special:BlockList|Lisch vu allene aktive Sperrine]].
 'range_block_disabled' => 'D Megligkeit, ganzi Adrässryym z sperre, isch nit aktiviert.',
 'ipb_expiry_invalid' => 'D Duur, wu yygee woren isch, isch nit giltig.',
 'ipb_expiry_temp' => 'Versteckti Benutzername-Sperrine solle permanent syy.',
-'ipb_hide_invalid' => 'S isch nit megli des Benutzerkonto z unterdrucke; villicht het s viili Bearbeitige.',
+'ipb_hide_invalid' => 'S isch nit megli des Benutzerkonto z unterdrucke, wel s meh wie {{PLURAL:$1|ei Bearbeitig|$1 Bearbeitige}} ufwyst.',
 'ipb_already_blocked' => '„$1“ isch scho gsperrt wore.',
 'ipb-needreblock' => '{{GENDER:|De|D|}} „$1“ isch scho gsperrt. Mechtsch d Sperrparameter ändere?',
 'ipb-otherblocks-header' => 'Anderi {{PLURAL:$1|Sperri|Sperrine}}',
@@ -2550,7 +2567,18 @@ Go d Sperri ufhebe lueg d [[Special:BlockList|Lisch vu allene aktive Sperrine]].
 # Move page
 'move-page' => '„$1“ verschiebe',
 'move-page-legend' => 'Artikel verschiebe',
-'movepagetext' => 'Mit däm Formular chasch du en Artikel verschiebe, u zwar mit syre komplette Versionsgschicht. Der alt Titel leitet zum nöie wyter, aber Links ufen alt Titel blyben unveränderet.',
+'movepagetext' => "Mit däm Formular chasch e Syte umnänne, indäm Du si mitsamt allne Versionen uf e neje Titel verschiebsch.
+Dr alt Titel wird derno zum eje wyterleite.
+Du chasch Wyterleitige, wu uf dr Originaltitel verwyse, automatisch korrigiere loo.
+Stell sicher, dass Du im Aaschluss alli [[Special:DoubleRedirects|dopplete]] oder [[Special:BrokenRedirects|defekte Wyterleitige]] iberpriefsch.
+Du bisch derfir verantwortlig, ass Link wyter uf s korräkt Ziil verwyse.
+
+D Syte wird '''nit''' verschobe, wänn s scho ne Syte mit em vorgsähne Titel git, usser s isch e Wyterleitig ohni Versionsgschicht.
+Des heißt, ass Du d Umnännig chasch ruckgängig mache, wänn e Fähler gmacht hesch. Du chasch dergege kei Syte, wu s scho git, iberschrybe.
+
+'''Warnig!'''
+D Verschiebig cha wyteri un nit erwarteti Folge fir vylmol bsuechti Syte haa.
+Du sottsch wäge däm d Konsequänze verstande haa, vorbe jetz wyter machsch.",
 'movepagetext-noredirectfixer' => "Mit däm Formular unte chasch e Syte umnänne, indäm Du si mitsamt allene Versione uf e neje Titel verschiebsch.
 Dr alt Titel leitet derno zum neje wyter.
 Stell sicher, ass Du im Aaschluss alli [[Special:DoubleRedirects|dopplete]] oder [[Special:BrokenRedirects|kaputtige Wyterleitige]] iberpriefsch.
@@ -2719,6 +2747,7 @@ Die uf em lokale Rächner spychere un derno do uffelade.',
 'import-error-interwiki' => 'D Syte „$1“ isch nit importiert wore, wel dr Name vun ere fir externi Link (Interwiki) reserviert isch.',
 'import-error-special' => 'D Syte „$1“ isch nit importiert wore, wel si zuen eme bsundere Namensruum ghert, wu kei Syte megli sin.',
 'import-error-invalid' => 'Syte „$1“ isch nit importiert wore, wel dr Name vun ere nit giltig isch.',
+'import-error-unserialize' => 'D Version $2 vu dr Syte „$1“ het nit chenne deserialisiert wäre. D Version isch fir d Verwändig vum Inhaltsmodäll $3 gmäldet wore, wu as $4 serialisiert isch.',
 'import-options-wrong' => 'Falschi {{PLURAL:$2|Option|Optione}}: <nowiki>$1</nowiki>',
 'import-rootpage-invalid' => 'Dää Stammsytename isch nit giltig.',
 'import-rootpage-nosubpage' => 'Im Namensruum „$1“ vu dr Stammsyte sin kei Untersyte erlaubt.',
@@ -2847,12 +2876,13 @@ Die uf em lokale Rächner spychere un derno do uffelade.',
 'pageinfo-length' => 'Sytelengi (in Byte)',
 'pageinfo-article-id' => 'Syten-ID',
 'pageinfo-language' => 'Syteninhaltssproch',
-'pageinfo-robot-policy' => 'Suechmaschinestatus',
-'pageinfo-robot-index' => 'Indexierbar',
-'pageinfo-robot-noindex' => 'Nit indexierbar',
+'pageinfo-robot-policy' => 'Indexierig dur Suechmaschine',
+'pageinfo-robot-index' => 'Erlaubt',
+'pageinfo-robot-noindex' => 'Nit erlaubt',
 'pageinfo-views' => 'Aazahl Sytenufruef',
 'pageinfo-watchers' => 'Aazahl vu Beobachter',
-'pageinfo-redirects-name' => 'Wyterleitige zue däre Syte',
+'pageinfo-few-watchers' => 'Weniger wie {{PLURAL:$1|ei|$1}} Beobachter',
+'pageinfo-redirects-name' => 'Zahl vu dr Wyterleitige zue däre Syte',
 'pageinfo-subpages-name' => 'Untersyte vu däre Syte',
 'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|Wyterleitig|Wyterleitige}}; $3 {{PLURAL:$3|anderi Syte}})',
 'pageinfo-firstuser' => 'Aagleit vu',
@@ -2866,6 +2896,7 @@ Die uf em lokale Rächner spychere un derno do uffelade.',
 'pageinfo-magic-words' => '{{PLURAL:$1|Magischs Wort|Magischi Werter}} ($1)',
 'pageinfo-hidden-categories' => 'Versteckti {{PLURAL:$1|Kategori|Kategorie}} ($1)',
 'pageinfo-templates' => 'Yybundeni {{PLURAL:$1|Vorlag|Vorlage}} ($1)',
+'pageinfo-transclusions' => 'Yybunden in {{PLURAL:$1|1 Syte|$1 Syte}}',
 'pageinfo-toolboxlink' => 'Informatione zue dr Syte',
 'pageinfo-redirectsto' => 'Weiterleitung nach',
 'pageinfo-redirectsto-info' => 'Information',
@@ -2874,6 +2905,10 @@ Die uf em lokale Rächner spychere un derno do uffelade.',
 'pageinfo-protect-cascading' => 'Syte mit Kaskadeschutz vu do',
 'pageinfo-protect-cascading-yes' => 'Jo',
 'pageinfo-protect-cascading-from' => 'Syte mit Kaskadeschutz vu',
+'pageinfo-category-info' => 'Kategoriinformatione',
+'pageinfo-category-pages' => 'Aazahl vu dr Syte',
+'pageinfo-category-subcats' => 'Aazahl vu dr Unterkategorie',
+'pageinfo-category-files' => 'Aazahl vu dr Dateie',
 
 # Patrolling
 'markaspatrolleddiff' => 'Als patrulyrt markyre',
@@ -3163,7 +3198,7 @@ Andri wäre standardmäßig nit aazeigt.
 'exif-compression-4' => 'CCITT Gruppe 4 Faxkodierig',
 
 'exif-copyrighted-true' => 'Gschitzt',
-'exif-copyrighted-false' => 'Public Domain',
+'exif-copyrighted-false' => 'Urheberrächtsstatus nit feschtgleit',
 
 'exif-unknowndate' => 'Nit bekannt Datum',
 
@@ -3295,8 +3330,8 @@ Andri wäre standardmäßig nit aazeigt.
 'exif-gpslongitude-w' => 'weschtl. Längi',
 
 # Pseudotags used for GPSAltitudeRef
-'exif-gpsaltitude-above-sealevel' => '$1 {{PLURAL:$1|Meter|Meter}} iber em Meeresspiegel',
-'exif-gpsaltitude-below-sealevel' => '$1 {{PLURAL:$1|Meter|Meter}} unter em Meeresspiegel',
+'exif-gpsaltitude-above-sealevel' => '$1 {{PLURAL:$1|Meter}} iber em Meeresspiegel',
+'exif-gpsaltitude-below-sealevel' => '$1 {{PLURAL:$1|Meter}} unter em Meeresspiegel',
 
 'exif-gpsstatus-a' => 'Mässig lauft',
 'exif-gpsstatus-v' => 'Interoperabilität vu Mässige',
@@ -3583,7 +3618,7 @@ E [{{SERVER}}{{SCRIPTPATH}}/COPYING Kopi vu dr GNU General Public-Lizänz] sott
 'specialpages-group-highuse' => 'Syte wo oft bruucht werde',
 'specialpages-group-pages' => 'Lischte vo Syte',
 'specialpages-group-pagetools' => 'Sytewerchzüüg',
-'specialpages-group-wiki' => 'Syschtemdate un Wärchzüüg',
+'specialpages-group-wiki' => 'Date un Wärchzyyg',
 'specialpages-group-redirects' => 'Spezialsyte wo wyterleite',
 'specialpages-group-spam' => 'Spam-Wärchzüüg',
 
@@ -3770,4 +3805,6 @@ Sunscht chasch au s eifach Formular unte nutze. Dyy Kommentar wird, zämme mit D
 'expand_templates_generate_xml' => 'Zeig XML-Parser-Baum',
 'expand_templates_preview' => 'Vorschou',
 
+# Unknown messages
+'uploadinvalidxml' => 'S XML in dr uffegladene Datei het nit chenne parst wäre.',
 );
index e1bf53a..4277598 100644 (file)
@@ -162,7 +162,6 @@ $messages = array(
 'tog-numberheadings' => 'મથાળાંઓને આપો-આપ ક્રમ (ઑટો નંબર) આપો',
 'tog-showtoolbar' => 'ફેરફાર માટેની ટૂલબાર બતાવો',
 'tog-editondblclick' => 'બે વખત ક્લિક કરી પાનાંઓમાં ફેરફાર કરો',
-'tog-editsection' => 'વિભાગોમાં [ફેરફાર કરો] કડી દ્વારા વિભાગીય ફેરફાર લાગુ કરો.',
 'tog-editsectiononrightclick' => 'વિભાગના મથાળાં ને રાઇટ ક્લિક દ્વારા ફેરફાર કરવાની રીત અપનાવો.',
 'tog-showtoc' => 'અનુક્રમણિકા દર્શાવો (૩થી વધુ પેટા-મથાળા વાળા લેખો માટે)',
 'tog-rememberpassword' => 'આ કમ્પ્યૂટર પર મારી લોગ-ઇન વિગતો યાદ રાખો (મહત્તમ $1 {{PLURAL:$1|દિવસ|દિવસો}} માટે)',
index 20d961f..70f0b18 100644 (file)
@@ -9,6 +9,7 @@
  *
  * @author Anson2812
  * @author Dream hot
+ * @author EagerLin
  * @author Hakka
  * @author Jetlag
  * @author Mnemonic kek
@@ -30,7 +31,6 @@ $messages = array(
 'tog-numberheadings' => '標題自動編號',
 'tog-showtoolbar' => '展示編寫工具欄',
 'tog-editondblclick' => '雙撳編寫頁面',
-'tog-editsection' => '允許通過點撳[編寫]鏈接編寫段落',
 'tog-editsectiononrightclick' => '允許右撳標題編寫段落',
 'tog-showtoc' => '顯示目錄(針對一頁超過3隻標題嘅頁面)',
 'tog-rememberpassword' => '在邇隻瀏覽器記下亻厓嘅登入狀態(最多$1日)',
@@ -38,12 +38,12 @@ $messages = array(
 'tog-watchdefault' => '將亻厓編寫嘅頁面撈檔案加入亻厓嘅監視列表',
 'tog-watchmoves' => '將亻厓移動嘅頁面撈檔案加入亻厓嘅監視列表',
 'tog-watchdeletion' => '加亻厓刪除嘅頁面撈文件入亻厓嘅監視列表',
-'tog-minordefault' => '默認標記全部編寫細微修改',
+'tog-minordefault' => '默認標記全部編寫細微修改',
 'tog-previewontop' => '在編寫框上頭顯示預覽',
 'tog-previewonfirst' => '第一擺編寫時顯示預覽',
 'tog-enotifwatchlistpages' => '亻厓監視列表肚嘅頁面或文件有更動時,發電子郵件分亻厓',
 'tog-enotifusertalkpages' => '亻厓嘅交流頁有更改時,發電子郵件分亻厓',
-'tog-enotifminoredits' => '頁面撈文件細修改也發電子郵件分我',
+'tog-enotifminoredits' => '頁面撈文件細修改也發電子郵件分我',
 'tog-enotifrevealaddr' => '在通知電子郵件肚顯示亻厓嘅電子郵件地址',
 'tog-shownumberswatching' => '展示監視中嘅使用人數目',
 'tog-oldsig' => '現有簽名:',
@@ -234,7 +234,7 @@ $messages = array(
 'articlepage' => '查看內容頁面',
 'talk' => '討論',
 'views' => '查看數',
-'toolbox' => '工具箱',
+'toolbox' => 'Kûng-khí-siông',
 'userpage' => '查看用戶頁面',
 'projectpage' => '查看項目頁面',
 'imagepage' => '查看文件頁面',
@@ -291,8 +291,8 @@ $1',
 'youhavenewmessages' => '汝有$1($2)。',
 'youhavenewmessagesfromusers' => '汝有來自{{PLURAL:$3|另一位用戶|$3位用戶}}嘅$1($2)。',
 'youhavenewmessagesmanyusers' => '汝有來自多位用戶嘅$1( $2 )。',
-'newmessageslinkplural' => '{{PLURAL:$1|一條新信息|新信息}}',
-'newmessagesdifflinkplural' => '最新{{PLURAL:$1|更改|更改}}',
+'newmessageslinkplural' => '{{PLURAL:$1|yit-thiàu sîn sêu-sit|999=sîn sêu-sit}}',
+'newmessagesdifflinkplural' => 'chui-khiun{{PLURAL:$1|kiên-kói|kiên-kói}}',
 'youhavenewmessagesmulti' => '汝在$1肚有新消息',
 'editsection' => '編寫',
 'editold' => '編寫',
@@ -346,6 +346,10 @@ $1',
 'databaseerror' => '數據庫差錯',
 'databaseerror-text' => '出現資料庫查詢錯誤。
 邇可能表示軟件肚存在錯誤。',
+'databaseerror-textcl' => 'chṳ̂-liau-ku chhà-chhìm chho-ngu',
+'databaseerror-query' => 'chhà-chhìm:$1',
+'databaseerror-function' => 'kûng-nèn:$1',
+'databaseerror-error' => 'chho-ngu:$1',
 'laggedslavemode' => "'''警告:'''頁面可能毋包含最近嘅更新。",
 'readonly' => '數據庫分人鎖定',
 'enterlockreason' => '請撳入禁止訪問原因, 包括估計重新開放嘅時間',
@@ -379,6 +383,7 @@ $1',
 'cannotdelete-title' => '無辦法刪除頁面「$1」',
 'delete-hook-aborted' => '刪除分勾仔中止。
 其毋曾提供任何解釋。',
+'no-null-revision' => 'mò-fap chhóng-kien "$1" ya̍p-mien sîn-ke khûng-pa̍k siû-thin',
 'badtitle' => '有錯嘅標題',
 'badtitletext' => '所請求頁面嘅標題是無效嘅、毋存在嘅,跨語言或跨wiki鏈接嘅標題有錯。其可能包含一隻或還較多做毋得用於標題嘅字符。',
 'perfcached' => '下列係緩存數據,因此可能毋係最新嘅。最多{{PLURAL:$1|單淨有1嘅結果|$1嘅結果}}可用。',
@@ -899,7 +904,6 @@ Liá-chhṳ chhà-fûng he yù $1 só fûng ke. Tông-chûng ke ngièn-yîn he '
 'rows' => '行数:',
 'columns' => '列:',
 'searchresultshead' => '搜尋',
-'resultsperpage' => '每頁顯示鏈接數:',
 'stub-threshold' => '<a href="#" class="stub">短頁面鏈接</a>格式門檻值(字節):',
 'recentchangesdays' => '最近更改肚嘅顯示日數:',
 'recentchangescount' => 'Chui-khiûn kiên-kói chûng ke phiên-siá chúng-su:',
@@ -1528,6 +1532,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'block-log-flags-noautoblock' => '禁用自動查封',
 'range_block_disabled' => '單淨管理員正做得創建禁止查封嘅範圍。',
 'ipb_expiry_invalid' => '無效嘅終止時間。',
+'ipb_hide_invalid' => 'Put-tet yit-chak yung-fu; Kì yû chhêu-ko {{PLURAL:$1|$1}} chhṳ-su phiên-siá',
 'ipb_already_blocked' => 'Yí-kîn fûng-só "$1"',
 'ipb_cant_unblock' => '差錯: 尋毋到查封ID$1。可能已經解除封禁。',
 'ip_range_invalid' => '無效嘅IP範圍。',
index dfed251..0c5ee79 100644 (file)
@@ -375,7 +375,6 @@ $messages = array(
 'tog-numberheadings' => 'מספור כותרות אוטומטי',
 'tog-showtoolbar' => 'הצגת סרגל העריכה',
 'tog-editondblclick' => 'עריכת דפים בלחיצה כפולה',
-'tog-editsection' => 'עריכת פסקאות באמצעות קישורי [עריכה]',
 'tog-editsectiononrightclick' => 'עריכת פסקאות באמצעות לחיצה ימנית על כותרות הפסקאות',
 'tog-showtoc' => 'הצגת תוכן עניינים (עבור דפים עם יותר מ־3 כותרות)',
 'tog-rememberpassword' => 'שמירת הכניסה שלי בדפדפן זה ({{PLURAL:$1|ליום אחד|ליומיים|ל־$1 ימים}} לכל היותר)',
@@ -744,7 +743,7 @@ $1',
 'actionthrottled' => 'הפעולה הוגבלה',
 'actionthrottledtext' => 'כאמצעי נגד ספאם, אינכם מורשים לבצע פעולה זו פעמים רבות מדי בזמן קצר. אנא נסו שוב בעוד מספר דקות.',
 'protectedpagetext' => 'דף זה מוגן כדי למנוע עריכה ופעולות אחרות.',
-'viewsourcetext' => '×\91×\90פשר×\95ת×\9b×\9d לצפות בטקסט המקור של הדף ולהעתיקו:',
+'viewsourcetext' => '×\91×\90פשר×\95ת×\9a לצפות בטקסט המקור של הדף ולהעתיקו:',
 'viewyourtext' => "באפשרותכם לצפות בטקסט המקור של '''העריכות שלכם''' של הדף ולהעתיקו:",
 'protectedinterface' => 'דף זה הוא אחד מסדרת דפים המספקים הודעות מערכת לתוכנה באתר ויקי זה, ומוגן כדי למנוע השחתות.
 כדי להוסיף או לשנות תרגומים בכל אתרי הוויקי, אנא השתמשו ב־[//translatewiki.net/ translatewiki.net], פרויקט התרגום של מדיה־ויקי.',
@@ -1211,6 +1210,8 @@ $2
 'content-not-allowed-here' => 'תוכן מסוג "$1" אינו מותר בדף [[$2]]',
 'editwarning-warning' => 'עזיבת דף זה עשויה לגרום לאובדן כל השינויים שביצעתם.
 אם אתם מחוברים לחשבון, תוכלו לבטל אזהרה זו בחלק "עריכה" שבהעדפות שלכם.',
+'editpage-notsupportedcontentformat-title' => 'סוג התוכן אינו נתמך',
+'editpage-notsupportedcontentformat-text' => 'תוכן מסוג $1 אינו נתמך על־ידי מודל התוכן $2.',
 
 # Content models
 'content-model-wikitext' => 'טקסט ויקי',
@@ -1462,6 +1463,7 @@ $1",
 'search-result-score' => 'רלוונטיוּת: $1%',
 'search-redirect' => '(הפניה $1)',
 'search-section' => '(פסקה $1)',
+'search-file-match' => '(התאמה בתוכן הקובץ)',
 'search-suggest' => 'האם התכוונת ל: $1',
 'search-interwiki-caption' => 'מיזמי אחות',
 'search-interwiki-default' => 'תוצאות ב{{GRAMMAR:תחילית|$1}}:',
@@ -2554,7 +2556,7 @@ $UNWATCHURL
 'exblank' => 'הדף היה ריק',
 'delete-confirm' => 'מחיקת $1',
 'delete-legend' => 'מחיקה',
-'historywarning' => "'''אזהרה:''' לדף שאתם עומדים למחוק יש היסטוריית שינויים של בערך {{PLURAL:$1|גרסה אחת|$1 גרסאות}}:",
+'historywarning' => "'''אזהרה:''' לדף שאתם עומדים למחוק יש היסטוריית שינויים של {{PLURAL:$1|גרסה אחת|$1 גרסאות}}:",
 'confirmdeletetext' => 'אתם עומדים למחוק דף יחד עם כל ההיסטוריה שלו.
 
 אנא אשרו שזה אכן מה שאתם מתכוונים לעשות, שאתם מבינים את התוצאות של מעשה כזה, ושהמעשה מבוצע בהתאם ל[[{{MediaWiki:Policy-url}}|נוהלי האתר]].',
@@ -2578,7 +2580,7 @@ $UNWATCHURL
 'delete-edit-reasonlist' => 'עריכת סיבות המחיקה',
 'delete-toobig' => 'דף זה כולל מעל {{PLURAL:$1|גרסה אחת|$1 גרסאות}} בהיסטוריית העריכות שלו. מחיקת דפים כאלה הוגבלה כדי למנוע פגיעה בביצועי האתר.',
 'delete-warning-toobig' => 'דף זה כולל מעל {{PLURAL:$1|גרסה אחת|$1 גרסאות}} בהיסטוריית העריכות שלו. מחיקה שלו עלולה להפריע לפעולות בבסיס הנתונים; אנא שקלו שנית את המחיקה.',
-'deleting-backlinks-warning' => "'''אזהרה:''' דפים אחרים מקשרים לדף שאתם עומדים למחוק.",
+'deleting-backlinks-warning' => "'''אזהרה:''' דפים אחרים מקשרים לדף שאתם עומדים למחוק או מכלילים אותו.",
 
 # Rollback
 'rollback' => 'שחזור עריכות',
@@ -2879,7 +2881,7 @@ $1',
 '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|חסימה אחרת|חסימות אחרות}}',
@@ -4367,4 +4369,6 @@ $5
 'expand_templates_generate_rawhtml' => 'הצגת HTML גולמי',
 'expand_templates_preview' => 'תצוגה מקדימה',
 
+# Unknown messages
+'uploadinvalidxml' => 'לא ניתן לפרש את ה־XML בקובץ שהועלה.',
 );
index b22c623..2de4029 100644 (file)
@@ -30,6 +30,7 @@
  * @author Krinkle
  * @author Kumar
  * @author Mayur
+ * @author Nikhil.kawale
  * @author Odisha1
  * @author Omprakash
  * @author Pulkitsingh01
@@ -43,6 +44,7 @@
  * @author Shantanoo
  * @author Shirayuki
  * @author Shrish
+ * @author Shubhamkanodia
  * @author Shyam
  * @author Shyam123.ckp
  * @author Siddhartha Ghai
@@ -199,7 +201,6 @@ $messages = array(
 'tog-numberheadings' => 'शीर्षक स्व-क्रमांकित करें',
 'tog-showtoolbar' => 'सम्पादन औज़ारपट्टी दिखाएँ',
 'tog-editondblclick' => 'दुगुने क्लिक पर पृष्ठ संपादित करें',
-'tog-editsection' => '[संपादित करें] कड़ियों द्वारा अनुभाग संपादन सक्षम करें',
 'tog-editsectiononrightclick' => 'अनुभाग शीर्षक पर दायाँ क्लिक करने पर अनुभाग सम्पादित करें',
 'tog-showtoc' => 'अनुक्रम दर्शायें (जिन पृष्ठों पर तीन से अधिक अनुभाग हों)',
 'tog-rememberpassword' => 'इस ब्राउज़र पर मेरा कूटशब्द  (अधिकतम $1 {{PLURAL:$1|दिन|दिनों}} तक) याद रखें',
@@ -462,8 +463,8 @@ $1',
 'youhavenewmessages' => 'आपके लिए $1 हैं। ($2)',
 'youhavenewmessagesfromusers' => 'आपके लिये {{PLURAL:$3|एक अन्य सदस्य|$3 अन्य सदस्यों}} के $1 हैं। ($2)',
 'youhavenewmessagesmanyusers' => 'आपके लिये $1 हैं। ($2)',
-'newmessageslinkplural' => '{{PLURAL:$1|एक नया सन्देश|नये सन्देश}}',
-'newmessagesdifflinkplural' => '{{PLURAL:$1|पिछला|पिछले}} बदलाव',
+'newmessageslinkplural' => '{{PLURAL:$1|एक नया सन्देश|999=नये सन्देश}}',
+'newmessagesdifflinkplural' => '{{PLURAL:$1|पिछला|999=पिछले}} बदलाव',
 'youhavenewmessagesmulti' => '$1 पर आपके लिए नया संदेश है',
 'editsection' => 'सम्पादन',
 'editold' => 'सम्पादन',
@@ -593,7 +594,8 @@ $2',
 'invalidtitle-knownnamespace' => '"$2" नामस्थान और "$3" नाम वाला गलत शीर्षक',
 'invalidtitle-unknownnamespace' => 'अज्ञात नामस्थान संख्या $1 और नाम "$2" वाला गलत शीर्षक',
 'exception-nologin' => 'लॉग इन नहीं किया है',
-'exception-nologin-text' => 'इस पृष्ठ अथवा कार्य के लिए आपको विकि में लॉग्ड इन होना आवश्यक है।',
+'exception-nologin-text' => 'इस पृष्ठ अथवा कार्य को सक्षम करने के लिए कृपया [[Special:Userlogin|लॉग इन]]करें।',
+'exception-nologin-text-manual' => 'इस पृष्ठ अथवा कार्य को सक्षम करने के लिए कृपया $1 करें।',
 
 # Virus scanner
 'virus-badscanner' => "गलत जमाव: अज्ञात वायरस जाँचक: ''$1''",
@@ -640,9 +642,12 @@ $2',
 'gotaccount' => "पहले से आपका खाता है? '''$1''' करें।",
 'gotaccountlink' => 'लॉग इन',
 'userlogin-resetlink' => 'अपनी प्रवेश जानकारी भूल गए हैं?',
-'userlogin-resetpassword-link' => 'à¤\85पना à¤\95à¥\82à¤\9fशबà¥\8dद à¤°à¥\80सà¥\87à¤\9f à¤\95रà¥\87à¤\82',
+'userlogin-resetpassword-link' => 'à¤\85पना à¤ªà¤¾à¤¸à¤µà¤°à¥\8dड à¤­à¥\82ल à¤\97à¤\8f?',
 'helplogin-url' => 'Help:लॉगिंग इन',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|लॉग इन करने में सहायता]]',
+'userlogin-loggedin' => 'आप {{GENDER:$1|$1}} के रूप में पहले से लॉग्ड इन हैं।
+किसी अन्य उपयोगकर्ता के रूप में लॉग इन करने के लिए निम्नलिखित फॉर्म का प्रयोग करें।',
+'userlogin-createanother' => 'एक अन्य खाता खोलें',
 'createacct-join' => 'अपनी जानकारी नीचे लिखें',
 'createacct-another-join' => 'नए खाते की जानकारी नीचे प्रदान करें।',
 'createacct-emailrequired' => 'ई-मेल पता',
@@ -693,7 +698,7 @@ $2',
 'passwordtooshort' => 'आपका कूटशब्द कम से कम {{PLURAL:$1|1 अक्षर|$1 अक्षरों}} का होना चाहिये।',
 'password-name-match' => 'आपका कूटशब्द आपके सदस्यनाम से भिन्न होना चाहिए।',
 'password-login-forbidden' => 'इस सदस्यनाम और कूटशब्द का उपयोग वर्जित है।',
-'mailmypassword' => 'à¤\88-मà¥\87ल à¤¦à¥\8dवारा à¤¨à¤¯à¤¾ à¤\95à¥\82à¤\9fशबà¥\8dद à¤­à¥\87à¤\9cà¥\87à¤\82',
+'mailmypassword' => 'à¤\95à¥\82à¤\9fशबà¥\8dद à¤ªà¥\81नà¤\83सà¥\8dथापित à¤\95रà¥\87',
 'passwordremindertitle' => '{{SITENAME}} के लिये नया अस्थायी कूटशब्द',
 'passwordremindertext' => 'किसी ने (शायद आपने ही, $1 आइ॰पी पते से) {{SITENAME}} ($4) पर इस्तेमाल के लिये नया कूटशब्द मँगाया है। सदस्य "$2" के लिए एक अस्थायी कूटशब्द बना दिया गया है, और यह अभी "$3" है। यदि यह आपकी ही मंशा थी, तो अब आपको सत्रारंभ करके एक नया कूटशब्द चुनना होगा।
 आपके अस्थायी कूटशब्द की अवधि {{PLURAL:$5|एक दिन|$5 दिनों}} में समाप्त हो जाएगी।
@@ -704,14 +709,14 @@ $2',
 'passwordsent' => '"$1" के ई-मेल पते पर एक नया कूटशब्द भेज दिया गया है।
 ई-मेल पाने बाद कृपया दुबारा लॉग इन करें।',
 'blocked-mailpassword' => 'आपके आइ॰पी पते को सम्पादन करने से अवरुद्ध कर दिया गया है, और गलत इस्तेमाल रोकने के लिये कूटशब्द पुनः प्राप्ति की सुविधा इस आइ॰पी पर बंद कर दी गई है।',
-'eauthentsent' => 'दर्ज किये हुए ई-मेल पते पर एक सत्यापन ई-मेल भेजा गया है।
-à¤\86पà¤\95à¥\8b à¤\89स à¤\88-मà¥\87ल à¤®à¥\87à¤\82 à¤¦à¤¿à¤¯à¥\87 à¤¹à¥\81à¤\8f à¤¨à¤¿à¤°à¥\8dदà¥\87शà¥\8bà¤\82 à¤\95à¥\87 à¤\85नà¥\81सार à¤\95à¥\8dरियाà¤\8fà¤\81 à¤\95र à¤\95à¥\87 à¤\88-मà¥\87ल à¤ªà¤¤à¥\87 à¤\95ा à¤¸à¤¤à¥\8dयापन à¤\95रना à¤¹à¥\8bà¤\97ा, à¤\89सà¤\95à¥\87 à¤ªà¤¶à¥\8dà¤\9aात à¤¹à¥\80 à¤¯à¤¹à¤¾à¤\81 à¤¸à¥\87 à¤\95à¥\8bà¤\88 à¤¦à¥\82सरा à¤\88-मà¥\87ल à¤­à¥\87à¤\9cा à¤\9cाà¤\8fà¤\97ा।',
+'eauthentsent' => 'दरà¥\8dà¤\9c à¤\95ियà¥\87 à¤¹à¥\81à¤\8f à¤\88-मà¥\87ल à¤ªà¤¤à¥\87 à¤ªà¤° à¤\8fà¤\95 à¤¸à¤¤à¥\8dयापन à¤\88-मà¥\87ल à¤­à¥\87à¤\9cा à¤¦à¤¿à¤¯à¤¾ à¤\97या à¤¹à¥\88।
+आपको उस ई-मेल में दिये हुए निर्देशों के अनुसार ई-मेल पते का सत्यापन करना होगा, उसके पश्चात ही यहाँ से कोई दूसरा ई-मेल भेजा जाएगा।',
 'throttled-mailpassword' => 'पिछले {{PLURAL:$1|एक घंटे|$1 घंटों}} के दरमियान एक कूटशब्द स्मरण-पत्र भेजा जा चुका है।
 दुरुपयोग से बचाव के लिए हर {{PLURAL:$1|एक घंटे|$1 घंटों}} में एक कूटशब्द स्मरण-पत्र ही भेजा जाता है।',
 'mailerror' => 'ई-मेल भेजने में त्रुटि: $1',
 'acct_creation_throttle_hit' => 'आपके आइ॰पी पते से आए आगंतुक पिछले चौबीस घंटों में इस विकि पर {{PLURAL:$1|एक खाता|$1 खाते}} बना चुके हैं, इस समयावधि में यही अधिकतम सीमा है।
 अतः इस समय इस आइ॰पी पते का प्रयोग करने वाले आगंतुक और खाते नहीं खोल सकेंगे।',
-'emailauthenticated' => 'à¤\86पà¤\95à¥\87 à¤\88-मà¥\87ल à¤ªà¤¤à¥\87 à¤\95à¥\80 à¤¦à¤¿à¤¨à¤¾à¤\82à¤\95 $2 à¤\95à¥\8b $3 à¤¬à¤\9cà¥\87 à¤ªà¥\81षà¥\8dà¤\9fि à¤¹à¥\81à¤\88 à¤¥à¥\80।',
+'emailauthenticated' => 'à¤\86पà¤\95ा à¤\88-मà¥\87ल à¤ªà¤¤à¤¾ $2 à¤\95à¥\8b $3 à¤¬à¤\9cà¥\87 à¤¸à¤¤à¥\8dयापित à¤\95िया à¤\97या।',
 'emailnotauthenticated' => 'आपके ई-मेल पते की पुष्टि नहीं हुई है।
 नीचे दी किसी भी सुविधा के लिये आपको ई-मेल नहीं भेजा जाएगा।',
 'noemailprefs' => 'इन सुविधाओं का प्रयोग करने के लिये अपनी वरीयताओं में ई-मेल पता दें।',
@@ -3135,7 +3140,7 @@ $1',
 'svg-long-desc' => 'SVG फ़ाईल, साधारणत: $1 × $2 पीक्सेल्स, फ़ाईलका आकार: $3',
 'svg-long-desc-animated' => 'ऐनिमेटिड एस॰वी॰जी फ़ाइल, $1 × $2 पिक्सेल, फ़ाइल साइज़: $3',
 'svg-long-error' => 'अमान्य एस॰वी॰जी फ़ाइल: $1',
-'show-big-image' => 'समà¥\8dपà¥\82रà¥\8dण à¤°à¤¿à¤\9c़à¥\8bलà¥\8dयà¥\82शन',
+'show-big-image' => 'मà¥\82ल à¤\86à¤\95ार',
 'show-big-image-preview' => 'इस पूर्वावलोकन का आकार:  $1 ।',
 'show-big-image-other' => 'अन्य  {{PLURAL:$2| resolution|resolutions}}:  $1 ।',
 'show-big-image-size' => '$1 × $2  पिक्सेल',
index aa01dbe..7198652 100644 (file)
@@ -46,7 +46,6 @@ $messages = array(
 'tog-numberheadings' => 'Sab heading ke apne se number karo',
 'tog-showtoolbar' => 'Badle waala toolbar ke dekhao',
 'tog-editondblclick' => 'Dugnaa click pe panna ke badlo',
-'tog-editsection' => '[Badlao] ke jorr se section ke badlao se enable karo',
 'tog-editsectiononrightclick' => 'Bhaag ke title pe right click kare pe bhaag ke badle ke laabu karo',
 'tog-showtoc' => 'Dhyan suchi dekhao (uu panna khatir jon me tiin se jaada heading hai)',
 'tog-rememberpassword' => 'Ii browser me (jaada se jaada $1 {{PLURAL:$1|din|din}}) talak hamaar login ke yaad rakho.',
@@ -1172,7 +1171,6 @@ Yaad rakhna ki uu log ke {{SITENAME}} ke index saait purana hoi.',
 'rows' => 'Line:',
 'columns' => 'Column:',
 'searchresultshead' => 'Khojo',
-'resultsperpage' => 'Panna ke ketna dafe dekha gais hai:',
 'stub-threshold' => 'Threshold ke khatir <a href="#" class="stub">stub link</a> formatting (bytes):',
 'stub-threshold-disabled' => 'Band kar dewa gais hae',
 'recentchangesdays' => 'Nawaa badlao me ketna roj dekhawa jaae:',
index 85cf435..2f1b20c 100644 (file)
@@ -12,6 +12,7 @@
  * @author Erythrii
  * @author Jose77
  * @author Kguirnela
+ * @author Midnight Gambler
  * @author Oxyzen
  * @author Tagimata
  * @author Taylortheturtle
@@ -29,7 +30,6 @@ $messages = array(
 'tog-numberheadings' => 'Auto-numero heading',
 'tog-showtoolbar' => 'Ipakita ang edit toolbar (nagakilanlan JavaScript)',
 'tog-editondblclick' => 'Islan ang pahina kung i-doble klik mo (nagakilanlan JavaScript)',
-'tog-editsection' => 'Sugtan ang pag-ilis sang seksyon paagi sa [ilisan] nga mga tabid',
 'tog-editsectiononrightclick' => 'Sugtan ang pag-ilis sang seksyon paagi sa pagtum-ok sang natoo sa mouse sa titulo sang seksyon (nagakinahanglan sang JavaScript)',
 'tog-showtoc' => 'Ipakita ang sinulatan sang nagabug-os (para sang mga panid nga may yara sang masobra sa 3 nga pangolohan)',
 'tog-rememberpassword' => 'Dumdumon ang akon password sa sini nga brawser (para sa indi magsobra $1 {{PLURAL:$1|nga adlaw|nga mga adlaw}})',
@@ -1097,7 +1097,6 @@ Tandai nga ang ila nga palasulundan sang mga unod sang {{SITENAME}} mahimo nga m
 'rows' => 'Mga linya:',
 'columns' => 'Mga kulumna:',
 'searchresultshead' => 'Pangita-a',
-'resultsperpage' => 'Mga pag-igu kada panid:',
 'stub-threshold' => 'Suludlan sang <a href="#" class="stub">stub sang link</a> nga pagkay-o (bytes):',
 'stub-threshold-disabled' => 'Gin-untat',
 'recentchangesdays' => 'Adlaw nga nabilin sa pagpakita sang mga bag-o nga pag-ilis:',
@@ -1360,7 +1359,7 @@ Ang imo adres sang e-mail wala ginapakita kon kontakon ka sang iban.',
 'rc_categories_any' => 'Bisan ano',
 'rc-change-size-new' => '$1 {{PLURAL:$1|byte|mga bytes}} despues sang pagbag-o',
 'newsectionsummary' => '/* $1 */ bag-o nga seksyon',
-'rc-enhanced-expand' => 'Ipakita ang mga detalye (nagakilanlan sang JavaScript)',
+'rc-enhanced-expand' => 'Ipakita ang mga detalye',
 'rc-enhanced-hide' => 'Tagu-on ang mga detalye',
 'rc-old-title' => 'orihinal nga ginhimo bilang "$1"',
 
@@ -1582,7 +1581,7 @@ Pwede mo mabag-o ang lebel sang proteksiyon sang pahina, pero indi ini ma apektu
 'contributions' => 'Mga kontribusyon sang {{GENDER:$1|naga-usar}}',
 'contributions-title' => 'Mga Kontribusyon sang Naga-Usar para $1',
 'mycontris' => 'Kontribusyon',
-'contribsub2' => 'Para $1 ($2)',
+'contribsub2' => 'Para {{GENDER:$3|$1}} ($2)',
 'uctop' => '(ibabaw)',
 'month' => 'Halin sa bulan (kag sang timprano):',
 'year' => 'Halin sa tu-ig (kag sang timprano):',
index e006c39..ea5b547 100644 (file)
@@ -327,7 +327,6 @@ $messages = array(
 'tog-numberheadings' => 'Automatski označi naslove brojevima',
 'tog-showtoolbar' => 'Prikaži traku s alatima za uređivanje (zahtijeva JavaScript)',
 'tog-editondblclick' => 'Dvoklik otvara uređivanje stranice (JavaScript)',
-'tog-editsection' => 'Prikaži poveznice za uređivanje pojedinih odlomaka',
 'tog-editsectiononrightclick' => 'Pritiskom na desnu tipku miša otvori uređivanje pojedinih odlomaka (JavaScript)',
 'tog-showtoc' => 'U člancima s više od tri odlomka prikaži tablicu sadržaja.',
 'tog-rememberpassword' => 'Zapamti moju lozinku u ovom pregledniku (najduže $1 {{PLURAL:$1|dan|dana|dana}})',
@@ -1978,7 +1977,7 @@ Sljedeći popis prikazuje {{PLURAL:$1|stranice koje|prvih $1 stranica koje}} vod
 'linkstoimage-redirect' => '$1 (preusmjeravanje datoteke) $2',
 'duplicatesoffile' => '{{PLURAL:$1|Sljedeća datoteka je kopija|$1 sljedeće datoteke su kopije|$1 sljedećih datoteka su kopije}} ove datoteke ([[Special:FileDuplicateSearch/$2|više detalja]]):',
 'sharedupload' => 'Ova je datoteka postavljena na $1 i mogu je koristiti ostali projekti.',
-'sharedupload-desc-there' => 'Ova datoteka je s $1 i mogu je koristiti drugi projekti. Pogledajte [$2 stranicu s opisom datoteke] za dodatne informacije.',
+'sharedupload-desc-there' => 'Ova datoteka je s projekta $1 i mogu je koristiti drugi projekti. Pogledajte [$2 stranicu s opisom datoteke] za dodatne informacije.',
 'sharedupload-desc-here' => 'Ova datoteka je sa $1 i mogu je koristiti drugi projekti. Opis s njezine [$2 stranice s opisom datoteke] prikazan je ispod.',
 'sharedupload-desc-edit' => 'Ova datoteka nalazi se na $1 i može se rabiti na drugim projektima.
 Njen opis možete urediti na [$2 stranici opisa datoteke].',
index 5c50da9..5f316b0 100644 (file)
@@ -165,7 +165,6 @@ $messages = array(
 'tog-numberheadings' => 'Nadpisma awtomatisce čisłować',
 'tog-showtoolbar' => 'Wobdźěłowansku lajstu pokazać',
 'tog-editondblclick' => 'Strony z dwójnym kliknjenjom wobdźěłować',
-'tog-editsection' => 'Wobdźěłowanje jednotliwych wotrězkow přez wotkazy [wobdźěłać] zmóžnić',
 'tog-editsectiononrightclick' => 'Wobdźěłowanje wotrězkow přez kliknjenje z prawej tastu na nadpisma wotrězkow zmóžnić',
 'tog-showtoc' => 'Zapis wobsaha pokazać (za strony z wjace hač 3 nadpismami)',
 'tog-rememberpassword' => 'Přizjewjenje na tutym wobhladowaku sej spomjatkować (za maksimalnje $1 {{PLURAL:$1|dźeń|dnjej|dny|dnjow}})',
@@ -960,6 +959,8 @@ Eksistuje hižo.',
 'invalid-content-data' => 'Njepłaćiwe wobsahowe daty',
 'content-not-allowed-here' => 'Wobsah "$1" njeje na stronje [[$2]] dowoleny',
 'editwarning-warning' => 'Hdyž so strona wopušća, móža so změny zhubić, kotrež sy přewjedł. Jeli sy přizjewjeny, móžeš tute warnowanje we wotrězku "Wobdźěłowanje" swojich nastajenjow znjemóžnić.',
+'editpage-notsupportedcontentformat-title' => 'Wobsahowy format so njepodpěruje',
+'editpage-notsupportedcontentformat-text' => 'Wobsahowy format $1 so přez wobsahowy model $2 njepodpěruje.',
 
 # Content models
 'content-model-wikitext' => 'wikitekst',
@@ -1206,6 +1207,7 @@ Podrobnosće móžeš w [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}
 'search-result-score' => 'Relewanca: $1 %',
 'search-redirect' => '(Daleposrědkowanje $1)',
 'search-section' => '(wotrězk $1)',
+'search-file-match' => '(wotpowěduje datajowemu wobsahej)',
 'search-suggest' => 'Měnješe ty $1?',
 'search-interwiki-caption' => 'Sotrowske projekty',
 'search-interwiki-default' => '$1 wuslědki:',
@@ -2301,7 +2303,7 @@ Prošu potwjerdź, zo maš wotpohlad to činić, zo rozumiš sćěwki a zo to wo
 'delete-edit-reasonlist' => 'Přičiny za wušmórnjenje wobdźěłać',
 'delete-toobig' => 'Tuta strona ma z wjace hač $1 {{PLURAL:$1|wersiju|wersijomaj|wersijemi|wersijemi}} wulke wobdźěłanske stawizny. Wušmórnjenje tajkich stronow bu wobmjezowane, zo by připadne přetorhnjenje {{SITENAME}} wobešło.',
 'delete-warning-toobig' => 'Tuta strona ma z wjace hač $1 {{PLURAL:$1|wersiju|wersijomaj|wersijemi|wersijemi}} wulke wobdźěłanske stawizny. Wušmórnjenje móže operacije datoweje banki {{SITENAME}} přetorhnyć; pokročuj z kedźbliwosću.',
-'deleting-backlinks-warning' => "'''Warnowanje:''' Druhe strony wotkazuja k stronje, kotruž chceš zhašeć.",
+'deleting-backlinks-warning' => "'''Warnowanje:''' Druhe strony wotkazuja k stronje abo strona je druhdźe zapřijata, kotruž chceš zhašeć.",
 
 # Rollback
 'rollback' => 'Změny cofnyć',
@@ -2588,7 +2590,7 @@ Hlej [[Special:BlockList|lisćinu blokowanjow]], zo by zablokowanjow pruwował.'
 'range_block_disabled' => 'Kmanosć administratorow, cyłe wobłuki IP-adresow blokować, je znjemóžnjena.',
 'ipb_expiry_invalid' => 'Čas spadnjenja je njepłaćiwy.',
 'ipb_expiry_temp' => 'Blokowanja schowanych wužiwarskich mjenow maja permanentne być.',
-'ipb_hide_invalid' => 'Njeje móžno tute konto potłóčić; ma snano přewjele změnow.',
+'ipb_hide_invalid' => 'Njeje móžno tute konto potłóčić; ma přez {{PLURAL:$1|jednu změnu|$1 změnje|$1 změny|$1 změnow}}.',
 'ipb_already_blocked' => 'Wužiwar „$1” je hižo zablokowany.',
 'ipb-needreblock' => '$1 je hižo zablokowany. Chceš nastajenja změnić?',
 'ipb-otherblocks-header' => '{{PLURAL:$1|Druhe blokowanje|Druhej blokowani|Druhe blokowanja|Druhe blokowanja}}',
@@ -3957,4 +3959,6 @@ Hewak móžeš slědowacy jednory formular wužiwać. Twój komentar přida so s
 'expand_templates_generate_rawhtml' => 'Hruby HTML pokazać',
 'expand_templates_preview' => 'Přehlad',
 
+# Unknown messages
+'uploadinvalidxml' => 'XML w nahratej dataji njeda so parsować.',
 );
index 2d3bcb5..702bf13 100644 (file)
@@ -325,7 +325,6 @@ $messages = array(
 'tog-numberheadings' => 'Fejezetcímek automatikus számozása',
 'tog-showtoolbar' => 'Szerkesztőeszközsor megjelenítése',
 'tog-editondblclick' => 'A lapok szerkesztése dupla kattintásra',
-'tog-editsection' => '[szerkesztés] linkek az egyes szakaszok szerkesztéséhez',
 'tog-editsectiononrightclick' => 'Szakaszok szerkesztése a szakaszcímre való jobb kattintással',
 'tog-showtoc' => 'Tartalomjegyzék megjelenítése a három fejezetnél többel rendelkező cikkeknél',
 'tog-rememberpassword' => 'Emlékezzen rám ezzel a böngészővel (legfeljebb {{PLURAL:$1|egy|$1}} napig)',
@@ -1663,6 +1662,7 @@ A műveletet nem lehet visszavonni.',
 'recentchanges-label-bot' => 'Ezt a szerkesztést egy bot hajtotta végre',
 'recentchanges-label-unpatrolled' => 'Ezt a szerkesztést még nem ellenőrizték',
 'recentchanges-label-plusminus' => 'Az oldal mérete ennyi bájttal módosult',
+'recentchanges-legend-heading' => 'Jelmagyarázat:',
 'recentchanges-legend-newpage' => '(lásd még: [[Special:NewPages|Új lapok]])',
 'rcnotefrom' => 'Alább a <b>$2</b> óta történt változtatások láthatóak (<b>$1</b> db).',
 'rclistfrom' => '$1 után történt változtatások megtekintése',
index d40410b..76e9eff 100644 (file)
@@ -286,7 +286,6 @@ $messages = array(
 'tog-numberheadings' => 'Ինքնաթվագրել վերնագրերը',
 'tog-showtoolbar' => 'Ցույց տալ խմբագրումների գործիքների վահանակը',
 'tog-editondblclick' => 'Խմբագրել էջերը կրկնակի մատնահարմամբ',
-'tog-editsection' => 'Ցույց տալ [խմբագրել] հղումը ամեն բաժնի համար',
 'tog-editsectiononrightclick' => 'Խմբագրել բաժինները վերնագրի աջ մատնահարմամբ',
 'tog-showtoc' => 'Ցույց տալ բովանդակությունը (3  կամ ավել վերնագրեր ունեցող էջերի համար)',
 'tog-rememberpassword' => 'Հիշել իմ մուտքագրված տվյալներն այս համակարգչում ($1 {{PLURAL:$1|օրից}} ոչ ավել ժամկետով)',
@@ -1236,7 +1235,6 @@ $3 մասնակիցը տվել է հետևյալ պատճառը. ''$2''",
 'rows' => 'Տողեր`',
 'columns' => 'Սյունակներ',
 'searchresultshead' => 'Որոնում',
-'resultsperpage' => 'Արդյունքների քանակը մեկ էջում.',
 'stub-threshold' => '<a href="#" class="stub">Պատառ հոդվածների հղումների</a> ձևավորման որոշման սահմանը.',
 'recentchangesdays' => 'Վերջին փոփոխություններում ցուցադրվող օրերի թիվը՝',
 'recentchangesdays-max' => '($1 {{PLURAL:$1|օրից|օրից}} ոչ ավել)',
@@ -2665,6 +2663,11 @@ $3
 
 # Special:Version
 'version' => 'ՄեդիաՎիքի տարբերակը',
+'version-ext-license' => 'Լիցենզիա',
+'version-ext-colheader-name' => 'Ընդլայնում',
+'version-ext-colheader-version' => 'Տարբերակ',
+'version-ext-colheader-license' => 'Լիցենզիա',
+'version-license-title' => 'Լիցենզիա $1-ի համար',
 'version-poweredby-credits' => "Այս վիքին աշխատում է '''[https://www.mediawiki.org/ MediaWiki]'''֊ով, copyright © 2001-$1 $2։",
 
 # Special:FileDuplicateSearch
index 1fb9b90..79af7e8 100644 (file)
@@ -156,7 +156,6 @@ $messages = array(
 'tog-numberheadings' => 'Numerar titulos automaticamente',
 'tog-showtoolbar' => 'Monstrar instrumentario de modification',
 'tog-editondblclick' => 'Modificar paginas con duple clic',
-'tog-editsection' => 'Activar le modification de sectiones con ligamines "[modificar]"',
 'tog-editsectiononrightclick' => 'Permitter modification de sectiones con clic-a-dextra sur titulos de section',
 'tog-showtoc' => 'Monstrar tabula de contento (in paginas con plus de 3 sectiones)',
 'tog-rememberpassword' => 'Memorar mi contrasigno in iste navigator (pro un maximo de $1 {{PLURAL:$1|die|dies}})',
@@ -1005,6 +1004,8 @@ Illo existe ja.',
 'content-not-allowed-here' => 'Le contento "$1" non es permittite in le pagina [[$2]]',
 'editwarning-warning' => 'Quitar iste pagina pote causar le perdita de omne modificationes que tu ha facite.
 Si tu ha aperite un session, tu pote disactivar iste aviso in le section "Modification" de tu preferentias.',
+'editpage-notsupportedcontentformat-title' => 'Formato de contento non supportate',
+'editpage-notsupportedcontentformat-text' => 'Le formato de contento $1 non es supportate per le modello de contento $2.',
 
 # Content models
 'content-model-wikitext' => 'wikitexto',
@@ -3225,7 +3226,7 @@ Omne ligamines posterior in le mesme linea es considerate como exceptiones, i.e.
 Si le file ha essite modificate ab su stato original, es possibile que alcun detalios non reflecte completemente le file modificate.',
 'metadata-expand' => 'Revelar detalios extense',
 'metadata-collapse' => 'Celar detalios extense',
-'metadata-fields' => 'Le campos de metadatos de imagine listate in iste message essera includite in le visualisation del pagina de imagine quando le tabula de metadatos es plicate.
+'metadata-fields' => 'Le campos de metadatos de imagine listate in iste message essera includite in le visualisation del pagina de imagine quando le tabella de metadatos es plicate.
 Le alteres essera initialmente celate.
 * make
 * model
@@ -4110,4 +4111,6 @@ De facto, illo expande quasi toto inter accolladas duple.',
 'expand_templates_generate_rawhtml' => 'Monstrar HTML brute',
 'expand_templates_preview' => 'Previsualisation',
 
+# Unknown messages
+'uploadinvalidxml' => 'Le codice XML in le file incargate non pote esser interpretate.',
 );
index 2431bed..28ad25c 100644 (file)
@@ -34,6 +34,7 @@
  * @author Remember the dot
  * @author Rex
  * @author Rv77ax
+ * @author StefanusRA
  * @author Urhixidur
  * @author William Surya Permana
  * @author לערי ריינהארט
@@ -356,7 +357,6 @@ $messages = array(
 'tog-numberheadings' => 'Beri nomor judul secara otomatis',
 'tog-showtoolbar' => 'Tampilkan bilah alat penyuntingan',
 'tog-editondblclick' => 'Sunting halaman dengan klik ganda',
-'tog-editsection' => 'Fungsikan penyuntingan subbagian melalui pranala [sunting]',
 'tog-editsectiononrightclick' => 'Fungsikan penyuntingan bagian dengan mengeklik kanan pada judul bagian',
 'tog-showtoc' => 'Perlihatkan daftar isi (untuk halaman yang mempunyai lebih dari 3 subbagian)',
 'tog-rememberpassword' => 'Ingat kata sandi saya di peramban ini (selama $1 {{PLURAL:$1|hari}})',
@@ -1755,7 +1755,7 @@ Jika Anda memberikannya, nama asli Anda akan digunakan untuk memberi pengenalan
 'rclistfrom' => 'Perlihatkan perubahan terbaru sejak $1',
 'rcshowhideminor' => '$1 suntingan kecil',
 'rcshowhidebots' => '$1 bot',
-'rcshowhideliu' => '$1 pengguna masuk log',
+'rcshowhideliu' => '$1 pengguna-pengguna terdaftar',
 'rcshowhideanons' => '$1 pengguna anon',
 'rcshowhidepatr' => '$1 suntingan terpatroli',
 'rcshowhidemine' => '$1 suntingan saya',
index 6b880d5..7a37c44 100644 (file)
@@ -46,7 +46,6 @@ $messages = array(
 'tog-numberheadings' => 'Automatiko a pabilangan dagiti paulo',
 'tog-showtoolbar' => 'Ipakita ti baras ti ramit ti panag-urnos',
 'tog-editondblclick' => 'Urnosen dagiti panid iti mamindua a panagpindut',
-'tog-editsection' => 'Pakabaelan ti panag-urnos ti paset babaen kadagiti silpo nga [urnosen]',
 'tog-editsectiononrightclick' => 'Pakabaelan ti panag-urnos ti paset babaen ti kanawan a panagpindut kadagiti titulo ti paset',
 'tog-showtoc' => 'Ipakita ti tabla dagiti linaon (para kadagiti panid nga adda ti ad-adu ngem dagiti 3 a paulo)',
 'tog-rememberpassword' => 'Laglagipem ti iseserrekko iti daytoy a pagbasabasa (iti kapaut nga $1 {{PLURAL:$1|aldaw|al-aldaw}})',
index 4f3c2a3..04b943f 100644 (file)
@@ -243,7 +243,6 @@ $messages = array(
 'tog-numberheadings' => 'Númera fyrirsagnir sjálfkrafa',
 'tog-showtoolbar' => 'Sýna breytingarverkfærastiku',
 'tog-editondblclick' => 'Breyta síðum þegar tvísmellt er',
-'tog-editsection' => 'Virkja hlutabreytingu með [breyta] tenglum',
 'tog-editsectiononrightclick' => 'Virkja hlutabreytingu með því að hægrismella á hlutafyrirsagnir',
 'tog-showtoc' => 'Sýna efnisyfirlit (fyrir síður með meira en 3 fyrirsagnir)',
 'tog-rememberpassword' => 'Muna innskráninguna mína í þessum vafra (í allt að $1 {{PLURAL:$1|dag|daga}})',
@@ -367,7 +366,7 @@ $messages = array(
 'listingcontinuesabbrev' => 'frh.',
 'index-category' => 'Raðaðar skrár',
 'noindex-category' => 'Óraðaðar skrár',
-'broken-file-category' => 'Síður með brotna myndatengla',
+'broken-file-category' => 'Síður með brotna skráartengla',
 
 'about' => 'Um',
 'article' => 'Efnissíða',
@@ -505,7 +504,7 @@ Sjá [[Special:Version|útgáfusíðuna]].',
 'youhavenewmessages' => 'Þú hefur fengið $1 ($2).',
 'youhavenewmessagesfromusers' => 'Þú hefur $1 frá {{PLURAL:$3|öðrum notanda|$3 notendum}} ($2)',
 'youhavenewmessagesmanyusers' => 'Þú hefur $1 frá mörgum notendum ($2).',
-'newmessageslinkplural' => '{{PLURAL:$1|ein|}} ný skilaboð',
+'newmessageslinkplural' => '{{PLURAL:$1|ný}} skilaboð',
 'newmessagesdifflinkplural' => '{{PLURAL:$1|síðasta breyting|síðustu breytingar}} spjallsíðunnar',
 'youhavenewmessagesmulti' => 'Þín bíða ný skilaboð á $1',
 'editsection' => 'breyta',
@@ -593,8 +592,8 @@ Líklegt er að einhver annar hafi gert það.',
 Engin skýring gefin.',
 'badtitle' => 'Slæmur titill',
 'badtitletext' => 'Umbeðin síðutitill er ógildur.',
-'perfcached' => 'Eftirfarandi er afrit af umbeðinni síðu og gæti því ekki verið nýjasta útgáfa hennar. Allt að {{PLURAL:$1|ein niðurstaða er aðgengileg|$1 niðurstöður eru aðgengilegar}} í skyndiminninu.',
-'perfcachedts' => 'Eftirfarandi gögn eru í skyndiminninu, og voru síðast uppfærð $1. Allt að {{PLURAL:$4|ein niðurstaða er aðgengileg|$4 niðurstöður eru aðgengilegar}} í skyndiminninu.',
+'perfcached' => 'Eftirfarandi er afrit af umbeðinni síðu og gæti því ekki verið nýjasta útgáfa hennar. Allt að $1 {{PLURAL:$1|niðurstaða er aðgengileg|niðurstöður eru aðgengilegar}} í skyndiminninu.',
+'perfcachedts' => 'Eftirfarandi gögn eru í skyndiminninu, og voru síðast uppfærð $1. Allt að $4 {{PLURAL:$4|niðurstaða er aðgengileg|niðurstöður eru aðgengilegar}} í skyndiminninu.',
 'querypage-no-updates' => 'Lokað er fyrir uppfærslur af þessari síðu. Gögn sett hér munu ekki vistast.',
 'viewsource' => 'Skoða efni',
 'viewsource-title' => 'Skoða efni $1',
@@ -720,7 +719,7 @@ Athugaðu hvort um innsláttavillu er að ræða eða [[Special:UserLogin/signup
 'login-userblocked' => 'Þessi notandi hefur verið settur í bann.  Innskráning ekki leyfð.',
 'wrongpassword' => 'Uppgefið lykilorð er rangt. Vinsamlegast reyndu aftur.',
 'wrongpasswordempty' => 'Lykilorðsreiturinn var auður. Vinsamlegast reyndu aftur.',
-'passwordtooshort' => 'Lykilorð skal vera að minnsta kosti {{PLURAL:$1 |einn stafur|$1 stafir}}.',
+'passwordtooshort' => 'Lykilorð skal vera að minnsta kosti $1 {{PLURAL:$1|stafur|stafir}}.',
 'password-name-match' => 'Þarf að lykilorð þitt sé öðruvísi notandanafni þínu',
 'password-login-forbidden' => 'Notkun þessa notendanafns og lykilorðs er ekki leyfileg.',
 'mailmypassword' => 'Endurstilla lykilorð',
@@ -728,10 +727,10 @@ Athugaðu hvort um innsláttavillu er að ræða eða [[Special:UserLogin/signup
 'passwordremindertext' => 'Einhver (líklegast þú, á vistfanginu $1) hefur beðið um að fá nýtt
 lykilorð fyrir {{SITENAME}} ($4). Tímabundið lykilorð fyrir notandann „$2“
 hefur verið búið til og er núna „$3“. Ef þetta er það sem þú vildir, þarfu að skrá
-þig inn og velja nýtt lykilorð.  Þetta tímabundna lykilorð rennur út eftir {{PLURAL:$5|einn dag|$5 daga}}.
+þig inn og velja nýtt lykilorð.  Þetta tímabundna lykilorð rennur út eftir $5 {{PLURAL:$5|dag|daga}}.
 
 Ef það var ekki þú sem fórst fram á þetta, eða ef þú mannst lykilorðið þitt,
-og vilt ekki lengur breyta því, skaltu hunsa þetta skilaboð og
+og vilt ekki lengur breyta því, skaltu hunsa þessi skilaboð og
 halda áfram að nota gamla lykilorðið.',
 'noemail' => 'Það er ekkert netfang skráð fyrir notandan "$1".',
 'noemailcreate' => 'Þú verður að skrá gilt netfang',
@@ -809,14 +808,14 @@ endursetningu lykilorðsins þíns fyrir {{SITENAME}} ($4). Aðgangur eftirfaran
 
 $2
 
-Ef þetta er það sem þú vildir, þarftu að skrá þig inn og velja nýtt lykilorð. {{PLURAL:$3|Tímabundna lykilorð|Tímabundnu lykilorðin}} renna út eftir {{PLURAL:$5|einn dag|$5 daga}}.
+Ef þetta er það sem þú vildir, þarftu að skrá þig inn og velja nýtt lykilorð. {{PLURAL:$3|Tímabundna lykilorðið rennur|Tímabundnu lykilorðin renna}} út eftir $5 {{PLURAL:$5|dag|daga}}.
 
 Ef það varst ekki þú sem fórst fram á þetta, eða ef þú mannst lykilorðið þitt, og villt ekki lengur breyta því, skaltu hunsa þessi skilaboð og halda áfram að nota gamla lykilorðið.',
 'passwordreset-emailtext-user' => 'Notandinn $1 á {{SITENAME}} hefur beðið um endursetningu lykilorðsins þíns fyrir {{SITENAME}} ($4). Aðgangur eftirfarandi {{PLURAL:$3|notanda er|notendum eru}} tengd þessu netfangi:
 
 $2
 
-Ef þetta er það sem þú vildir, þarftu að skrá þig inn og velja nýtt lykilorð. {{PLURAL:$3|Tímabundna lykilorð|Tímabundnu lykilorðin}} renna út eftir {{PLURAL:$5|einn dag|$5 daga}}.
+Ef þetta er það sem þú vildir, þarftu að skrá þig inn og velja nýtt lykilorð. {{PLURAL:$3|Tímabundna lykilorðið rennur|Tímabundnu lykilorðin renna}} út eftir $5 {{PLURAL:$5|dag|daga}}.
 
 Ef það varst ekki þú sem fórst fram á þetta, eða ef þú mannst lykilorðið þitt, og villt ekki lengur breyta því, skaltu hunsa þessi skilaboð og halda áfram að nota gamla lykilorðið.',
 'passwordreset-emailelement' => 'Notendanafn: $1
@@ -1005,7 +1004,7 @@ Lausn er í gildi sem leyfir þér að breyta síðum: Stafatákn sem eru ekki 
 Ef þú vilt ekki að textanum verði breytt skaltu ekki senda hann inn hér.<br />
 Þú lofar okkur einnig að þú hafir skrifað þetta sjálfur, að efnið sé í almannaeigu eða að það heyri undir frjálst leyfi. (sjá $1).
 '''EKKI SENDA INN HÖFUNDARRÉTTARVARIРEFNI ÁN LEYFIS RÉTTHAFA!'''",
-'longpageerror' => "'''VILLA: Textinn sem þú sendir inn er {{PLURAL:$1|eitt kílóbæti|$1 kílóbæti}} að lengd, en hámarkið er {{PLURAL:$2|eitt kílóbæti|$2 kílóbæti}}. Ekki er hægt að vista textann.'''",
+'longpageerror' => "'''VILLA: Textinn sem þú sendir inn er $1 {{PLURAL:$1|kílóbæti|kílóbæti}} að lengd, en hámarkið er $2 {{PLURAL:$2|kílóbæti|kílóbæti}}. Ekki er hægt að vista textann.'''",
 'readonlywarning' => "'''AÐVÖRUN: Gagnagrunninum hefur verið læst til að unnt sé að framkvæma viðhaldsaðgerðir, svo þú getur ekki vistað breytingar þínar núna.'''
 Þú ættir að klippa og líma textann yfir í textaskjal til þess að geyma hann til seinni tíma.
 
@@ -1063,7 +1062,7 @@ Ef þú ert skráður inn, þá getur þú óvirkjað þessi skilaboð í „Bre
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''Viðvörun:''' Þessi síða inniheldur of mörg vinnslufrek aðgerðar þáttunar köll.
 
-Hún ætti að innihalda minna en $2 {{PLURAL:$2|kall|köll}}, en {{PLURAL:$1|er nú eitt kall|eru nú $1 köll}}.",
+Hún ætti að innihalda minna en $2 {{PLURAL:$2|kall|köll}}, en {{PLURAL:$1|er nú $1 kall|eru nú $1 köll}}.",
 'expensive-parserfunction-category' => 'Síður með of mörg vinnslufrek aðgerðar þáttunar köll',
 'post-expand-template-inclusion-warning' => "'''Viðvörun:''' Sniðið tekur of mikið pláss.
 Hluti sniðsins verður ekki með.",
@@ -1265,9 +1264,9 @@ Athugaðu að með því að nota flakktenglana er þessi dálkur endurstilltur.
 'showhideselectedversions' => 'Sýna/fela valdar breytingar',
 'editundo' => 'Taka aftur þessa breytingu',
 'diff-empty' => '(Enginn munur)',
-'diff-multi' => '({{PLURAL:$1|Ein millibreyting ekki sýnd|$1 millibreytingar ekki sýndar}} frá {{PLURAL:$2|notanda|$2 notendum}}.)',
-'diff-multi-manyusers' => '({{PLURAL:$1|Ein millibreyting ekki sýnd|$1 millibreytingar ekki sýndar}} frá fleiri en {{PLURAL:$2|einum notanda|$2 notendum}}.)',
-'difference-missing-revision' => '{{PLURAL:$2|Ein útgáfa|$2 útgáfur}} samanburðarins ($1) {{PLURAL:$2|fannst|fundust}} ekki.
+'diff-multi' => '$1 ({{PLURAL:$1|millibreyting ekki sýnd|millibreytingar ekki sýndar}} frá $2 {{PLURAL:$2|notanda|notendum}}.)',
+'diff-multi-manyusers' => '($1 {{PLURAL:$1|millibreyting ekki sýnd|millibreytingar ekki sýndar}} frá fleiri en $2 {{PLURAL:$2|notanda|notendum}}.)',
+'difference-missing-revision' => '$2 {{PLURAL:$2|útgáfa|útgáfur}} samanburðarins ($1) {{PLURAL:$2|fannst|fundust}} ekki.
 
 Þetta gerist oftast þegar úreldur samanburðartengill tengir á síðu sem hefur verið eytt.
 Frekari upplýsingar eru í [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} eyðingarskránni].',
@@ -1813,7 +1812,7 @@ Ef vandamálið lagast ekki, hafðu samband við [[Special:ListUsers/sysop|stjó
 'backend-fail-closetemp' => 'Mistókst að loka tímabundinni skrá.',
 'backend-fail-read' => 'Mistókst að lesa skrá $1.',
 'backend-fail-create' => 'Mistókst að skrifa skrá $1.',
-'backend-fail-maxsize' => 'Mistókst að skrifa skránna $1 því hún er stærri en {{PLURAL:$2|eitt bæti|$2 bæti}}.',
+'backend-fail-maxsize' => 'Mistókst að skrifa skránna „$1” því hún er stærri en $2 {{PLURAL:$2|bæti}}.',
 'backend-fail-readonly' => 'Gagnabankann "$1" er engöngu hægt að lesa í augnablikinu. Ástæðan sem var gefin er: "\'\'$2\'\'"',
 'backend-fail-synced' => 'Skráin $1 er í ósamkvæmu ástandi innan innri geymslubakenda',
 'backend-fail-connect' => 'Mistókst að tengjast gagnabankanum "$1".',
@@ -2513,7 +2512,7 @@ Innihald greinarinnar er einungis aðgengilegt möppudýrum.',
 'undeletecomment' => 'Ástæða:',
 'undeletedrevisions' => '$1 {{PLURAL:$1|breyting endurvakin|breytingar endurvaktar}}',
 'undeletedrevisions-files' => '$1 {{PLURAL:$1|breyting|breytingar}} og $2 {{PLURAL:$2|skrá|skrár}} endurvaktar',
-'undeletedfiles' => '{{PLURAL:$1|Ein skrá endurvakin|$1 skrár endurvaktar}}',
+'undeletedfiles' => '$1 {{PLURAL:$1|skrá endurvakin|skrár endurvaktar}}',
 'cannotundelete' => 'Ekki var hægt að afturkalla eyðingu.
 $1',
 'undeletedpage' => "'''$1 var endurvakin'''
@@ -3704,7 +3703,7 @@ Vinsamlegast staðfestu að þú viljir endurvekja hana.',
 'watchlistedit-normal-explain' => 'Titlarnir á vaktlistanum þínum er sýndir fyrir neðan.
 Til að fjarlægja titil hakaðu í kassann við hliðina á honum og smelltu á „{{int:Watchlistedit-normal-submit}}“. Þú getur einnig [[Special:EditWatchlist/raw|breytt honum opnum]].',
 'watchlistedit-normal-submit' => 'Fjarlægja titla',
-'watchlistedit-normal-done' => '{{PLURAL:$1|Ein síða var fjarlægð|$1 síður voru fjarlægðar}} af vaktlistanum þínum:',
+'watchlistedit-normal-done' => '$1 {{PLURAL:$1|síða var fjarlægð|síður voru fjarlægðar}} af vaktlistanum þínum:',
 'watchlistedit-raw-title' => 'Breyta opnum vaktlistanum',
 'watchlistedit-raw-legend' => 'Breyta opnum vaktlistanum',
 'watchlistedit-raw-explain' => 'Titlarnir á vaktlistanum þínum eru sýndir hér fyrir neðan og þeim er hægt að breyta með því að bæta við og taka út af honum;
index 4701a10..e0f1ff4 100644 (file)
@@ -303,7 +303,6 @@ $messages = array(
 'tog-numberheadings' => 'Numerazione automatica dei titoli di sezione',
 'tog-showtoolbar' => 'Mostra la barra degli strumenti di modifica',
 'tog-editondblclick' => 'Modifica delle pagine tramite doppio clic',
-'tog-editsection' => 'Modifica delle sezioni tramite il collegamento [modifica]',
 'tog-editsectiononrightclick' => 'Modifica delle sezioni tramite clic destro sul titolo',
 'tog-showtoc' => "Mostra l'indice (per le pagine con più di 3 sezioni)",
 'tog-rememberpassword' => 'Ricorda la password su questo browser (per un massimo di $1 {{PLURAL:$1|giorno|giorni}})',
@@ -846,6 +845,8 @@ Attendi $1 e riprova in seguito.',
 'retypenew' => 'Riscrivi la nuova password:',
 'resetpass_submit' => 'Imposta la password e accedi al sito',
 'changepassword-success' => 'La password è stata modificata correttamente!',
+'changepassword-throttled' => 'Sono stati effettuati troppi tentativi di accesso in breve tempo.
+Attendi $1 e riprova in seguito.',
 'resetpass_forbidden' => 'Non è possibile modificare le password',
 'resetpass-no-info' => "Devi aver effettuato l'accesso per accedere a questa pagina direttamente.",
 'resetpass-submit-loggedin' => 'Cambia password',
@@ -901,6 +902,8 @@ Password temporanea: $2',
 'changeemail-password' => 'La password su {{SITENAME}}:',
 'changeemail-submit' => 'Modifica e-mail',
 'changeemail-cancel' => 'Annulla',
+'changeemail-throttled' => 'Sono stati effettuati troppi tentativi di accesso.
+Attendi $1 e riprova in seguito.',
 
 # Special:ResetTokens
 'resettokens' => 'Reimposta token',
@@ -1109,6 +1112,8 @@ Esiste già.',
 'content-not-allowed-here' => 'Contenuto in "$1" non consentito nella pagine [[$2]]',
 'editwarning-warning' => 'Lasciare questa pagina potrebbe causare la perdita di tutte le modifiche fatte.
 Se hai effettuato l\'accesso, puoi disattivare questo avviso nella sezione "Casella di modifica" delle tue preferenze.',
+'editpage-notsupportedcontentformat-title' => 'Formato contenuto non supportato',
+'editpage-notsupportedcontentformat-text' => 'Il formato del contenuto $1 non è supportato dal modello di contenuto $2.',
 
 # Content models
 'content-model-wikitext' => 'wikitesto',
@@ -1353,6 +1358,7 @@ I dettagli possono essere trovati nel [{{fullurl:{{#Special:Log}}/delete|page={{
 'search-result-score' => 'Rilevanza: $1%',
 'search-redirect' => '(redirect $1)',
 'search-section' => '(sezione $1)',
+'search-file-match' => '(corrispondenza nel contenuto del file)',
 'search-suggest' => 'Forse cercavi: $1',
 'search-interwiki-caption' => 'Progetti fratelli',
 'search-interwiki-default' => 'Risultati da $1:',
@@ -2441,7 +2447,7 @@ Consultare il log delle $2 per un elenco delle pagine cancellate di recente.',
 'delete-edit-reasonlist' => 'Modifica i motivi di cancellazione',
 'delete-toobig' => 'La cronologia di questa pagina è molto lunga (oltre $1 {{PLURAL:$1|revisione|revisioni}}). La sua cancellazione è stata limitata per evitare di creare accidentalmente dei problemi di funzionamento al database di {{SITENAME}}.',
 'delete-warning-toobig' => 'La cronologia di questa pagina è molto lunga (oltre $1 {{PLURAL:$1|revisione|revisioni}}). La sua cancellazione può creare dei problemi di funzionamento al database di {{SITENAME}}; procedere con cautela.',
-'deleting-backlinks-warning' => "'''Attenzione:''' altre pagine contengono collegamenti alla pagina che stai per cancellare.",
+'deleting-backlinks-warning' => "'''Attenzione:''' altre pagine contengono collegamenti o inclusioni alla pagina che stai per cancellare.",
 
 # Rollback
 'rollback' => 'Annulla le modifiche',
@@ -2736,7 +2742,7 @@ Consultare l'[[Special:BlockList|elenco dei blocchi]] per l'elenco dei bandi o b
 'range_block_disabled' => 'La possibilità di bloccare intervalli di indirizzi IP non è attiva al momento.',
 'ipb_expiry_invalid' => 'Durata o scadenza del blocco non valida.',
 'ipb_expiry_temp' => 'I blocchi dei nomi utenti nascosti dovrebbero essere infiniti',
-'ipb_hide_invalid' => "Impossibile cancellare l'account; potrebbe avere troppe modifiche.",
+'ipb_hide_invalid' => 'Impossibile sopprimere questa utenza; ha più di {{PLURAL:$1|una modifica|$1 modifiche}}.',
 'ipb_already_blocked' => 'L\'utente "$1" è già bloccato',
 'ipb-needreblock' => "L'utente $1 è già bloccato. Modificare le impostazioni?",
 'ipb-otherblocks-header' => '{{PLURAL:$1|Altro blocco|Altri blocchi}}',
@@ -3051,6 +3057,7 @@ Tutte le operazioni di importazione trans-wiki sono registrate nel [[Special:Log
 'print.css' => "/* Gli stili CSS inseriti qui si applicano all'output in stampa */",
 'noscript.css' => '/ * Gli stili CSS inseriti qui si applicano agli utenti che hanno JavaScript disabilitato * /',
 'group-autoconfirmed.css' => '/ * Gli stili CSS inseriti qui si applicheranno solo ad utenti autoconvalidati * /',
+'group-user.css' => '/ * Gli stili CSS inseriti qui si applicheranno solo ad utenti registrati * /',
 'group-bot.css' => '/ * Gli stili CSS inseriti qui si applicheranno solo ai bot * /',
 'group-sysop.css' => '/ * Gli stili CSS inseriti qui si applicheranno solo agli amministratori/sysop * /',
 'group-bureaucrat.css' => '/ * Gli stili CSS inseriti qui si applicheranno solo ai burocrati * /',
@@ -3062,6 +3069,7 @@ Tutte le operazioni di importazione trans-wiki sono registrate nel [[Special:Log
 'modern.js' => '/* Il codice JavaScript inserito qui viene caricato dagli utenti che usano la skin Modern */',
 'vector.js' => '/* Il codice JavaScript inserito qui viene caricato dagli utenti che usano la skin Vector */',
 'group-autoconfirmed.js' => '/ * Il codice JavaScript inserito qui viene caricato solo per gli utenti autoconvalidati * /',
+'group-user.js' => '/ * Il codice JavaScript inserito qui viene caricato solo per gli utenti registrati * /',
 'group-bot.js' => '/ * Il codice JavaScript inserito qui viene caricato solo per i bot * /',
 'group-sysop.js' => '/ * Il codice JavaScript inserito qui viene caricato solo per gli amministratori/sysop * /',
 'group-bureaucrat.js' => '/ * Il codice JavaScript inserito qui viene caricato solo per i burocrati * /',
@@ -4142,4 +4150,6 @@ vale a dire praticamente tutto ciò che si trova tra doppie parentesi graffe.',
 'expand_templates_generate_rawhtml' => 'Mostra HTML',
 'expand_templates_preview' => 'Anteprima',
 
+# Unknown messages
+'uploadinvalidxml' => 'Il codice XML nel file caricato non può essere elaborato.',
 );
index 39bf4a7..3cca420 100644 (file)
@@ -379,7 +379,6 @@ $messages = array(
 'tog-numberheadings' => '見出しに番号を自動的に振る',
 'tog-showtoolbar' => '編集用のツールバーを表示',
 'tog-editondblclick' => 'ダブルクリックでページを編集',
-'tog-editsection' => '[編集]リンクから節を編集できるようにする',
 'tog-editsectiononrightclick' => '節見出しの右クリックで節を編集できるようにする',
 'tog-showtoc' => '目次を表示 (ページに見出しが4つ以上ある場合)',
 'tog-rememberpassword' => 'このブラウザーにログイン情報を保存 (最長 $1 {{PLURAL:$1|日|日間}})',
@@ -1235,6 +1234,8 @@ $1または他の[[{{MediaWiki:Grouppage-sysop}}|管理者]]にこのブロッ
 'content-not-allowed-here' => 'ページ [[$2]] では、「$1」コンテンツは許可されていません',
 'editwarning-warning' => 'このページを離れると、あなたが行なった変更がすべて失われてしまうかもしれません。
 ログインしている場合、個人設定の「編集」タブでこの警告を表示しないようにすることができます。',
+'editpage-notsupportedcontentformat-title' => '対応していないコンテンツ形式',
+'editpage-notsupportedcontentformat-text' => 'コンテンツ モデル $2 は、コンテンツ形式 $1 に対応していません。',
 
 # Content models
 'content-model-wikitext' => 'ウィキテキスト',
@@ -1487,6 +1488,7 @@ $1",
 'search-result-score' => '関連度: $1%',
 'search-redirect' => '($1からのリダイレクト)',
 'search-section' => '($1の節)',
+'search-file-match' => '(ファイルの内容との一致)',
 'search-suggest' => 'もしかして: $1',
 'search-interwiki-caption' => '姉妹プロジェクト',
 'search-interwiki-default' => '$1の結果:',
@@ -2626,7 +2628,7 @@ $UNWATCHURL
 'delete-warning-toobig' => 'このページには、 $1版を超える編集履歴があります。
 削除すると、{{SITENAME}}のデータベース処理に大きな負荷がかかります。
 十分に注意してください。',
-'deleting-backlinks-warning' => "'''警告:''' 削除しようとしているページは、他のページからリンクされています。",
+'deleting-backlinks-warning' => "'''è­¦å\91\8a:''' å\89\8aé\99¤ã\81\97ã\82\88ã\81\86ã\81¨ã\81\97ã\81¦ã\81\84ã\82\8bã\83\9aã\83¼ã\82¸ã\81¯ã\80\81ä»\96ã\81®ã\83\9aã\83¼ã\82¸ã\81\8bã\82\89ã\83ªã\83³ã\82¯ã\81¾ã\81\9fã\81¯å\8f\82ç\85§èª­ã\81¿è¾¼ã\81¿ã\81\95ã\82\8cã\81¦ã\81\84ã\81¾ã\81\99ã\80\82",
 
 # Rollback
 'rollback' => '編集を巻き戻し',
@@ -2935,7 +2937,7 @@ $1 のブロックの理由は「''$2''」です。",
 '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|ブロック}}',
@@ -4503,4 +4505,6 @@ MediaWikiは、有用であることを期待して配布されていますが
 'expand_templates_generate_rawhtml' => 'HTML ソースを表示',
 'expand_templates_preview' => 'プレビュー',
 
+# Unknown messages
+'uploadinvalidxml' => 'アップロードされたファイルに含まれる XML が構文解析できませんでした。',
 );
index 08fdcc6..ba9e640 100644 (file)
@@ -63,7 +63,6 @@ $messages = array(
 'tog-numberheadings' => 'Wènèhana nomer judul secara otomatis',
 'tog-showtoolbar' => 'Tuduhna <em>toolbar</em> (batang piranti) panyuntingan (mbutuhaké JavaScript)',
 'tog-editondblclick' => 'Sunting kaca nganggo klik ping loro (mbutuhaké JavaScript)',
-'tog-editsection' => 'Fungsèkna panyuntingan sub-bagian ngliwati pranala [sunting]',
 'tog-editsectiononrightclick' => 'Fungsèkna panyuntingan sub-bagian mawa klik-tengen ing judul bagian (mbutuhaké JavaScript)',
 'tog-showtoc' => 'Tuduhna daftar isi (kanggo kaca sing nduwé luwih saka 3 sub-bagian)',
 'tog-rememberpassword' => 'Émut tembung sandi kula ing peramban punika (salebeting $1 {{PLURAL:$1|dinten|dinten}})',
@@ -357,7 +356,7 @@ $1',
 'nstab-main' => 'Artikel',
 'nstab-user' => 'Panganggo',
 'nstab-media' => 'Media',
-'nstab-special' => 'Istiméwa',
+'nstab-special' => 'Astamiwa',
 'nstab-project' => 'Proyek',
 'nstab-image' => 'Gambar',
 'nstab-mediawiki' => 'Pariwara',
@@ -1456,9 +1455,9 @@ Alamat layang èlèktronik Sampéyan ora dituduhaké nalika wong liya ngubungi S
 'rc-old-title' => 'wigatiné digawé minangka "$1"',
 
 # Recent changes linked
-'recentchangeslinked' => 'Pranala Pilihan',
-'recentchangeslinked-feed' => 'Pranala Pilihan',
-'recentchangeslinked-toolbox' => 'Pranala Pilihan',
+'recentchangeslinked' => 'Pangowahan sing terkait',
+'recentchangeslinked-feed' => 'Pangowahan sing terkait',
+'recentchangeslinked-toolbox' => 'Pangowahan sing terkait',
 'recentchangeslinked-title' => 'Owah-owahan sing ana gandhèngané karo "$1"',
 'recentchangeslinked-summary' => "Kaca astaméwa (kaca kusus) iki mènèhi daftar owah-owahan pungkasan ing kaca-kaca sing kagandhèng (utawa anggota sawijining kateogri). Kaca sing [[Special:Watchlist|panjenengan awasi]] ditandhani '''kandel'''.",
 'recentchangeslinked-page' => 'Jeneng kaca:',
@@ -3611,7 +3610,7 @@ Anda seharusnya telah menerima [{{SERVER}}{{SCRIPTPATH}}/COPYING salinan Lisensi
 'fileduplicatesearch-noresults' => 'Ora ana berkas mawa jeneng "$1" ditemokaké.',
 
 # Special:SpecialPages
-'specialpages' => 'Kaca istiméwa',
+'specialpages' => 'Kaca astamiwa',
 'specialpages-note-top' => 'Katrangan',
 'specialpages-note' => '* Kaca astamiwa biasa.
 * <span class="mw-specialpagerestricted">Kaca astamiwa kawatesan.</span>',
index 8e35e75..dc0d876 100644 (file)
@@ -178,7 +178,6 @@ $messages = array(
 'tog-numberheadings' => 'ავტომატურად დანომრე ქვესათაურები',
 'tog-showtoolbar' => 'რედაქტირების პანელის ჩვენება',
 'tog-editondblclick' => 'გვერდების რედაქტირება ორმაგი დაწკაპუნებით',
-'tog-editsection' => 'სექციის რედაქტირების ნებართვა [რედაქტირებული] ბმულების გავლით',
 'tog-editsectiononrightclick' => 'სექციის რედაქტირების ნებართვა სათაურებზე მარჯვენა ღილაკზე დაჭერით',
 'tog-showtoc' => 'აჩვენე სარჩევი (სამ ქვესათაურზე მეტის მქონე გვერდებისთვის)',
 'tog-rememberpassword' => 'დამიმახსოვრე ამ კომპიუტერზე (მაქსიმუმ $1 {{PLURAL:$1|დღე|დღე}})',
@@ -2324,6 +2323,7 @@ $UNWATCHURL
 'delete-warning-toobig' => 'ამ გვერდს ძალიან გრძელი ისტორია გააჩნია,  $1 {{PLURAL:$1|ვერსიაზე|ვერსიიებზე|ვერსიებზე}} მეტი.
 მისმა წაშლამ შესაძლოა გამოიწვიოს საიტის მონაცემთა ბაზის  {{SITENAME}} არაკორექტული მუშაობა;
 იმოქმედეთ სიფრთხილით.',
+'deleting-backlinks-warning' => "'''გაფრთხილება:''' რამდენიმე სხვა გვერდი დაკავშირებულია ამ წასაშლელ გვერდთან.",
 
 # Rollback
 'rollback' => 'ცვლილებების გაუქმება',
index 488ea1e..c407c4f 100644 (file)
@@ -54,7 +54,6 @@ $messages = array(
 'tog-numberheadings' => 'Izwal ɣur-sen imḍanen mebla ma serseɣ-iten',
 'tog-showtoolbar' => 'Ssken tafeggagt n ifecka n ubeddel',
 'tog-editondblclick' => 'Beddel isebtar mi wekkiɣ snat n tikwal',
-'tog-editsection' => 'Eǧǧ abeddel n umur s yizdayen [beddel]',
 'tog-editsectiononrightclick' => 'Ssermed abeddel n tigezmi s ukliki ayeffus ɣef izwal',
 'tog-showtoc' => 'Ssken agbur (i isebtar i yesɛan kter n 3 izwalen)',
 'tog-rememberpassword' => 'Cfu ɣef yisem n umseqdac inu di uselkim-agi (i afellay n $1 {{PLURAL:$1|ass|ussan}})',
@@ -71,7 +70,7 @@ $messages = array(
 'tog-enotifrevealaddr' => 'Ssken e-mail inu asmi yettwazen email n talɣut',
 'tog-shownumberswatching' => 'Ssken geddac yellan n yimseqdacen iɛessasen',
 'tog-oldsig' => 'Azmul yellan :',
-'tog-fancysig' => 'ǧǧ azmul am yettili (war azday awurman)',
+'tog-fancysig' => 'Eǧǧ azmul am yettili (war azday awurman)',
 'tog-uselivepreview' => 'Sseqdec askan arurad (Experimental)',
 'tog-forceeditsummary' => 'Ini-iyi-d mi sskecmeɣ agzul amecluc',
 'tog-watchlisthideown' => 'Ffer ibeddlen inu seg wumuɣ n uɛessi inu',
@@ -547,31 +546,34 @@ G leɛnaya-k, kcem tikelt nniḍen yis-s.',
 ur tezmireḍ ara ad tesɛuḍ awal n tbaḍnit i tettuḍ.',
 'eauthentsent' => 'Yiwen email yetweceggeε ar tansa id efkeḍ.
 Uqbel ad n-ceggeε email nniḍen, ilaq ad ḍfereḍ ayen yellan deg email dɣa ad sergegeḍ amiḍan agi d win inek(m).',
-'throttled-mailpassword' => 'Asmekti n wawal n uɛaddi yettwazen yagi deg {{PLURAL:$1|asrag agi aneggaru| $1 isragen agi ineggura}}. Asmekti n wawal n uɛaddi yettwazen tikelt kan mkul $1 swayeɛ. deg {{PLURAL:$1|asrag|azilal n $1 isragen}}.',
+'throttled-mailpassword' => 'Neceggɛed yakan tirawt n uwennez i awal-ik/im n uɛaddi deg {{PLURAL:$1|asrag agi aneggaru|$1 isragen agi ineggura}}. Awennez n uwal n uɛaddi yettwaceggaɛ tikelt kan deg {{PLURAL:$1|asrag|$1 isragen}}.',
 'mailerror' => 'Agul asmi yettwazen e-mail: $1',
 'acct_creation_throttle_hit' => 'Amdan i seqdacen tansa IP inek/inem yesnulfud {{PLURAL:$1|yiwen amiḍan|$1 imiḍanen}} deg 24 izragen agi ineggura, negweḍ ar talast n turagt deg azilal agi n wakud.',
-'emailauthenticated' => 'Tansa e-mail inek/inem tesesteb ass n $2 af $3.',
-'emailnotauthenticated' => 'Tansa e-mail inek mazal ur tettuɛqel. Ḥedd e-mail ur ttwazen i ulaḥedd n iḍaɣaren-agi.',
+'emailauthenticated' => 'Tansa e-mail inek/inem tesergeg ass n $2 af $3.',
+'emailnotauthenticated' => 'Tansa email inek mazal ur tettuɛqel. Ur d netceggaɛ ara email i yal tiseɣnin agi.',
 'noemailprefs' => 'Efk tansa e-mail iwakken ad leḥḥun iḍaɣaren-nni.',
 'emailconfirmlink' => 'Sentem tansa e-mail inek',
 'invalidemailaddress' => 'Tansa e-mail-agi ur telhi, ur tesɛi ara taseddast n lɛali. Ssekcem tansa e-mail s taseddast n lɛali neɣ ur tefkiḍ acemma.',
 'cannotchangeemail' => 'Ur t-zemreḍ ara ad beddeleḍ tansa e-mail deg uwiki agi.',
 'emaildisabled' => 'Asmel agi ur yezmer ara ad i cegaɛ e-mail.',
 'accountcreated' => 'Isem n wemseqdac yettwaxleq',
-'accountcreatedtext' => 'Isem n wemseqdac i $1 yettwaxleq.',
+'accountcreatedtext' => 'Amiḍan n umseqdac i [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|amyannan]]) yexelqed.',
 'createaccount-title' => 'Asnulfu n umiḍan i {{SITENAME}}',
 'createaccount-text' => 'Albeɛḍ yesnulfu-d amiḍan i tansa e-amil inek/inem ɣef {{SITENAME}} ($4) s-isem n-useqdac « $2 », s awal n uɛaddi « $3 ».
 Ilaq tura ad lldiḍ taɣimit dɣa ad beddeleḍ awal ik/im n uɛaddi.',
 'usernamehasherror' => 'Isem n useqdac ur yezmer ara ad i sɛu  isekkilen n ugeddeḥ',
 'login-throttled' => 'Tɛerdeḍ ad qqeneḍ aṭas tiqwal deg dqiqat agi iɛddan.
-Ilaq ad rǧuḍ ciṭaḥ uqbel ad ɛerdeḍ tikkelt nniḍen.',
+Ilaq ad rǧuḍ $1 uqbel ad ɛerdeḍ tikkelt nniḍen.',
 'login-abort-generic' => 'Taremt ik/im n tuqqna tebrir',
 'loginlanguagelabel' => 'Tutlayt: $1',
 'suspicious-userlogout' => 'Asuter n usenser yugwi acku yella ugur s iminig naɣ s tazarkatut n uqeddac proxy.',
+'createacct-another-realname-tip' => '* Isem n ṣṣeḥ d-axeṭran.
+Ma teɛzemeḍ a t-tefkeḍ, ad yettuseqdac iwakken ad snen medden anwa yuran tikkin inek.',
 
 # Email sending
 'php-mail-error-unknown' => 'anezri warisem deg tawuri mail() n PHP',
 'user-mail-no-addy' => 'Ɛred ad icegaɛ e-mail war tansa e-mail',
+'user-mail-no-body' => 'Arram n uceggaɛ email s tafekka tilemt neɣ d-awezlan aṭas.',
 
 # Change password dialog
 'changepassword' => 'Beddel awal n tbaḍnit',
@@ -582,7 +584,7 @@ Ilaq ad rǧuḍ ciṭaḥ uqbel ad ɛerdeḍ tikkelt nniḍen.',
 'newpassword' => 'Awal n tbaḍnit amaynut:',
 'retypenew' => 'Ɛiwed ssekcem n tbaḍnit amaynut:',
 'resetpass_submit' => 'Eg awal n tbaḍnit u kcem',
-'changepassword-success' => 'Awal n tbaḍnit yettubeddel! Qrib ad tkecmeḍ...',
+'changepassword-success' => 'Awal n uɛaddi yettubeddel s lerbaḥ !',
 'resetpass_forbidden' => 'Ur zemreḍ ara ad beddeleḍ awalen n uɛaddi',
 'resetpass-no-info' => 'Ilaq ad qqeneḍ iwakken ad ẓṛeḍ asebter agi.',
 'resetpass-submit-loggedin' => 'Beddel awal n uɛaddi',
@@ -590,32 +592,36 @@ Ilaq ad rǧuḍ ciṭaḥ uqbel ad ɛerdeḍ tikkelt nniḍen.',
 'resetpass-wrong-oldpass' => 'Awal n uɛaddi ur i seɣbel ara.
 Ahat ilaq ad beddeleḍ awal ik/im n uɛaddi naɣ ad ssutereḍ awal n uɛaddi amaynut.',
 'resetpass-temp-password' => 'Awal n uɛaddi amakud',
+'resetpass-abort-generic' => 'Asiɣzef yesemmewet abeddel n uwal n uɛaddi.',
 
 # Special:PasswordReset
 'passwordreset' => 'Awennez tikkelt nniḍen n awal uɛaddi',
+'passwordreset-text-one' => 'Ččur tiferkit agi iwakken ad wennezeḍ awal-ik/im n uɛaddi.',
+'passwordreset-text-many' => '{{PLURAL:$1|Čcur yiwet n tiɣwezza iwakken ad rmeseḍ awal n uɛaddi uɛḍil deg tirawt.}}',
 'passwordreset-legend' => 'Awennez tikkelt nniḍen n awal uɛaddi',
 'passwordreset-disabled' => 'Awennez n awal uɛaddi yensa deg uwiki agi.',
+'passwordreset-emaildisabled' => 'Tiseɣnin email nsant ɣef wiki agi.',
 'passwordreset-username' => 'Isem n useqdac',
 'passwordreset-domain' => 'Talɣut :',
 'passwordreset-capture' => 'Ẓeṛ tirawt ?',
 'passwordreset-capture-help' => 'Lukan ad tekkiḍ ɣef texxamt agi, tirawt (deg-es awal n uɛaddi akudan) att beqqeḍ dɣa ad tetwetceggaɛ i useqdac.',
 'passwordreset-email' => 'Tansa e-mail :',
 'passwordreset-emailtitle' => 'Tilɣa n umiḍan ɣef {{SITENAME}}',
-'passwordreset-emailtext-ip' => 'Yiwen (Ahat kečč/kem, seg tansa IP $1) yessutered asiwel n tilɣa n umiḍan inek/inem i {{SITENAME}} ($4). {{PLURAL:$3|Amiḍan n useqdac agi yedrew|imiḍanen n iseqdacen agi drewen}} s tansa e-mail agi :
+'passwordreset-emailtext-ip' => 'Yiwen (Ahat kečč/kem, seg tansa IP $1) yessutered awennez n awal n uɛaddi i {{SITENAME}} ($4). {{PLURAL:$3|Amiḍan n useqdac agi yeqqen|imiḍanen n iseqdacen agi qqenen}} s tansa e-mail agi :
 
 $2
 
-{{PLURAL:$3|Awal n uɛaddi agi ad i aff tasewti-s|Awalen n uɛaddi agi ad affen taseweti nsen}} deg {{PLURAL:$5|yiwen ass|$5 ussan}}. Ilaq tura ad qqeneḍ dɣa ad freneḍ awal n uɛaddi amaynut. Lukan mačči d kečč/kem i xedmen asuter agi, naɣ tecfiḍ tura i awal n uɛaddi inek/inem, tzemreḍ ad eǧǧeḍ izen agi.',
-'passwordreset-emailtext-user' => 'Aseqdac $1 ɣef {{SITENAME}} yessutered asiwel n tilɣa n umiḍan inek/inem i {{SITENAME}} ($4). {{PLURAL:$3|Amiḍan n useqdac agi yedrew|imiḍanen n iseqdacen agi drewen}} s tansa e-mail agi :
+{{PLURAL:$3|Awal n uɛaddi uɛḍil agi ad i aff tasewti-s|Awalen n uɛaddi uɛḍilen agi ad affen taseweti nsen}} deg {{PLURAL:$5|yiwen ass|$5 ussan}}. Ilaq tura ad qqeneḍ dɣa ad freneḍ awal n uɛaddi amaynut. Lukan mačči d kečč/kem i xedmen asuter agi, naɣ tecfiḍ tura i awal n uɛaddi inek/inem, tzemreḍ ad eǧǧeḍ izen agi.',
+'passwordreset-emailtext-user' => 'Aseqdac $1 ɣef {{SITENAME}} yessutered awennez n awal n uɛaddi i {{SITENAME}} ($4). {{PLURAL:$3|Amiḍan n useqdac agi yeqqen|imiḍanen n iseqdacen agi qqenen}} s tansa e-mail agi :
 
 $2
 
-{{PLURAL:$3|Awal n uɛaddi agi ad i aff tasewti-s|Awalen n uɛaddi agi ad affen taseweti nsen}} deg {{PLURAL:$5|yiwen ass|$5 ussan}}. Ilaq tura ad qqeneḍ dɣa ad freneḍ awal n uɛaddi amaynut. Lukan mačči d kečč/kem i xedmen asuter agi, naɣ tecfiḍ tura i awal n uɛaddi inek/inem, tzemreḍ ad eǧǧeḍ izen agi.',
+{{PLURAL:$3|Awal n uɛaddi uɛḍil agi ad i aff tasewti-s|Awalen n uɛaddi uɛḍilen agi ad affen taseweti nsen}} deg {{PLURAL:$5|yiwen ass|$5 ussan}}. Ilaq tura ad qqeneḍ dɣa ad freneḍ awal n uɛaddi amaynut. Lukan mačči d kečč/kem i xedmen asuter agi, naɣ tecfiḍ tura i awal n uɛaddi inek/inem, tzemreḍ ad eǧǧeḍ izen agi.',
 'passwordreset-emailelement' => 'Isem n useqdac : $1
 Awal n uɛddi akudan : $2',
-'passwordreset-emailsent' => 'Tirawt n usmekti tetwazen.',
-'passwordreset-emailsent-capture' => 'Tirawt n usmekti tetwazen, ẓeṛ-itt ddaw agi.',
-'passwordreset-emailerror-capture' => 'Tirawt n usmekti t-arewed, ẓeṛ-itt ddaw agi, lamaɛna azen yefkad anezri (tirawt ur tru ara) : $1',
+'passwordreset-emailsent' => 'Tirawt n uwennez n awal n uɛaddi tetwaceggaɛ.',
+'passwordreset-emailsent-capture' => 'Tirawt n uwennez n awal n uɛaddi tetwaceggaɛ, ẓeṛ-itt ddaw agi.',
+'passwordreset-emailerror-capture' => 'Tirawt n uwennez n awal n uɛaddi t-arewed, ẓeṛ-itt ddaw agi, lamaɛna aceggaɛ i {{GENDER:$2|umseqdac}} yefkad anezri : $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Beddel tansa n e-mail',
@@ -625,9 +631,23 @@ Awal n uɛddi akudan : $2',
 'changeemail-oldemail' => 'Tansa e-mail n tura :',
 'changeemail-newemail' => 'Tansa e-mail tamaynut :',
 'changeemail-none' => '(ulac)',
+'changeemail-password' => 'Awal-ik/im n uɛaddi ɣef {{SITENAME}} :',
 'changeemail-submit' => 'Beddel tansa e-mail',
 'changeemail-cancel' => 'Semmewet',
 
+# Special:ResetTokens
+'resettokens' => 'Wennez tiddas',
+'resettokens-text' => 'D-agi tzemreḍ ad twennezeḍ tiddas i ɛemmeden ad kecmeḍ ar isefka usligen i qqenen ar amiḍan inek/inem.
+
+Ilaq ad twennezeḍ tiddas ma tferqeḍ-ten s tuccḍa s umseqdac nniḍen neɣ ma amiḍan inek/inem yexṣer.',
+'resettokens-no-tokens' => 'Ulac tiddas an wennez.',
+'resettokens-legend' => 'Wennez tiddas',
+'resettokens-tokens' => 'Tiddas :',
+'resettokens-token-label' => '$1 (azal amiran : $2)',
+'resettokens-watchlist-token' => 'Tiddest i usuddem (Atom/RSS) web n [[Special:Watchlist|ibeddilen n isebtar n umuɣ inek/inem n uḍfar]]',
+'resettokens-done' => 'Tiddas i wennezen.',
+'resettokens-resetbutton' => 'Wennez tiddas i fernen',
+
 # Edit page toolbar
 'bold_sample' => 'Aḍris aberbuz',
 'bold_tip' => 'Aḍris aberbuz',
@@ -702,8 +722,8 @@ Smekti-ten u fka-ten i unedbal-nni.",
 'loginreqlink' => 'Kcem',
 'loginreqpagetext' => 'Yessefk $1 iwakken ad teẓriḍ isebtar wiyaḍ.',
 'accmailtitle' => 'Awal n tbaḍnit yettwazen.',
-'accmailtext' => "Awal n uɛaddi id yuran s ugacur i [[User talk:$1|$1]] yetwecgaɛ i $2.
-Awal n uɛaddi i umiḍan agi amaynut yezmer ad yetbeddel ɣef usebter n ''[[Special:ChangePassword|ubeddel n awal uɛddi]]'' sakin tuqqna.",
+'accmailtext' => 'Awal n uɛaddi id yuran s ugacur i [[User talk:$1|$1]] yetweceggaɛ i $2.
+Yezmer ad yetbeddel ɣef usebtar [[Special:ChangePassword|Abeddel n awal uɛddi]] sakin tuqqna.',
 'newarticle' => '(Amaynut)',
 'newarticletext' => 'Tḍefreḍ azday ɣer usebter mazal ur yettwaxleq ara.
 Akken ad txelqeḍ asebter-nni, aru deg tenkult i tella deg ukessar
@@ -739,7 +759,7 @@ Asekcem aneggaru n useklas n ikyafen yella ddaw agi :',
 
 '''Cfut, ttagi d azar-timeẓriwt kan.'''
 Ibeddlen mazal ur ttusmektin ara!",
-'continue-editing' => 'Kemmel abeddel',
+'continue-editing' => 'Ṛuḥ ar taɣzut n ubeddel',
 'previewconflict' => 'Pre-timeẓriwt-agi tesskan aḍris i yellan deg usawen lemmer tebɣiḍ a tt-tesmektiḍ.',
 'session_fail_preview' => "'''Suref-aɣ! ur nezmir ara a nesmekti abeddil inek axaṭer yella ugur.
 G leɛnayek ɛreḍ tikelt nniḍen. Lukan mazal yella ugur, ffeɣ umbeɛd kcem.'''",
@@ -799,7 +819,7 @@ Tzemreḍ ad uɣaleḍ ar deffir dɣa ad beddeleḍ asebter yellan yakan, naɣ [
 'nocreate-loggedin' => 'Ur tesɛiḍ ara turagt i usnulfu n isebtar imaynuten.',
 'sectioneditnotsupported-title' => 'Abeddel n tigezmi agi ur yezmer ara',
 'sectioneditnotsupported-text' => 'Abeddel n tigezmi ur yezmer ara deg usebtar agi n ubeddel.',
-'permissionserrors' => 'Anezri n turagt',
+'permissionserrors' => 'Agul n turagt',
 'permissionserrorstext' => 'Ur tesɛiḍ ara turagt iwakken ad xedmeḍ wayagi i {{PLURAL:$1|taɣẓint|tiɣẓinin}} agi :',
 'permissionserrorstext-withaction' => 'Ur sɛiḍ ara ttesriḥ af $2, i {{PLURAL:$1|taɣẓint|tiɣẓinin}} agi :',
 'recreate-moveddeleted-warn' => "'''Ɣur-wet : asebter agi i tebɣam ad snulfum, yetwekkes uqbel.'''
@@ -813,12 +833,18 @@ Tamentilt warisem',
 Ahat yetwemḥa.',
 'edit-conflict' => 'Amgirred n ubeddel.',
 'edit-no-change' => 'Abeddel inek/inem ur yetwexdam ara acku ur di ban ara abeddel deg uḍris.',
+'postedit-confirmation' => 'Abeddel inek/inem yetwakles.',
 'edit-already-exists' => 'Asebter amaynut ur d yesnufu ara.
 Yella yakan.',
 'defaultmessagetext' => 'Izen s lexṣas',
 'content-failed-to-parse' => 'Tasleṭ n ugbur n $2 i talɣa $1 texseṛ : $3',
 'invalid-content-data' => 'Isefka n ugbur ur ɣbelen ara',
 'content-not-allowed-here' => 'Agbur "$1" ur yesɛa ara turagt ɣef usebter [[$2]]',
+'editwarning-warning' => 'Ma ad teffeɣeḍ deg usebtar agi, akkw ibeddilen id xeddemeḍ ad sṛuḥen.
+
+Ma teqqeneḍ, tzemreḍ ad senseḍ alɣu agi deg tigezmi « Abeddel » n ismenyifen inek/inem.',
+'editpage-notsupportedcontentformat-title' => 'Amasal n ugbur ur d-yetwarfed ara',
+'editpage-notsupportedcontentformat-text' => 'Amasal n ugbur $1 ur d-yetwarfed ara sɣur talɣa n ugbur $2.',
 
 # Content models
 'content-model-wikitext' => 'wikiaḍris',
@@ -850,12 +876,16 @@ Ilaq ad i sɛu ddaw n  $2 {{PLURAL:$2|tiɣri|tiɣriwin }}, wannag tura {{PLURAL:
 'undo-failure' => 'Ur yezmir ara ad issefu abeddel axaṭer yella amennuɣ abusari deg ubeddel.',
 'undo-norev' => 'Abeddel ur yezmer ara ad yetwekkes acku ulac-itt naɣ tetwekkes yakan',
 'undo-summary' => 'Ssefsu tasiwelt $1 sɣur [[Special:Contributions/$2|$2]] ([[User talk:$2|Meslay]])',
+'undo-summary-username-hidden' => 'Semmewet tacaggart $1 sɣur amseqdac yeffren',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'Ur yezmir ara ad yexleq isem n wemseqdac',
 'cantcreateaccount-text' => "Asnulfu n umiḍan seg tansa IP (<b>$1</b>) tekyef sɣur [[User:$3|$3]].
 
 Taɣẓint n $3 : ''$2''",
+'cantcreateaccount-range-text' => "Asnulfu n umiḍan seg tansiwin IP deg tagrumma '''$1''', i sseddan tansa inek/inem IP ('''$4'''), twawḥelen sɣur [[User:$3|$3]].
+
+Taɣẓint i-d yefka/tefka $3 : ''$2''",
 
 # History pages
 'viewpagelogs' => 'Ẓer aɣmis n usebter-agi',
@@ -877,8 +907,8 @@ Tabadut: (tura) = amgirred akk d tasiwelt n tura,
 (amgirred) = amgirred akk d tasiwelt ssabeq, M = abeddel afessas.',
 'history-fieldset-title' => 'Inig deg umazray',
 'history-show-deleted' => 'Ekkes kan',
-'histfirst' => 'Tikkin timezwura',
-'histlast' => 'Tikkin tineggura',
+'histfirst' => 'tiqdimin',
+'histlast' => 'timaynutin',
 'historysize' => '({{PLURAL:$1|1 atamḍan|$1 itamḍanen}})',
 'historyempty' => '(amecluc)',
 
@@ -933,19 +963,20 @@ Tzemreḍ att ẓṛeḍ ; tilɣa llant deg [{{fullurl:{{#Special:Log}}/delete|p
 'revdelete-text' => 'Ileqman d tidyanin yettumḥan ad qqimen deg umezruy n usebter dɣa deg iɣmisen, maca agbur nsen ur i sɛu ara tuffart i uzayez."
 Inedbalen wiyaḍ deg {{SITENAME}} zemren ad ẓṛen imuren i yettwafren u zemren a ten-mḥan, ḥaca ma llan icekkilen.',
 'revdelete-confirm' => 'Sergeg ma tebɣiḍ ad xedmeḍ tigawt agi, fehmeḍ inalkamen, dɣa temtawiḍ s [[{{MediaWiki:Policy-url}}|ilugan]].',
-'revdelete-suppress-text' => "Ilaq tukksa at illi kan deg tijṛa agi :
-* tilɣa n yiwen ur ezgan ara
-*: ''tansa, uṭṭun n tilifun, uṭṭun n taɣellist tamettit, …''",
+'revdelete-suppress-text' => "Ilaq tukksa att illi \"kan\" deg tijṛa agi :
+* Tilɣa ahat tinergamin
+* Tilɣa ur sɛant ara amkan d-agi
+*: ''tansa, uḍḍun n tilifun, uḍḍun n taɣellist tamettit, …''",
 'revdelete-legend' => 'Sbebd akref n tamuɣli',
-'revdelete-hide-text' => 'Ffer aḍris n tsiwelt',
+'revdelete-hide-text' => 'Aḍris n tacaggart',
 'revdelete-hide-image' => 'Ffer ayen yellan deg ufaylu',
 'revdelete-hide-name' => 'Ffer tigawt d nnican',
-'revdelete-hide-comment' => 'Ffer abeddel n uwennit',
-'revdelete-hide-user' => 'Ffer Isem n wemseqdac/IP n umeskar',
+'revdelete-hide-comment' => 'Beddel agzul',
+'revdelete-hide-user' => 'Isem n umseqdac/Tansa IP n umaẓrag',
 'revdelete-hide-restricted' => 'Mḥu isefka agi i inedbalen d yimdanen wiyaḍ',
 'revdelete-radio-same' => '(ur beddel ara)',
-'revdelete-radio-set' => 'Ih',
-'revdelete-radio-unset' => 'Ala',
+'revdelete-radio-set' => 'Udrig',
+'revdelete-radio-unset' => 'Yeban',
 'revdelete-suppress' => 'Kkes talɣut seg inedbalen d yimdanen wiyaḍ',
 'revdelete-unsuppress' => 'Kkes icekkilen ɣef tisiwal i yuɣalen-d',
 'revdelete-log' => 'Ayɣer',
@@ -1022,6 +1053,7 @@ Senked d akken tamhelt agi ad eǧǧ amezruy n usebtar ad ikemmel.',
 'compareselectedversions' => 'Ẓer imgerraden ger tisiwal i textareḍ',
 'showhideselectedversions' => 'Ssken/Ffer ileqman i xtiṛen',
 'editundo' => 'ssefsu',
+'diff-empty' => '(Ulac amgerrad)',
 'diff-multi' => '({{PLURAL:$1|Yiwet tasiwelt tabusarit|$1 n tisiwal tibusarin}} af {{PLURAL:$2|amseqdac|$2 imseqdacen}} {{PLURAL:$1|ur ttumlal ara|ur ttumlalent ara}})',
 'diff-multi-manyusers' => '({{PLURAL:$1|Yiwen lqem agrawan|$1 ileqman igrawanen}} af {{PLURAL:$2|aseqdac|$2 iseqdacen}} {{PLURAL:$1|yeffer|ffren}})',
 'difference-missing-revision' => '{{PLURAL:$1|Yiwet tacaggart|$1 ticaggartin}} n tameẓla agi ($1) {{PLURAL:$2|ur tella ara (ulac)|ur llant ara (ulac)}}.
@@ -1079,11 +1111,13 @@ Tzemreḍ ad affeḍ tilɣa deg [{{fullurl:{{#Special:Log}}/delete|page={{FULLPA
 'powersearch-togglenone' => 'Ulac',
 'search-external' => 'Anadi yeffɣen',
 'searchdisabled' => 'Anadi deg {{SITENAME}} yettwakkes. Tzemreḍ ad tnadiḍ s Google. Meɛna ur tettuḍ ara, tasmult n google taqdimt.',
+'search-error' => 'Tella tuccḍa deg unadi n : $1',
 
 # Preferences page
 'preferences' => 'Isemyifiyen',
-'mypreferences' => 'Isemyifiyen inu',
+'mypreferences' => 'Isemyifiyen',
 'prefs-edits' => 'Amḍan n ibeddlilen :',
+'prefsnologintext2' => 'Ilaq ad $1 iwakken ad sbaduḍ ismenyifen inek/inem.',
 'prefs-skin' => 'Aglim',
 'skin-preview' => 'Pre-timeẓriwt',
 'datedefault' => 'Ur sɛiɣ ara asemyifi',
@@ -1106,18 +1140,20 @@ Tzemreḍ ad affeḍ tilɣa deg [{{fullurl:{{#Special:Log}}/delete|page={{FULLPA
 'prefs-email' => 'Tixtiṛiyin n tira',
 'prefs-rendering' => 'Tummant',
 'saveprefs' => 'Smekti',
-'restoreprefs' => 'Err akkw azalen s lexṣas',
+'restoreprefs' => 'Err akkw iɣewwaren s lexṣas (deg akkw tigezmiwin)',
 'prefs-editing' => 'Abedddil',
 'rows' => 'Ijerriḍen:',
 'columns' => 'Tigejda:',
 'searchresultshead' => 'Anadi',
-'resultsperpage' => 'Geddac n tiririyin i mkul asebter:',
 'stub-threshold' => 'Talast timinegt i <a href="#" class="stub">izdayen ɣer ibegzan</a> (itamḍanen) :',
 'stub-threshold-disabled' => 'Yensa',
 'recentchangesdays' => 'Amḍan n ussan an beqqeḍ deg ibeddilen ineggura.',
 'recentchangesdays-max' => 'Afellay $1 {{PLURAL:$1|ass|ussan}}',
 'recentchangescount' => 'Amḍan n ibeddilen i ubeqqeḍ s lexṣas :',
 'prefs-help-recentchangescount' => 'Wagi yesɛa deg-es ibeddilen ineggura, isebtar n umezruy d iɣmisen.',
+'prefs-help-watchlist-token2' => 'Hattan tasarut tufurt n usuddem Web n umuɣ inek/inem n uḍfar.
+Akkw amḍan yesɛan tasarut agi, ad yezmer ad i ɣer umuɣ inek/inem n uḍfar, ur d-sselɣu ara tasarut agi ihi.
+[[Special:ResetTokens|Nqer d-agi ma tebɣiḍ ad wennezeḍ tasarut agi]].',
 'savedprefs' => 'Isemyifiyen inek yettusmektan.',
 'timezonelegend' => 'Iẓḍi n ukud :',
 'localtime' => 'Asrag adigan :',
@@ -1148,9 +1184,9 @@ Tzemreḍ ad affeḍ tilɣa deg [{{fullurl:{{#Special:Log}}/delete|page={{FULLPA
 Wagi ur yezmer ara ad yetwekkes.',
 'prefs-emailconfirm-label' => 'Aragag n tirawt :',
 'youremail' => 'E-mail *:',
-'username' => 'Isem n wemseqdac:',
-'uid' => 'Amseqdac ID:',
-'prefs-memberingroups' => 'Aεeggal n {{PLURAL:$1|ugraw|igrawen}} :',
+'username' => '{{GENDER:$1|Isem n umseqdac|Isem n tamseqdact}} :',
+'uid' => 'Uḍḍun n {{GENDER:$1|umseqdac|tamseqdact}}:',
+'prefs-memberingroups' => '{{GENDER:$2|Aεeggal|Taɛggalt}} n {{PLURAL:$1|ugraw|igrawen}} :',
 'prefs-registration' => 'Azmez n tiggezt :',
 'yourrealname' => 'Isem n ṣṣeḥ *:',
 'yourlanguage' => 'Tutlayt:',
@@ -1161,11 +1197,13 @@ Wagi ur yezmer ara ad yetwekkes.',
 'badsig' => 'Azmul mačči d ṣaḥiḥ; Ssenqed tags n HTML.',
 'badsiglength' => 'Azmul inek/inem, teɣwzi-s tameqqṛant aṭas.
 Ur ilaq ara ad i sɛu ugar n $1 {{PLURAL:$1|asekkil|isekkilen}}.',
-'yourgender' => 'Tawsit :',
-'gender-unknown' => 'Ulac tumlin',
-'gender-male' => 'Amalay',
-'gender-female' => 'Untay',
-'prefs-help-gender' => 'Axetṛan : yetseqdec iwakken ad yefk tawsit i inzan n ugrudem. Talɣut agi at illi tazayert.',
+'yourgender' => 'Amek i tebɣiḍ ad n-ini fellak(m) ?',
+'gender-unknown' => 'Ur bɣiɣ ara ad iniɣ',
+'gender-male' => 'Yebeddel isebtar n wiki',
+'gender-female' => 'Tebeddel isebtar n wiki',
+'prefs-help-gender' => 'Sbadu asmenyif agi d-afrayan.
+Aseɣẓan agi yetseqdac azal-is iwakken ad yemeslay s kečč/kem dɣa ad yefk isem-ik/im i wiyaḍ nniḍen s useqdac n tawsit tajeṛṛumant.
+Talɣut agi attili d-tazayezt.',
 'email' => 'E-mail',
 'prefs-help-realname' => '* Isem n ṣṣeḥ (am tebɣiḍ): ma textareḍ a t-tefkeḍ, ad yettuseqdac iwakken ad snen medden anwa yura tikkin inek.',
 'prefs-help-email' => '* E-mail (am tebɣiḍ): Teǧǧi imseqdacen wiyaḍ a k-aznen email mebla ma ẓren tansa email inek.',
@@ -1176,7 +1214,9 @@ Ur ilaq ara ad i sɛu ugar n $1 {{PLURAL:$1|asekkil|isekkilen}}.',
 'prefs-signature' => 'Azmul',
 'prefs-dateformat' => 'Amasal n izemzan',
 'prefs-timeoffset' => 'Asekḥer n usrag',
-'prefs-advancedediting' => 'Tixtiṛiyin timahlanin',
+'prefs-advancedediting' => 'Tixtiṛiyin timuta',
+'prefs-editor' => 'Amaẓrag',
+'prefs-preview' => 'Azarskan',
 'prefs-advancedrc' => 'Tixtiṛiyin timahlanin',
 'prefs-advancedrendering' => 'Tixtiṛiyin timahlanin',
 'prefs-advancedsearchoptions' => 'Tixtiṛiyin timahlanin',
@@ -1184,7 +1224,10 @@ Ur ilaq ara ad i sɛu ugar n $1 {{PLURAL:$1|asekkil|isekkilen}}.',
 'prefs-displayrc' => 'Tixtiṛiyin n ubeqqeḍ',
 'prefs-displaysearchoptions' => 'Tixtiṛiyin n ubeqqeḍ',
 'prefs-displaywatchlist' => 'Tixtiṛiyin n ubeqqeḍ',
+'prefs-tokenwatchlist' => 'Tiddest',
 'prefs-diffs' => 'Timeẓliwin',
+'prefs-help-prefershttps' => 'Asmenyif agi, ad yelḥu ar tuqqna ay d-yetteddun.',
+'prefs-tabs-navigation-hint' => 'Taxbalut : Tzemreḍ ad seqdeceḍ tineccabin n uzelmaḍ d uyeffus iwakken ad ssileleḍ gar iccaren.',
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => 'E-mail agi teɣbel',
@@ -1208,9 +1251,11 @@ Ur ilaq ara ad i sɛu ugar n $1 {{PLURAL:$1|asekkil|isekkilen}}.',
 'userrights-no-interwiki' => 'Ur tesɛiḍ ara turagt iwakken ad beddeleḍ izerfan n iseqdacen ɣef wiki nniḍen.',
 'userrights-nodatabase' => 'Taffa n isefka « $1 » ulac itt naɣ mačči d tadigant.',
 'userrights-nologin' => 'Ilaq ad [[Special:UserLogin|qqeneḍ]] s yiwen umiḍan anedbal iwakken ad beddeleḍ izerfan n useqdac.',
-'userrights-notallowed' => 'Amiḍan inek/inem ur yesɛa ara turagt iwakken ad beddeleḍ izerfan n useqdac.',
+'userrights-notallowed' => 'Ur tesɛiḍ ara turagt ad rnuḍ neɣ ad ekkeseḍ izerfan n umseqdac.',
 'userrights-changeable-col' => 'Igrawen i tzemreḍ ad beddeleḍ',
 'userrights-unchangeable-col' => 'Igrawen ur tzemreḍ ara ad beddeleḍ',
+'userrights-conflict' => 'Ccwal n ubeddel n izerfan n umseqdac ! Ilaq ad ɛzemeḍ tikelt nniḍen dɣa ad sergegeḍ ibeddilen.',
+'userrights-removed-self' => 'Tekkeseḍ s lerbaḥ izerfan inek/inem. Tura ur tzemreḍ ara ad kecmeḍ ar usebtar agi.',
 
 # Groups
 'group' => 'Adrum:',
@@ -1254,7 +1299,7 @@ Ur ilaq ara ad i sɛu ugar n $1 {{PLURAL:$1|asekkil|isekkilen}}.',
 'right-reupload-shared' => 'Ɛefes deg udigan afaylu yellan ɣef azadur azduklan',
 'right-upload_by_url' => 'Kter afaylu seg tansa URL',
 'right-purge' => 'Senger tazarkatut n isebtar war asuter n uragag',
-'right-autoconfirmed' => 'Beddel isebtar azinsegdelen',
+'right-autoconfirmed' => 'Ur i tilli ara yeswaɣ sɣur tilisa n uktum yeqqenen ar tansiwin IP',
 'right-bot' => 'Ad yilli yesniret am ukala yeswurmen',
 'right-nominornewtalk' => 'Ur ndeḥ ara tazmilt n inzan imaynuten ma neseqdac abeddel amectuḥ ɣef usebtar n umeslay n yiwen useqdac',
 'right-apihighlimits' => 'Seqdec tilisa tid ɛlayen deg tuttriwin API',
@@ -1274,13 +1319,21 @@ Ur ilaq ara ad i sɛu ugar n $1 {{PLURAL:$1|asekkil|isekkilen}}.',
 'right-hideuser' => 'Kyef aseqdac s tuffra n isem-is ar udem n uzayez',
 'right-ipblock-exempt' => 'Zizdew tansiwin IP yekyefen, ikyafen iwurmanen d ikyafen n tagrummiwin IP',
 'right-proxyunbannable' => 'Zizdew ikyafen iwurmanen n iqeddacen proxy',
-'right-unblockself' => 'Ad ekkesen akyaf imanen nsen',
-'right-protect' => 'Beddel aswir n umesten n isebtar dɣa beddel isebtar i gdelen',
-'right-editprotected' => 'Beddel isebtar i gdelen (war asegdel s uceṛcuṛ)',
+'right-unblockself' => 'Ad yekkes akyaf iman-is',
+'right-protect' => 'Beddel iswiren n umesten dɣa beddel isebtar i gdelen s uceṛcuṛ',
+'right-editprotected' => 'Beddel isebtar i gdelen s « {{int:protect-level-sysop}} »',
+'right-editsemiprotected' => 'Beddel isebtar i gdelen s « {{int:protect-level-autoconfirmed}} »',
 'right-editinterface' => 'Beddel agrudem n useqdac',
 'right-editusercssjs' => 'Beddel ifuyla CSS d JavaScript n iseqdacen nniḍen',
 'right-editusercss' => 'Beddel ifuyla CSS n iseqdacen nniḍen',
 'right-edituserjs' => 'Beddel ifuyla JavaScript n iseqdacen nniḍen',
+'right-editmyusercss' => 'Beddel ifuyla CSS n umseqdac inek/inem',
+'right-editmyuserjs' => 'Beddel ifuyla Javascript n umseqdac inek/inem',
+'right-viewmywatchlist' => 'Zeṛ umuɣ inek/inem n uḍfar',
+'right-editmywatchlist' => 'Beddel umuɣ inek/inem n uḍfar. Ger tamawt af kra n tigawin ad rnunt isebtar nniḍen war azref agi.',
+'right-viewmyprivateinfo' => 'Zeṛ isefka udmawanen inek/inem (amedya : tansa email, isem n tiddet)',
+'right-editmyprivateinfo' => 'Beddel isefka udmawanen inek/inem (amedya : tansa email, isem n tiddet)',
+'right-editmyoptions' => 'Beddel ismenyifen inek/inem',
 'right-rollback' => 'Ekkes s urured ibeddilen n umedraw aneggaru deg yiwen asebter',
 'right-markbotedits' => 'Creḍ ibeddilen yetwekkesen am aken d aṛubut i tni beddelen.',
 'right-noratelimit' => 'Ur i tilli ara yeswaɣ sɣur tilisa n utug',
@@ -1332,8 +1385,8 @@ Ur ilaq ara ad i sɛu ugar n $1 {{PLURAL:$1|asekkil|isekkilen}}.',
 'action-block' => 'Kyef deg tira aseqdac agi',
 'action-protect' => 'beddel iswiren n umesten i usebter agi',
 'action-rollback' => 'ekkes s urured ibeddilen n umedraw aneggaru yebeddelen yiwen usebter',
-'action-import' => 'Kter asebter agi seg wiki nniḍen',
-'action-importupload' => 'Kter asebter agi seg ufaylu n wezdam (upload)',
+'action-import' => 'kter isebtar agi seg wiki nniḍen',
+'action-importupload' => 'kter isebtar agi seg ufaylu n wezdam',
 'action-patrol' => 'Creḍ abeddel n wiyaḍ nniḍen am aken tesɛa tacaggart',
 'action-autopatrol' => 'ad sɛuḍ tacaggart i ubeddil ik',
 'action-unwatchedpages' => 'Sken-d tabdart n isebtaren ur yettwalan ara.',
@@ -1342,23 +1395,33 @@ Ur ilaq ara ad i sɛu ugar n $1 {{PLURAL:$1|asekkil|isekkilen}}.',
 'action-userrights-interwiki' => 'Ẓreg izerfan n umseqdac deg wikis wiyaḍ',
 'action-siteadmin' => 'sekkweṛ naɣ kkes aseḍru i taffa n isefka',
 'action-sendemail' => 'Ceggaɛ tira',
+'action-editmywatchlist' => 'beddel umuɣ inek uḍfar',
+'action-viewmywatchlist' => 'zeṛ umuɣ inek/inem n uḍfar',
+'action-viewmyprivateinfo' => 'zeṛ tilɣa inek tusligin',
+'action-editmyprivateinfo' => 'beddel tilɣa inek tusligin',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|Abeddel|Ibeddlen}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|seg tarzaft taneggarut}}',
+'enhancedrc-history' => 'amezruy',
 'recentchanges' => 'Ibeddilen imaynuten',
 'recentchanges-legend' => 'Tifranin n ibeddilen imaynuten',
 'recentchanges-summary' => 'Ḍfer ibeddilen imaynuten n {{SITENAME}}.',
+'recentchanges-noresult' => 'Ulac abeddel yecban ayen i ttnadiḍ ɣef tallit id efkeḍ.',
 'recentchanges-feed-description' => 'Ḍfer ibeddilen imaynuten n wiki-yagi deg usuddem-agi.',
 'recentchanges-label-newpage' => 'Abeddel agi ad yesnulfu asebter amaynut',
 'recentchanges-label-minor' => 'Wagi d-abeddel amectuḥ',
 'recentchanges-label-bot' => 'D-arubut id yeseqdacen abeddel agi',
 'recentchanges-label-unpatrolled' => 'Abeddel agi mazal yesɛa aselken.',
+'recentchanges-label-plusminus' => 'Tiddi n usebtar tetwebeddel s umḍan agi n itamḍanen.',
+'recentchanges-legend-heading' => "'''Aglam :'''",
+'recentchanges-legend-newpage' => '(zeṛ daɣen [[Special:NewPages|umuɣ n isebtar imaynuten]]).',
 'recentchanges-legend-plusminus' => "(''± 123'')",
 'rcnotefrom' => "Deg ukessar llan ibeddlen seg wasmi '''$2''' (ar '''$1''').",
 'rclistfrom' => 'Ssken ibeddlen imaynuten seg $1',
 'rcshowhideminor' => '$1 ibeddlen ifessasen',
 'rcshowhidebots' => '$1 irubuten',
-'rcshowhideliu' => '$1 n yimseqdacen i ikecmen',
+'rcshowhideliu' => '$1 imseqdacen imseklesen',
 'rcshowhideanons' => '$1 n yimseqdacen udrigen',
 'rcshowhidepatr' => '$1 n yibeddlen yettwassenqden',
 'rcshowhidemine' => '$1 ibeddlen inu',
@@ -1375,7 +1438,7 @@ Ur ilaq ara ad i sɛu ugar n $1 {{PLURAL:$1|asekkil|isekkilen}}.',
 'rc_categories_any' => 'Ulayɣer',
 'rc-change-size-new' => '$1 {{PLURAL:$1|atamḍan|itamḍanen}} sakin abeddel',
 'newsectionsummary' => '/* $1 */ tigezmi tamaynut',
-'rc-enhanced-expand' => 'Ẓeṛ tilɣa (yeḥwaǧ JavaScript)',
+'rc-enhanced-expand' => 'Ẓeṛ ttfaṣil',
 'rc-enhanced-hide' => 'Ffer tilɣa',
 'rc-old-title' => 'yesnulfad s uzwel « $1 »',
 
@@ -1394,8 +1457,7 @@ Ur ilaq ara ad i sɛu ugar n $1 {{PLURAL:$1|asekkil|isekkilen}}.',
 'reuploaddesc' => 'Semmewet dɣa uɣaled ar tiferkit n tuznin.',
 'upload-tryagain' => 'Ceggaɛ aglam n ufaylu ibeddelen',
 'uploadnologin' => 'Ur tekcimeḍ ara',
-'uploadnologintext' => 'Yessefk [[Special:UserLogin|ad tkecmeḍ]]
-iwakken ad tazneḍ afaylu.',
+'uploadnologintext' => 'Ilaq ad $1 iwakken ad ketreḍ ifuyla.',
 'upload_directory_missing' => 'Akaram n taktert n ufaylu ($1) ulac-it dɣa ur d-yesnulfa ara sɣur aqeddac web.',
 'upload_directory_read_only' => 'Weserver/serveur Web ur yezmir ara ad yaru deg ($1).',
 'uploaderror' => 'Agul deg usekcam',
@@ -1474,6 +1536,8 @@ Ma tebɣiḍ ad azeneḍ afaylu inek/inem, ilaq ad uɣaleḍ ar deffir dɣa ad a
 [[File:$1|thumb|center|$1]]',
 'file-exists-duplicate' => 'Afaylu agi d-asleg n {{PLURAL:$1|ufaylu agi|ifuyla agi}} :',
 'file-deleted-duplicate' => 'Afaylu am wagi ([[:$1]]) yetwekkes yakan. Ilaq ad selkeneḍ aɣmis n tukksiwin n ufaylu agi uqbel atid ktereḍ tikkelt nniḍen.',
+'file-deleted-duplicate-notitle' => 'Afaylu yesɛan isem am wagi yetwumḥa, ula d-azwel ines.
+Ilaq ad ssutereḍ i yiwen aterras ma yezmer ad yessenqed aɣmis n ufaylu agi yetwumḥan iwakken ad yessekyed addad uqbel at-id ktereḍ tikelt nniḍen.',
 'uploadwarning' => 'Aɣtal deg wazan n ufayluwen',
 'uploadwarning-text' => 'Beddel aglam n ufaylu dɣa ɛreḍ tikkelt nniḍen',
 'savefile' => 'Smekti afaylu',
@@ -1529,6 +1593,7 @@ Ma yella daɣen anezri, ilaq ad meslaye ḍ s  [[Special:ListUsers/sysop|unedbal
 'backend-fail-notsame' => 'Afaylu imeẓli yella yakan i $1.',
 'backend-fail-invalidpath' => '$1 mačči d abrid n uḥraz iɣbelen.',
 'backend-fail-delete' => 'Ulamek an mḥu afaylu "$1".',
+'backend-fail-describe' => 'Ulamek an beddel adferisefka n ufaylu "$1".',
 'backend-fail-alreadyexists' => 'Afaylu $1 yella yakan.',
 'backend-fail-store' => 'Ulamek an ḥrez afaylu $1 deg $2.',
 'backend-fail-copy' => 'Ulamek an nɣel afaylu $1 deg $2.',
@@ -1623,8 +1688,7 @@ I taɣellist tameqqṛant, img_auth.php yensa.',
 'upload_source_file' => ' (afaylu deg uselkim inek)',
 
 # Special:ListFiles
-'listfiles-summary' => 'Asebter agi uslig i εemmed ad yefk umu n akkw ifuyla i kteren.
-Ma aseqdac as yernu tastayt, ala ifuyla s lqem taneggarut id yekter aseqdac nni ad beqqeḍen.',
+'listfiles-summary' => 'Asebter agi uslig i εemmed ad yefk umu n akkw ifuyla i kteren.',
 'listfiles_search_for' => 'Nadi ɣef yisem n tugna:',
 'imgfile' => 'afaylu',
 'listfiles' => 'Umuɣ n tugniwin',
@@ -1635,6 +1699,8 @@ Ma aseqdac as yernu tastayt, ala ifuyla s lqem taneggarut id yekter aseqdac nni
 'listfiles_size' => 'Tiddi (bytes/octets)',
 'listfiles_description' => 'Aglam',
 'listfiles_count' => 'Ileqman',
+'listfiles-show-all' => 'Sseddu ileqman iqdimen n tugniwin',
+'listfiles-latestversion' => 'Lqem amiran',
 'listfiles-latestversion-yes' => 'Ih',
 'listfiles-latestversion-no' => 'Ala',
 
@@ -1733,6 +1799,10 @@ Ur tettuḍ ara ad selkeneḍ ma ur llan ara izdayen nniḍen ɣer tilɣatin uqb
 'randompage-nopages' => 'Ulac isebtar deg {{PLURAL:$2|tallunt n isemawen|tallunin n isemawen}} : $1.',
 
 # Random page in category
+'randomincategory' => 'Asebtar s ugacur deg taggayt',
+'randomincategory-invalidcategory' => '« $1 » mačči d-isem n taggayt yeɣblen.',
+'randomincategory-nopages' => 'Ulac asebtar deg [[:Category:$1]].',
+'randomincategory-selectcategory' => 'Ddem asebtar s ugacur deg taggayt : $1 $2.',
 'randomincategory-selectcategory-submit' => 'Ruḥ',
 
 # Random redirect
@@ -1760,7 +1830,13 @@ Ur tettuḍ ara ad selkeneḍ ma ur llan ara izdayen nniḍen ɣer tilɣatin uqb
 'statistics-users-active-desc' => 'Iseqdacen yesɛan xersum yiwet tigawt seg {{PLURAL:$1|ass agi aneggaru|$1 ussan agi ineggura}}',
 'statistics-mostpopular' => 'isebtar mmeẓren aṭṭas',
 
+'pageswithprop' => 'Isebtar s ayla n usebtar',
+'pageswithprop-legend' => 'Isebtar s ayla n usebtar',
+'pageswithprop-text' => 'Asebtar agi, yefked umuɣ n isebtar yeseqdacen ayla n usebtar amaẓlay',
+'pageswithprop-prop' => 'Isem n ayla :',
 'pageswithprop-submit' => 'Ruḥ',
+'pageswithprop-prophidden-long' => 'azal n ayla n uḍris aɣezfan yeffren ($1)',
+'pageswithprop-prophidden-binary' => 'azal n ayla imisin yeffren ($1)',
 
 'doubleredirects' => 'Asemmimeḍ yeḍra snat tikwal',
 'doubleredirectstext' => 'Mkull ajerriḍ yesɛa azday ɣer asmimeḍ amezwaru akk d wis sin, ajerriḍ amezwaru n uḍris n usebter wis sin daɣen, iwumi yefkan asmimeḍ ṣaḥiḥ i yessefk ad sɛan isebtar azday ɣur-s.',
@@ -1825,12 +1901,14 @@ Ur tettuḍ ara ad selkeneḍ ma ur llan ara izdayen nniḍen ɣer tilɣatin uqb
 'protectedpages' => 'isebtar yettwaḥerzen',
 'protectedpages-indef' => 'Imestenen imeɣlalen kan',
 'protectedpages-cascade' => 'Imestenen s uceṛcuṛ kan',
+'protectedpages-noredirect' => 'Ffer isemmimḍen',
 'protectedpagesempty' => 'isebtar-agi ttwaḥerzen s imsektayen -agi.',
 'protectedtitles' => 'Izwal ugdilen',
 'protectedtitlesempty' => 'Ulac azwel yesɛan asegdel s iɣewwaren agi.',
 'listusers' => 'Umuɣ n yimseqdacen',
 'listusers-editsonly' => 'Sekned kan iseqdacen yesɛan asekcem naɣ ugar',
 'listusers-creationsort' => 'Fren s azmez n usnulfu',
+'listusers-desc' => 'Fren deg amizzwer amadar',
 'usereditcount' => '$1 {{PLURAL:$1|abeddel|ibeddilen}}',
 'usercreated' => '{{GENDER:$3|Yesnulfu-d}} ass n $1 ar $2',
 'newpages' => 'isebtar imaynuten',
@@ -1907,9 +1985,9 @@ Tzemreḍ ad sageneḍ abeqqeḍ s tixtiṛit n tawsit n uɣmis, isem n useqdac
 'linksearch-pat' => 'Anadi n tanfalit :',
 'linksearch-ns' => 'Talluntin n isemawen :',
 'linksearch-ok' => 'Nadi',
-'linksearch-text' => 'Tzemreḍ ad seqdeceḍ isekkilen imeẓliyen am « *.wikipedia.org ».
+'linksearch-text' => 'Isekkilen imeẓliyen am « *.wikipedia.org » zemren ad wetseqdecen.
 Ilaq-asen deg udday taɣult n uswir imineg, am amedya « *.org ».<br />
-Ineggafen imazdayen : <code>$1</code> (ur d-renu acemma deg unadi inek/inem)',
+{{PLURAL:$2|Aneggaf yettwaɛqelen|Ineggafen yettwaɛqelen}}: <code>$1</code> (http:// s lexṣas ma ulac aneggaf).',
 'linksearch-line' => '$1 yeqqen seg $2',
 'linksearch-error' => 'Tzemreḍ ad seqdeceḍ isekkilen usligen ala deg tazzwara n taɣult uselkim.',
 
@@ -1922,7 +2000,7 @@ Ineggafen imazdayen : <code>$1</code> (ur d-renu acemma deg unadi inek/inem)',
 # Special:ActiveUsers
 'activeusers' => 'Umuɣ n iseqdacen urmiden',
 'activeusers-intro' => 'Wagi d umuɣ n iseqdacen yexedmen armud deg {{PLURAL:$1|ass agi aneggaru|$1 ussan agi ineggura}}.',
-'activeusers-count' => '$1 {{PLURAL:$1|abeddel n ussan agi ineggura|ibeddilen n ussan agi ineggura}} deg {{PLURAL:$3|ass aneggaru|$3 ussan ineggura}}',
+'activeusers-count' => '$1 {{PLURAL:$1|tigawt|tigawin}} deg {{PLURAL:$3|ass aneggaru|$3 ussan ineggura}}',
 'activeusers-from' => 'Ssken iseqdacen seg :',
 'activeusers-hidebots' => 'Ffer iṛubuten',
 'activeusers-hidesysops' => 'Ffer inedbalen',
@@ -1956,7 +2034,7 @@ iwakken ad tazneḍ email i imseqdacen wiyaḍ.',
 'emailuser-title-target' => 'Ceggaɛ tirawt i {{GENDER:$1|aseqdac agi|taseqdact agi}}',
 'emailuser-title-notarget' => 'Ceggaɛ tirawt i useqdac',
 'emailpage' => 'Ceggaɛ tirawt i useqdac',
-'emailpagetext' => 'Tzemreḍ ad seqdeceḍ tiferkit ddaw agi iwakken ad ceggɛeḍ tirawt i useqdac agi.
+'emailpagetext' => 'Tzemreḍ ad seqdeceḍ tiferkit ddaw agi iwakken ad ceggɛeḍ tirawt i {{GENDER:$1|umseqdac|tamseqdact}} agi.
 Tansa e-mail id ekfeḍ deg [[Special:Preferences|iɣewwaren inek/inem]] ad tban deg urti "Amceggaɛ" n izen ; akka, anermas ad yezmer ak/akem yefk tiririt.',
 'usermailererror' => 'Yella ugul deg uzwel n email:',
 'defemailsubject' => '{{SITENAME}} tirawt n useqdac « $1 »',
@@ -1995,11 +2073,8 @@ Tansa e-mail id ekfeḍ deg [[Special:Preferences|iɣewwaren inek/inem]] ad tban
 'watchnologin' => 'Ur tekcimeḍ ara',
 'watchnologintext' => 'Yessefk ad [[Special:UserLogin|tkecmeḍ]] iwakken ad tbeddleḍ umuɣ n uɛessi inek.',
 'addwatch' => 'Rnu i umuɣ n uɛassi',
-'addedwatchtext' => "Asebter \"[[:\$1]]\" yettwarnu deg [[Special:Watchlist|wumuɣ n uɛessi]] inek.
-Ma llan ibeddlen deg usebter-nni neɣ deg usbtar umyennan ines, ad banen dagi,
-Deg [[Special:RecentChanges|wumuɣ n yibeddlen imaynuten]] ad banen s '''yisekkilen ibberbuzen''' (akken ad teẓriḍ).
-
-Ma tebɣiḍ ad tekkseḍ asebter seg wumuɣ n uɛessi inek, wekki ɣef \"Fakk aɛessi\".",
+'addedwatchtext' => 'Asebter "[[:$1]]" yettwarnu deg [[Special:Watchlist|wumuɣ n uḍfar]] inek/inem.
+Ibeddlen id-yetteddun deg usebter-agi neɣ deg usbtar umyennan ines, ad banen dagi.',
 'removewatch' => 'Ekkes seg umuɣ n uɛassi',
 'removedwatchtext' => '!!Asebter "[[:$1]]" yettwakkes seg [[Special:Watchlist|umuɣ n uɛessi]] inek.',
 'watch' => 'Ɛass',
@@ -2009,8 +2084,8 @@ Ma tebɣiḍ ad tekkseḍ asebter seg wumuɣ n uɛessi inek, wekki ɣef \"Fakk a
 'notanarticle' => 'Mačči d amagrad',
 'notvisiblerev' => 'Lqem tetwemḥa',
 'watchlist-details' => 'ttɛassaɣ {{PLURAL:$1|$1 usebter|$1 n isebtaren}} mebla isebtaren "amyannan".',
-'wlheader-enotif' => 'Yeǧǧa Email n talɣut.',
-'wlheader-showupdated' => "Isebtar ttubeddlen segwasmi tkecmeḍ tikelt taneggarut ttbanen-d s '''uḍris aberbuz'''",
+'wlheader-enotif' => 'Talɣut s email yessermed.',
+'wlheader-showupdated' => "Isebtar ttubeddlen segwasmi tkecmeḍ tikelt taneggarut ttbanen-d s uḍris '''aberbuz'''.",
 'watchmethod-recent' => 'yessenqed ibeddlen imaynuten n isebtar i ttɛasseɣ',
 'watchmethod-list' => 'yessenqed isebtar i ttɛassaɣ i ibeddlen imaynuten',
 'watchlistcontains' => 'Umuɣ n uɛessi inek ɣur-s $1 n {{PLURAL:$1|usebter|isebtar}}.',
@@ -2027,34 +2102,41 @@ Ma tebɣiḍ ad tekkseḍ asebter seg wumuɣ n uɛessi inek, wekki ɣef \"Fakk a
 'enotif_mailer' => 'Email n talɣut n {{SITENAME}}',
 'enotif_reset' => 'Rcem akk isebtar mmeẓren',
 'enotif_impersonal_salutation' => 'Amseqdac n {{SITENAME}}',
+'enotif_subject_deleted' => 'Asebtar $1 ɣef {{SITENAME}} yetwakkes sɣur {{GENDER:$2|$2}}',
+'enotif_subject_created' => 'Asebtar $1 ɣef {{SITENAME}} yetwaxleq sɣur {{GENDER:$2|$2}}',
+'enotif_subject_moved' => 'Asebtar $1 ɣef {{SITENAME}} yetwabeddel isem sɣur {{GENDER:$2|$2}}',
+'enotif_subject_restored' => 'Asebtar $1 ɣef {{SITENAME}} yetwerr sɣur {{GENDER:$2|$2}}',
+'enotif_subject_changed' => 'Asebtar $1 ɣef {{SITENAME}} yetwabeddel sɣur {{GENDER:$2|$2}}',
+'enotif_body_intro_deleted' => 'Asebtar $1 ɣef {{SITENAME}} yetwasfeḍ ass n $PAGEEDITDATE sɣur {{GENDER:$2|$2}}, zeṛ $3 i lqem amiran',
+'enotif_body_intro_created' => 'Asebtar $1 ɣef {{SITENAME}} yetwaxleq ass n $PAGEEDITDATE sɣur {{GENDER:$2|$2}}, zeṛ $3 i lqem amiran.',
+'enotif_body_intro_moved' => 'Asebtar $1 ɣef {{SITENAME}} yetwabeddel isem ass n $PAGEEDITDATE sɣur {{GENDER:$2|$2}}, zeṛ $3 i lqem amiran.',
+'enotif_body_intro_restored' => 'Asebtar $1 ɣef {{SITENAME}} yetwerr ass n $PAGEEDITDATE sɣur {{GENDER:$2|$2}}, zeṛ $3 i lqem amiran.',
+'enotif_body_intro_changed' => 'Asebtar $1 ɣef {{SITENAME}} yetwabeddel ass n $PAGEEDITDATE sɣur {{GENDER:$2|$2}}, zeṛ $3 i lqem amiran.',
 'enotif_lastvisited' => 'Ẓer $1 i akk ibeddlen segwasmi tkecmeḍ tikelt taneggarut.',
 'enotif_lastdiff' => 'Ẓer $1 akken ad tmuqleḍ abeddel.',
 'enotif_anon_editor' => 'aseqdac ur i siggezen ara $1',
 'enotif_body' => 'Ay $WATCHINGUSERNAME,
 
-Asebter « $PAGETITLE » n {{SITENAME}} $CHANGEDORCREATED ass n $PAGEEDITDATE sɣur « $PAGEEDITOR », ẓeṛ $PAGETITLE_URL iwakken ad ẓṛeḍ lqem n tura.
+$PAGEINTRO $NEWPAGE
 
-$NEWPAGE
+Agzul n umttekki  : $PAGESUMMARY $PAGEMINOREDIT
 
-Abeddel n wegzul: $PAGESUMMARY $PAGEMINOREDIT
+Meslay s umttekki :
+e-mail : $PAGEEDITOR_EMAIL
+wiki : $PAGEEDITOR_WIKI
 
-Meslay s umbeddel:
-e-mail: $PAGEEDITOR_EMAIL
-wiki: $PAGEEDITOR_WIKI
+Ur yelli ara email n talɣut asmi ad illin ibeddlen deg usebter ala lukan tekcmeḍ deg usebtar-agi sakin teqqneḍ. Tzemreḍ ad wennezeḍ tikbabin n talɣut i akkw isebtar yellan deg umuɣ inek/inem n uḍfar.
 
-Ur yelli ara email n talɣut asmi llan ibeddlen deg usebter ala lukan teẓreḍ asebter-nni.
-Tzemreḍ ad awennezeḍ akkw isenǧaqen n talɣut i akkw isebtar yellan deg umuɣ inek/inem n uɛassi.
-
-             Anagraw inek/inem n talɣut n {{SITENAME}}
+Anagraw inek/inem n talɣut n {{SITENAME}}
 
 --
 Iwakken ad beddeleḍ iɣewwaren n talɣut deg tirawt, ẓeṛ
 {{canonicalurl:{{#special:Preferences}}}}
 
-Iwakken ad beddeleḍ iɣewwaren n umuɣ inek/inem n uɛassi, ẓeṛ
+Iwakken ad beddeleḍ iɣewwaren n umuɣ inek/inem n uḍfar, ẓeṛ
 {{canonicalurl:{{#special:EditWatchlist}}}}
 
-Iwakken ad mḥuḍ asebter deg umuɣ inek/inem n uɛassi, ẓeṛ
+Iwakken ad mḥuḍ asebtar deg umuɣ inek/inem n uḍfar, ẓeṛ
 $UNWATCHURL
 
 Tuɣalin d tadhelt :
@@ -2093,6 +2175,10 @@ Tuɣalin d tadhelt :
 'delete-edit-reasonlist' => 'Beddel tiɣẓinin n umḥu n usebter',
 'delete-toobig' => 'Asebter agi yesɛa amezruy ameqqṛan aṭas n ibeddilen, yugar $1 {{PLURAL:$1|lqem|ileqman}}.
 Amḥu n isebtar am wagi yesɛa akref iwakken {{SITENAME}} ur yesɛu ara arway.',
+'delete-warning-toobig' => 'Asebtar agi yesɛa amezruy axatar n ibeddilen, ugaren $1 {{PLURAL:$1|lqem|ileqman}}.
+Tukksa-s tezmer ad terwi tiddit n taffa n isefka n {{SITENAME}} ;
+ilaq ad seqdeceḍ s-leɛqel.',
+'deleting-backlinks-warning' => "'''Ɣur-wet :''' Isebtar nniḍen sɛant azday ɣer asebtar i tebɣiḍ ad kkeseḍ.",
 
 # Rollback
 'rollback' => 'Semmet ibeddilen',
@@ -2102,8 +2188,15 @@ Amḥu n isebtar am wagi yesɛa akref iwakken {{SITENAME}} ur yesɛu ara arway.'
 'rollbacklinkcount-morethan' => 'semmet ugar n $1 {{PLURAL:$1|abeddel|ibeddilen}}',
 'rollbackfailed' => 'Asemmet yexseṛ',
 'cantrollback' => 'Ur yezmir ara ad yessuɣal; yella yiwen kan amseqdac iwumi ibeddel/yexleq asebter-agi.',
+'alreadyrolled' => 'Ulamek an semmet abeddel aneggaru n usebtar « [[:$1]] » yetwaxeddemen sɣur [[User:$2|$2]] ([[User talk:$2|Mmeslay]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) ;
+wayeḍ nniḍen yebeddel yakan neɣ yesemmet asebtar nni.
+
+Abeddel aneggaru n usebtar yetwaxeddemen sɣur [[User:$3|$3]] ([[User talk:$3|Discuter]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).',
 'editcomment' => "Agzul n ubeddel yella: \"''\$1''\".",
 'revertpage' => 'Yessuɣal ibeddlen n [[Special:Contributions/$2|$2]] ([[User talk:$2|Meslay]]); yettubeddel ɣer tasiwelt taneggarut n [[User:$1|$1]]',
+'revertpage-nouser' => 'Tiririt n ibeddilen sur amseqdac yeffren ar lqem aneggaru sɣur {{GENDER:$1|[[User:$1|$1]]}}',
+'rollback-success' => 'Asemmet n ibeddilen yetwaxeddemen sɣur $1 ;
+tuqqla ar lqem aneggaru sɣur $2.',
 
 # Edit tokens
 'sessionfailure-title' => 'Anezri n tɣimit',
@@ -2113,6 +2206,8 @@ G leɛnayek wekki ɣef taqeffalt "Back/Précédent" n browser/explorateur inek,
 
 # Protect
 'protectlogpage' => 'Aɣmis n wemḥay',
+'protectlogtext' => 'Atan umuɣ n ibeddilen n immestan n isebtar.
+Zeṛ [[Special:ProtectedPages|umuɣ n isebtar yettwaḥerzen]] i umuɣ n immestan timiranin.',
 'protectedarticle' => '"[[$1]]" yettwaḥrez',
 'modifiedarticleprotection' => 'yebeddel aswir n usegdel n « [[$1]] »',
 'unprotectedarticle' => 'yekkes asegdel n « [[$1]] »',
@@ -2122,24 +2217,42 @@ G leɛnayek wekki ɣef taqeffalt "Back/Précédent" n browser/explorateur inek,
 'prot_1movedto2' => '[[$1]] yettusmimeḍ ar [[$2]]',
 'protect-badnamespace-title' => 'Tallunt n isemawen ur nezmer ara an segdel',
 'protect-badnamespace-text' => 'Isebtar deg tallunt agi n isemawen ur zemren ara ad sɛun asegdel.',
+'protect-norestrictiontypes-text' => 'Asebtar agi ur yezmer ara ad yettwaḥerzen acku ulac tawsit n usewḥel yestufan.',
+'protect-norestrictiontypes-title' => 'Asebtar ur yettwaḥerzen ara',
 'protect-legend' => 'Sentem tiḥḥerzi',
 'protectcomment' => 'Taɣẓint :',
 'protectexpiry' => 'Azmez n tasewti :',
 'protect_expiry_invalid' => 'Azmez n tasewti ur yeɣbel ara.',
 'protect_expiry_old' => 'Azmez n tasewti i ɛedda.',
 'protect-unchain-permissions' => 'Kkes aseḍru i aṭas n tixtiṛiyin n usegdel',
+'protect-text' => "Tzemreḍ ad zṛeḍ dɣa ad beddeleḍ aswir n ummesten n usebtar '''$1'''.",
+'protect-locked-blocked' => "Ur tzemreḍ ara ad beddeleḍ iswiren n ummesten skud tewḥeleḍ.
+Zeṛ iɣewwaren imiranen n usebtar '''$1''' :",
+'protect-locked-dblock' => "Aswir n ummesten ur yezmer ara ad yetbeddel acku taffa n isefka tesekkweṛ.
+Zeṛ iɣewwaren imiranen n usebtar '''$1''' :",
+'protect-locked-access' => "Ur tesɛiḍ ara izerfan iḍulliyen iwakken ad beddeleḍ iswiren n ummesten n isebtar.
+Zeṛ iɣewwaren imiranen n usebtar '''$1''' :",
+'protect-cascadeon' => 'Asebtar agi yettwaḥerz acku yessedda-d deg {{PLURAL:$1|usebtar uḍfiṛ, yettwaḥerzen|isebtar uḍfiṛ, yettwaḥerzen}} s taxtiṛit « ammesten s uceṛcuṛ » yessermeden. Tzemreḍ ad beddeleḍ aswir n ummesten n usebtar agi war ad yebeddel ammesten s uceṛcuṛ.',
 'protect-default' => '(ameslugen)',
-'protect-fallback' => 'Yeḥweǧ atrug « $1 »',
+'protect-fallback' => 'Ssireg kan imseqdacen s uzref « $1 »',
+'protect-level-autoconfirmed' => 'Ssireg kan imseqdacen i sergegen iman-nsen',
 'protect-level-sysop' => 'Ssireg inedbalen kan',
 'protect-summary-cascade' => 'acercur',
 'protect-expiring' => 'yemmut deg $1 (UTC)',
 'protect-expiring-local' => 'ad i neffeṛ ass n $1',
 'protect-expiry-indefinite' => 'ifeḍ',
+'protect-cascade' => 'Mmesten isebtar i sseddan deg ttagi (ammesten s uceṛcuṛ)',
+'protect-cantedit' => 'Ur tzemreḍ ara ad beddeleḍ iswiren n ummesten n usebtar agi acku ur tesɛiḍ ara turagt att beddeleḍ.',
 'protect-othertime' => 'Azmez nniḍen n tasewti :',
 'protect-othertime-op' => 'azmez nniḍen n tasewti',
 'protect-existing-expiry' => 'Yella azmez n tasewti : $2 af $3',
 'protect-otherreason' => 'Taɣẓint nniḍen / taɣzint tamarnant :',
 'protect-otherreason-op' => 'Taɣẓint nniḍen',
+'protect-dropdown' => '* Tiɣẓinin n ummesten tunnimin
+** Axṣar s uzerray
+** Emails yerkan
+** Ccwal n ibeddilen yellan mgal-tiffursa
+** Asebtar s uɛeddi ameqran',
 'protect-edit-reasonlist' => 'Beddel tiɣẓinin n usegdel',
 'protect-expiry-options' => '1 asrag:1 hour,1 ass:1 day,1 imalas:1 week,2 imalasen:2 weeks,1 aggur:1 month,3 agguren:3 months,6 agguren:6 months,1 assegwas:1 year,adfi:infinite',
 'restriction-type' => 'Turagt',
@@ -2164,39 +2277,77 @@ G leɛnayek wekki ɣef taqeffalt "Back/Précédent" n browser/explorateur inek,
 'undeletepage' => 'Ẓeṛ dɣa erred isebtar yetwekkesen',
 'undeletepagetitle' => "'''Umuɣ agi yesɛa ileqman yetwekkesen n [[:$1|$1]]'''.",
 'viewdeletedpage' => 'Ẓer isebtar yettumḥan',
+'undeletepagetext' => '{{PLURAL:$1|Asebtar agi uḍfiṛ yetwekkes, tura atan|Isebtar agi uḍfiṛen tetwekkesen, tura aten-id}} deg taffa n isefka n
+weɣbaṛ, anda {{PLURAL:$1|yezmer ad yesɛu tiririt|zemren ad sɛun tiririt}}.
+Aɣbaṛ yezmer ad yetssizedig s tallit.',
 'undelete-fieldset-title' => 'Erred ileqman',
+'undeleteextrahelp' => "Iwakken ad erreḍ amezruy ummid n usebtar agi, ilaq ad eǧǧeḍ akkw tinkulin war amidag dɣa senned ɣef '''''Tiririt'''''.
+Iwakken ad xeddemeḍ tiririt i yiwen aḥric kan, rnud amidag deg tinkulin n ileqman i tebɣiḍ ad erreḍ, dɣa senned ɣef '''''Tiririt'''''.",
 'undeleterevisions' => '$1 {{PLURAL:$1|lqem i ɣbeṛen|ileqman i ɣbeṛen}}',
+'undeletehistory' => 'Ma tebɣiḍ ad erreḍ asebtar, akkw ileqman ad erren deg umezruy.
+Ma asebtar amaynut yexelqed s isem am winna seg tukksa, ileqman yetwerran ad illin beqqeḍen deg umezruy uzwir dɣa lqem amiran ur d yetbeddel ara s uwurman.',
+'undeleterevdel' => 'Tiririt ur tezmer ara att illi ma, Deg tagara, lqem aneggaru n usebtar neɣ n ufaylu ad yeqqim yetwakkes s uzgen.
+Deg tajṛut am ttagi, ilaq ad ekkseḍ amidag deg tankult neɣ ad ekkseḍ tagelmust ileqman ineggura yetumḥan (deg uqerru n umuɣ).',
+'undeletehistorynoadmin' => 'Asebtar agi yetwekkes.
+Taɣzint n tukksa att affeḍ deg ugzul ddaw-agi, s ttfaṣil n imseqdacen i tbeddelen uqbel ad yetwekkes.
+Agbur n ileqman yetwekksen ad wettwadaf kan i inedbalen.',
+'undelete-revision' => 'Lqem yetwekksen n $1 (lqem n $4 af $5) sɣur $3 :',
+'undeleterevision-missing' => 'Lqem arameɣtu neɣ ulac-it.
+Ahat tesɛiḍ azday arameɣtu, neɣ lqem yetwerr neɣ yetwekkes seg aɣbaṛ.',
+'undelete-nodiff' => 'Ur d-n-uffa ara lqem aneggaru.',
 'undeletebtn' => 'Err-it',
 'undeletelink' => 'ẓeṛ/uɣaled',
 'undeleteviewlink' => 'ẓeṛ',
 'undeleteinvert' => 'Snegdam ayen textareḍ',
 'undeletecomment' => 'Taɣẓint :',
+'undeletedrevisions' => '$1 {{PLURAL:$1|lqem yetwerren|ileqman yetwerren}}',
+'undeletedrevisions-files' => '$1 {{PLURAL:$1|lqem|ileqman}} d $2 {{PLURAL:$2|afaylu|ifuyla}} {{PLURAL:$2|yetwerr|twerren}}',
+'undeletedfiles' => '$1 {{PLURAL:$1|afaylu yetwerr|ifuyla twerren}}',
+'cannotundelete' => 'Abrir n tiririt :
+$1',
+'undeletedpage' => "'''Asebtar $1 yetwerr.'''
+
+Zeṛ [[Special:Log/delete|aɣmis n tukksiwin]] iwakken ad zṛeḍ umuɣ n tukksiwin d tiririyin timaynutin.",
 'undelete-header' => 'Ẓer [[Special:Log/delete|aɣmis n umḥay]] i isebtar ttumḥan tura.',
 'undelete-search-title' => 'Nadi ɣef isebtar yettumḥan',
 'undelete-search-box' => 'Nadi ɣef isebtar yettumḥan',
 'undelete-search-prefix' => 'Ssken isebtar i yebdan s:',
 'undelete-search-submit' => 'Nadi',
 'undelete-no-results' => 'Ur yufi ara ulaḥedd n wawalen i tnadiḍ ɣef isebtar deg iɣbaren.',
+'undelete-filename-mismatch' => 'Ulamek an err lqem n ufaylu n wass n $1 : isem n ufaylu ur yezga ara.',
+'undelete-bad-store-key' => 'Ulamek an err lqem n ufaylu n wass n $1 : afaylu ulac-it uqbel tukksa.',
+'undelete-cleanup-error' => 'Tuccḍa deg tukksa n ufaylu n weɣbaṛ ur yetseqdacen ara « $1 ».',
+'undelete-missing-filearchive' => 'Ulamek an err afaylu n weɣbaṛ s tamagit $1 acku ulac it deg taffa n isefka.
+Ahat yetwerr yakan.',
+'undelete-error' => 'Asebtar n tuccḍa n usemmet',
+'undelete-error-short' => 'Tuccḍa deg tiririt n ufaylu : $1',
+'undelete-error-long' => 'LLant tuccḍiwin deg tiririt n ufaylu:
+
+$1',
 'undelete-show-file-confirm' => 'Tebɣriḍ ad ẓṛeḍ lqem yemḥan n ufaylu « <nowiki>$1</nowiki> » n $2 af $3 ?',
 'undelete-show-file-submit' => 'Ih',
 
 # Namespace form on various pages
 'namespace' => 'Talluntin n isemawen :',
 'invert' => 'Snegdam ayen textareḍ',
+'tooltip-invert' => 'Sekcem amidag deg tankult agi iwakken ad ffereḍ ibeddilen n isebtar deg tallunt n isemawen yettwafren (dɣa tallunt n isemawen yeqqnen ma yella amidag deg tankult)',
+'namespace_association' => 'Tallunt n isemawen yeqqenen',
+'tooltip-namespace_association' => 'Sekcem amidag deg tankult agi iwakken ad rnuḍ daɣen tallunt n isemawen n umyannan yeqqnen ar tallunt n  isemawen yettwafren',
 'blanknamespace' => '(Amenzawi)',
 
 # Contributions
-'contributions' => 'Tikkin n wemseqdac',
+'contributions' => 'Ittekkiyen n {{GENDER:$1|umseqdac|tamseqdact}}',
 'contributions-title' => 'Umuɣ n tikkin n umseqdac $1',
-'mycontris' => 'Tikkin inu',
-'contribsub2' => 'n $1 ($2)',
+'mycontris' => 'Ittekkiyen',
+'contribsub2' => 'I {{GENDER:$3|$1}} ($2)',
 'nocontribs' => 'Ur yufi ara abddel i tebɣiḍ.',
-'uctop' => '(taneggarut)',
+'uctop' => '(amiran)',
 'month' => 'Seg uggur (d wid uqbel) :',
 'year' => 'Seg useggwas (d wid uqbel) :',
 
 'sp-contributions-newbies' => 'Ssken tikkin n yimseqdacen imaynuten kan',
 'sp-contributions-newbies-sub' => 'I yisem yimseqdacen imaynuten',
+'sp-contributions-newbies-title' => 'Ittekkiyen n imseqdacen gar imiḍanen imaynuten',
 'sp-contributions-blocklog' => 'Aɣmis n uɛeṭṭil',
 'sp-contributions-deleted' => 'isekcam yemḥan',
 'sp-contributions-uploads' => 'izdamen',
@@ -2228,21 +2379,55 @@ Asekcem aneggaru n useklas n ikyafen yella ddaw agi :',
 'whatlinkshere-hideredirs' => '$1 aceggeε ɣer',
 'whatlinkshere-hidetrans' => '$1 aseddu',
 'whatlinkshere-hidelinks' => '$1 izdayen',
-'whatlinkshere-hideimages' => '$1 tugniwin i qqenen',
+'whatlinkshere-hideimages' => '$1 ifuyla iqqenen',
 'whatlinkshere-filters' => 'Tistaytin',
 
 # Block/unblock
+'autoblockid' => 'Asewḥel awurman #$1',
 'block' => 'Ɛekkel aseqdac',
+'unblock' => 'Aksasewḥel n umseqdac',
 '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.
+Asket am wagi, ur ilaq ad yetwexddem kan iwakken ad yeεeggen axeṣṣar dɣa ilaq ad yemtawi s [[{{MediaWiki:Policy-url}}|ilugan igensanen]].
+Efked ddaw-agi taɣẓint tusdidt (amedya : efked isebtar yetwaxeṣṣren).',
 'ipadressorusername' => '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
+** Taguri n tilɣa n ukellax
+** Tukksa war assefhem n ugbur n isebtar
+** Taguri s uɛiwed n izdayen uffiɣen ɣer idellilen (abluleɣ)
+** Taguri n ugbur war anamek d tursaḍ deg isebtar
+** Aneɛruḍ n umsiged neɣ ubbezbax
+** Tafuli n useqdac n aṭas imiḍanen
+** Isem n umseqdac ur nezmer ara an qbel, d-anergam neɣ d-abucemmat',
+'ipb-hardblock' => 'Qareɛ imseqdacen yeqqnen ad beddelen s tansa IP agi',
+'ipbcreateaccount' => 'Qareɛ asnulfu n umiḍan',
+'ipbemailban' => 'Qareɛ amseqdac ad yecggaɛ e-mails',
+'ipbenableautoblock' => 'Sewḥel s-uwurman tansa IP taneggarut yetseqdacen sɣur amseqdac d akk IP ines nniḍen ay d-yetteddun',
 'ipbsubmit' => 'Ɛekkel amseqdac-agi',
 'ipbother' => 'Tanzagt  nniḍen :',
 'ipboptions' => '2 isragen:2 hours,1 ass:1 day,3 ussan:3 days,1 imalas:1 week,2  imalasen:2 weeks,1 aggur:1 month,3 agguren:3 months,6 agguren:6 months,1 aseggwas:1 year,afdi:infinite',
 'ipbhidename' => 'Ffer isem n useqdac deg ibeddilen d umuγen',
 'ipbwatchuser' => 'Ḍfer isebtar n iseqdacen d idiwenniyen n useqdac agi',
+'ipb-disableusertalk' => 'Qareɛ amseqdac ad yebeddel asebtar-is n umyannan mi yella asewḥel',
+'ipb-change-block' => 'Sewḥel tikkelt nniḍen amseqdac agi s iɣewwaren agi',
+'ipb-confirm' => 'Sergeg asewḥel',
 'badipaddress' => 'Tansa IP mačči d ṣaḥiḥ',
+'blockipsuccesssub' => 'Asewḥel yetwexddem',
+'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] {{GENDER:$1|yetsewḥel|tetsewḥel|}}.<br />
+Zeṛ [[Special:BlockList|umuɣ n isewḥal]] iwakken ad zṛeḍ isewḥal.',
+'ipb-blockingself' => '{{GENDER:|Aqlak|Aqlakem}}-id ad sewḥeleḍ iman-{{GENDER:|ik|im}}',
+'ipb-confirmhideuser' => '{{GENDER:|Aqlak|Aqlakem}}-id ad sewḥeleḍ amseqdac s « ffer amseqdac » yessermed. Waya ad yekkes isem n umseqdac deg akkw umuɣen d isekcam n uɣmis. Tebɣiḍ ad xeddemeḍ aya ?',
+'ipb-confirmaction' => 'Ma teḥsiḍ tebɣiḍ at xeddemeḍ, ilaq ad rnuḍ amidag deg tankult « {{int:ipb-confirm}} » ddaw-agi.',
+'ipb-edit-dropdown' => 'Beddel tiɣẓinin n usewḥel s lexṣas',
+'ipb-unblock-addr' => 'Aksasewḥel $1',
+'ipb-unblock' => 'Aksasewḥel amiḍan n umseqdac neɣ tansa IP',
+'ipb-blocklist' => 'Zeṛ isewḥelen yellan',
+'ipb-blocklist-contribs' => 'Ittekkiyen i $1',
+'unblockip' => 'Ekkes asewḥel n umseqdac',
+'unblockiptext' => 'Seqdec tiferkit ddaw-agi iwakken ad erreḍ addaf i ibeddilen seg yiwet tansa IP neɣ yiwen isem n umseqdac.',
 'ipusubmit' => 'Ekkes akyaf agi',
 'unblocked' => 'Yetwekkes akyaf n [[User:$1|$1]]',
 'unblocked-range' => 'Yetwekkes akyaf n $1',
@@ -2277,17 +2462,60 @@ Asekcem aneggaru n useklas n ikyafen yella ddaw agi :',
 'change-blocklink' => 'beddel asewḥel',
 'contribslink' => 'tikkin',
 'emaillink' => 'Ceggaɛ e-mail',
+'autoblocker' => 'Tetsewḥeleḍ s uwurman acku tansa IP inek/inem yeseqdac-itt « [[User:$1|$1]] ». Taɣzint id efkan i usewḥel agi d : « $2 ».',
 'blocklogpage' => 'Aɣmis n isewḥelen',
+'blocklog-showlog' => 'Amseqdac agi, yetseweḥel uqbel. Ad affeḍ aɣmis n isewḥal ddaw-agi :',
+'blocklog-showsuppresslog' => 'Amseqdac agi, yetseweḥel dɣa yeweffer uqbel. Ad affeḍ aɣmis n tukksiwin ddaw-agi :',
 'blocklogentry' => 'yesewḥel [[$1]] ; alama : $2 $3',
+'reblock-logentry' => 'yebeddel iɣewwaren n usewḥel n [[$1]] s tasewtit ar $2 $3',
+'blocklogtext' => 'Wagi d-aɣmis n tigawin n usewḥel d aksusewḥel n imseqdacen.
+Tansiwin IP yestsuwḥelen s-uwurman ulac-itent deg umuɣ agi.
+Ẓer [[Special:BlockList|umuɣ n isewḥal]] iwakken ad ẓṛeḍ iḍeggiren d isewḥal yellan tura.',
+'unblocklogentry' => 'yekkes asewḥel n $1',
 'block-log-flags-anononly' => 'Imseqdacen udrigen kan',
 'block-log-flags-nocreate' => 'asnulfu n umiḍan yessegdel',
+'block-log-flags-noautoblock' => 'akyaf awurman yensa',
+'block-log-flags-noemail' => 'e-mail yekyef',
+'block-log-flags-nousertalk' => 'ur yezmer ara ad yebeddel asebter-is n umeslay',
+'block-log-flags-angry-autoblock' => 'manasewḥel yesselhan yesermed',
+'block-log-flags-hiddenname' => 'isem n umseqdac yeffer',
+'range_block_disabled' => 'Azref n unedbal i usnulfu n isewḥal n tagrummiwin IP yensa.',
+'ipb_expiry_invalid' => 'Tanzagt n tasewti ur teɣbel ara.',
+'ipb_expiry_temp' => 'Isewḥal n isemawen n imseqdacen yeffren ilaq ad illin d-imeɣlalen.',
+'ipb_hide_invalid' => 'Ulamek an ekkes amiḍan agi ; yesɛa ugar n {{PLURAL:$1|yiwen abeddel|$1 ibeddilen}}.',
+'ipb_already_blocked' => '« $1 » yesewḥel yakan',
+'ipb-needreblock' => '« $1 » yesewḥel yakan. Tebɣiḍ ad beddeleḍ iɣewwaren ?',
+'ipb-otherblocks-header' => '{{PLURAL:$1|Asewḥel nniḍen|Isewḥelen nniḍen}}',
+'unblock-hideuser' => 'Ur tzemreḍ ara ad sewḥeleḍ amseqdac agi, acku isem-is n umseqdac yetweffer.',
+'ipb_cant_unblock' => 'Tuccḍa : ID n usewḥel $1 ulac-it.
+Ahat asewḥel yetwekkes yakan.',
+'ipb_blocked_as_range' => 'Tuccḍa : tansa IP $1 ur t-uwḥel ara srid dɣa ulamek an ekkes asewḥel.
+Lamaɛna tezga deg tagrumma $2 i nezmer an ekkes asewḥel.',
+'ip_range_invalid' => 'Tagrumma IP artameɣtut',
 'proxyblockreason' => 'Tansa n IP inek teɛkel axaṭer nettat "open proxy". G leɛnayek, meslay akk d provider inek.',
 'sorbsreason' => 'Tansa IP inek/inem tella deg yiwen umuɣ am "open proxy" deg DNSBL yettuseqdac deg {{SITENAME}}.',
 'sorbs_create_account_reason' => 'Tansa IP inek/inem tella deg yiwen umuɣ am "open proxy" deg DNSBL yettuseqdac deg {{SITENAME}}.
 Ur tezmireḍ ara ad snulfuḍ amiḍan.',
+'xffblockreason' => 'Yiwet tansa IP deg tasenṭit X-Forwarded-For header, tin inek/inem neɣ tin n uqeddac proxy i tseqeddeceḍ ,tesewḥel. Taɣzint n usewḥel amezrwaru : $1',
 
 # Developer tools
 'lockdb' => 'Sekker database',
+'unlockdb' => 'Kkes aseḍru n taffa n isefka',
+'lockdbtext' => 'Askaṛ n taffa n isefka ad yeqareɛ akkw imseqdacen ad beddelen isebtar, ad ḥerzen ismenyifen nsen, ad beddelen umuɣ nsen n uḍfar dɣa ad xeddmen akkw tigawin nniḍen yeḥwaǧen ibeddilen deg taffa n isefka.
+Ilaq ad sergegeḍ d-ayen yebɣiḍ ad xeddemeḍ dɣa ad ekkseḍ azekṛun deg taffa sakin tigawt inek/inem n ibeddi att fak.',
+'unlockdbtext' => 'Aksaskaṛ n taffa n isefka ad yeɛemmed i akkw imseqdacen ad beddelen isebtar, ad beddelen ismenyifen nsen, ad beddelen umuɣ nsen n uḍfar dɣa ad xeddmen akkw tigawin nniḍen yeḥwaǧen ibeddilen deg taffa n isefka.
+
+Ilaq ad sergegeḍ d-ayen yebɣiḍ ad xeddemeḍ.',
+'lockconfirm' => 'Ih, bɣiɣ ad sekṛeɣ taffa n isefka.',
+'unlockconfirm' => 'Ih, bɣiɣ ad ekkeseɣ aksskeṛeɣ taffa n isefka.',
+'lockbtn' => 'Sekker taffa n isefka',
+'unlockbtn' => 'Kkes aseḍru n taffa n isefka',
+'lockdbsuccesssub' => 'Askaṛ n taffa n isefka yetwexddem',
+'unlockdbsuccesssub' => 'Asewḥel n taffa n isefka yetwekkes',
+'unlockdbsuccesstext' => 'Askaṛ n taffa n isefka yetwekkes.',
+'lockfilenotwritable' => 'Ur tzemreḍ ara ad aruḍ deg ufaylu n uskaṛ n taffa n isefka.
+Ma tebɣiḍ ad sewḥeleḍ neɣ ad ekkseḍ asewḥel ɣef taffa n isefka, ilaq aqeddac web ad yezmer ad yaru deg ufaylu agi.',
+'lockedbyandtime' => '(sɣur $1 ass n $2 af $3)',
 
 # Move page
 'move-page' => 'Beddel isem n $1',
@@ -2306,6 +2534,8 @@ Lukan akka, yessefk a t-tedmeḍ weḥdek.",
 'movearticle' => 'Smimeḍ asebter',
 'movenologintext' => 'Yessefk ad tesɛuḍ isem n wemseqdac u [[Special:UserLogin|tkecmeḍ]]
 iwakken ad tesmimḍeḍ asebter.',
+'movenotallowed' => 'Ur tesɛiḍ ara turagt ad beddeleḍ isem n isebtar.',
+'cant-move-user-page' => 'Ur tesɛiḍ ara turagt ad beddeleḍ isem n isebtar igejdanen n imseqdacen',
 'newtitle' => 'Ar azwel amaynut',
 'move-watch' => 'Ɛass asebter-agi',
 'movepagebtn' => 'Smimeḍ asebter',
@@ -2314,8 +2544,13 @@ iwakken ad tesmimḍeḍ asebter.',
 isem ayen textareḍ mačči d ṣaḥiḥ.
 Xtar yiwen nniḍen.',
 'movetalk' => 'Smimeḍ asebter n umyannan (n umagrad-nni)',
+'move-subpages' => 'Beddel isem n adu-isebtar (alma d $1 {{PLURAL:$1|asebtar|isebtar}})',
+'move-talk-subpages' => 'Beddel adu-isebtar n usebtar n amyannan (alma d $1 isebtar)',
 'movelogpage' => 'Aɣmis n usemmimeḍ',
 'movelogpagetext' => 'Akessar yella wumuɣ n isebtar yettusmimeḍen.',
+'movesubpage' => '{{PLURAL:$1|Adu-asebtar|Adu-isebtar}}',
+'movesubpagetext' => 'Asebtar agi yesɛa $1 {{PLURAL:$1|adu-asebtar yebeqqeḍen|adu-isebtar yebeqqeḍen}} ddaw-agi.',
+'movenosubpage' => 'Asebtar agi ur yesɛ ara adu-asebtar',
 'movereason' => 'Ayɣer',
 'revertmove' => 'Uɣal ar tasiwelt ssabeq',
 'delete_and_move' => 'Mḥu u smimeḍ',
@@ -2325,6 +2560,7 @@ Anda tebɣiḍ tesmimeḍ "[[:$1]]" yella yagi. tebɣiḍ ad temḥuḍ iwakken
 'delete_and_move_confirm' => 'Ih, mḥu asebter',
 'delete_and_move_reason' => 'Asebter yemḥa iwakken yeqqim-d wemkan i usmimeḍ seg "[[$1]]"',
 'selfmove' => 'Izwal amezwaru d uneggaru kif-kif; ur yezmir ara ad yesmimeḍ asebter ɣur iman-is.',
+'immobile-target-namespace-iw' => 'Izdayen interwiki mačči d iswi ameɣtu i imussa.',
 
 # Export
 'export' => 'Ssufeɣ isebtar',
@@ -2357,11 +2593,14 @@ Anda tebɣiḍ tesmimeḍ "[[:$1]]" yella yagi. tebɣiḍ ad temḥuḍ iwakken
 'thumbnail-more' => 'Ssemɣer',
 'filemissing' => 'Afaylu ulac-it',
 'thumbnail_error' => 'Agul asmi yexleq tugna tamecṭuḥt: $1',
+'thumbnail_error_remote' => 'Izen n tuccḍa n $1 :
+$2',
 'djvu_page_error' => 'Asebter DjVu yeffeɣ seg tilisa',
 
 # Special:Import
 'import' => 'Ssekcem isebtar',
 'importinterwiki' => 'Assekcem n transwiki',
+'import-interwiki-source' => 'Wiki d usebtar n taɣbalut',
 'import-interwiki-history' => 'Xdem alsaru n akk tisiwal umezruy n usebter-agi',
 'import-interwiki-submit' => 'Ssekcem',
 'import-interwiki-namespace' => 'Azen isebtar ar isem n taɣult:',
@@ -2379,6 +2618,8 @@ Anda tebɣiḍ tesmimeḍ "[[:$1]]" yella yagi. tebɣiḍ ad temḥuḍ iwakken
 'importhistoryconflict' => 'Amennuɣ ger tisiwal n umezruy (ahat asebter-agi yettwazen yagi)',
 'importnosources' => 'Asekcam n transwiki ur yexdim ara u amezruy n usekcam yettwakkes.',
 'importnofile' => 'ulaḥedd afaylu usekcam ur yettwazen.',
+'import-rootpage-invalid' => 'Asebtar aẓar id efkeḍ d-azwel ur ɣblen ara.',
+'import-rootpage-nosubpage' => 'Tallunt n isemawen « $1 » n usebtar aẓar ur yeqbel ara adu-isebtar.',
 
 # Import log
 'importlogpage' => 'Aɣmis n usekcam',
@@ -2388,6 +2629,16 @@ Anda tebɣiḍ tesmimeḍ "[[:$1]]" yella yagi. tebɣiḍ ad temḥuḍ iwakken
 'import-logentry-interwiki' => '$1 s transwiki',
 'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|lqem|ileqman}} seg $2',
 
+# JavaScriptTest
+'javascripttest' => 'Tarmit n JavaScript',
+'javascripttest-title' => 'Asselkem n tirmitin $1',
+'javascripttest-pagetext-noframework' => 'Asebtar agi yeḥeṛṛ i usselkem n tirmitin JavaScript.',
+'javascripttest-pagetext-unknownframework' => 'Tamṣuka « $1 » warisem.',
+'javascripttest-pagetext-frameworks' => 'Ilaq ad xetreḍ yiwet n timṣukyin n tarmit agi : $1',
+'javascripttest-pagetext-skins' => 'Xter agwlim s anwa ad xeddemeḍ tarmit :',
+'javascripttest-qunit-intro' => 'Zeṛ [$1 tumlin n tarmit] ɣef mediawiki.org.',
+'javascripttest-qunit-heading' => 'Azrar n tarmit QUnit n JavaScript ɣef MediaWiki',
+
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'Asebter n umseqdac inu',
 'tooltip-pt-anonuserpage' => 'Asebter n wemseqdac n IP wukud tekkiḍ',
@@ -2405,6 +2656,7 @@ Anda tebɣiḍ tesmimeḍ "[[:$1]]" yella yagi. tebɣiḍ ad temḥuḍ iwakken
 'tooltip-ca-viewsource' => 'Asebter-agi yettwaḥrez. Tzemreḍ ad twaliḍ aɣbalu-ines.',
 'tooltip-ca-history' => 'Tisiwal ssabeq n usebter-agi.',
 'tooltip-ca-protect' => 'Ḥrez asebter-agi',
+'tooltip-ca-unprotect' => 'Beddel amesten n usebtar-agi',
 'tooltip-ca-delete' => 'Mḥu asebter-agi',
 'tooltip-ca-undelete' => 'Err akk ibeddlen n usebter-agi i yellan uqbel ad yettwamḥu usebter',
 'tooltip-ca-move' => 'Smimeḍ asebter-agi',
@@ -2447,18 +2699,28 @@ Anda tebɣiḍ tesmimeḍ "[[:$1]]" yella yagi. tebɣiḍ ad temḥuḍ iwakken
 'tooltip-diff' => 'Ssken ayen tbeddleḍ deg uḍris.',
 'tooltip-compareselectedversions' => 'Ẓer amgirred ger snat tisiwlini (i textareḍ) n usebter-agi.',
 'tooltip-watch' => 'Rnu asebter-agi i wumuɣ n uɛessi inu',
+'tooltip-watchlistedit-normal-submit' => 'Kkes izwal',
+'tooltip-watchlistedit-raw-submit' => 'Amucceḍ n umuɣ n uḍfar',
 'tooltip-recreate' => 'Ɛiwed xleq asebter ɣas akken yettumḥu',
+'tooltip-upload' => 'Beddu taktert',
 'tooltip-rollback' => '« Semmet » yesemmet s-yiwen asenned akk d-acu amseqdac aneggaru yebeddel deg usebter',
 'tooltip-undo' => '« Ssefsu » yesemmet abeddel agi dɣa i ldi asfaylu n ubeddel deg uskar n azaraskan. I ɛemmed an uɣal ar lqem n uqbel dɣa an rnu taɣẓint deg tanaka n ugzul.',
+'tooltip-preferences-save' => 'Ḥrez isemyifiyen',
 'tooltip-summary' => 'Sekcem agzul awezzlan',
+'interlanguage-link-title' => '$1 — $2',
+
+# Metadata
+'notacceptable' => 'Aqeddac wiki agi ur yezmer ara ad yefk isefka deg amasal ur yezmer ara ad yeɣar amsaɣ inek/inem.',
 
 # Attribution
 'anonymous' => '{{PLURAL:$1|Aseqdac udrig|Iseqdacen udrigen}} ɣef {{SITENAME}}',
 'siteuser' => '{{SITENAME}} amseqdac $1',
+'anonuser' => 'amseqdac abnabak $1 n {{SITENAME}}',
 'lastmodifiedatby' => 'Tikkelt taneggarut asmi yettubeddel asebter-agi $2, $1 sɣur $3.',
 'othercontribs' => 'Tikkin ɣef umahil n $1.',
 'others' => 'wiyaḍ',
 'siteusers' => '{{PLURAL:$2|aseqdac|iseqdacen}} $1 n {{SITENAME}}',
+'anonusers' => '{{PLURAL:$2|amseqdac abnabak|imseqdacen amseqdac abnabak}} $1 n {{SITENAME}}',
 'creditspage' => 'Win ixedmen asebter',
 'nocredits' => 'Ulac talɣut ɣef wayen ixedmen asebter-agi.',
 
@@ -2469,9 +2731,13 @@ Anda tebɣiḍ tesmimeḍ "[[:$1]]" yella yagi. tebɣiḍ ad temḥuḍ iwakken
 'spambot_username' => 'Assizdeg n spam sɣur MediaWiki',
 'spam_reverting' => 'Asuɣal i tasiwel taneggarut i ur tesɛi ara izdayen ɣer $1',
 'spam_blanking' => 'Akk tisiwal sɛan izdayen ɣer $1, ad yemḥu',
+'spam_deleting' => 'Akkw ileqman yesɛan izdayen ɣer $1, tukksa',
+'simpleantispam-label' => "Assefqed mgal e-mail yerkan.
+Ur-d t-aru '''ACEMMA''' d-agi !",
 
 # Info page
 'pageinfo-title' => 'Tilɣa i « $1 »',
+'pageinfo-not-current' => 'Ssurfet-aɣ, ulamek ad n-efk talɣut i ileqman iqdimen.',
 'pageinfo-header-basic' => 'Tilɣa n udasil',
 'pageinfo-header-edits' => 'Amezruy n ibeddilen',
 'pageinfo-header-restrictions' => 'Amesten n usebter',
@@ -2480,6 +2746,7 @@ Anda tebɣiḍ tesmimeḍ "[[:$1]]" yella yagi. tebɣiḍ ad temḥuḍ iwakken
 'pageinfo-default-sort' => 'Tasarut n ufran s lexṣas',
 'pageinfo-length' => 'Tiddi n usebter (s itamḍanen)',
 'pageinfo-article-id' => 'Uṭṭun n usebter',
+'pageinfo-language' => 'Tutlayt n ugbur n usebtar',
 'pageinfo-content-model' => 'Talɣa n ugbur n usebtar',
 'pageinfo-robot-policy' => 'Asbeddi sɣur iṛubuten',
 'pageinfo-robot-index' => 'Tessireg',
@@ -2497,10 +2764,13 @@ Anda tebɣiḍ tesmimeḍ "[[:$1]]" yella yagi. tebɣiḍ ad temḥuḍ iwakken
 'pageinfo-authors' => 'Amḍan aɣrud n imeskaren iwḥiden',
 'pageinfo-recent-edits' => 'Amḍan n ibeddilen imaynuten (deg $1 ineggura)',
 'pageinfo-recent-authors' => 'Amḍan n imeskaren iwḥiden imaynuten',
+'pageinfo-magic-words' => '{{PLURAL:$1|Awal n tiḥḥerga|Awalen n tiḥḥerga}} ($1)',
 'pageinfo-hidden-categories' => '{{PLURAL:$1|Taggayt yeffren|Taggayin yeffren}} ($1)',
 'pageinfo-templates' => '{{PLURAL:$1|Talɣa i seddan|Talɣiwin i seddan}} ($1)',
 'pageinfo-toolboxlink' => 'Tilɣa ɣef usebtar',
+'pageinfo-redirectsto' => 'Ceggaɛ ɣer',
 'pageinfo-redirectsto-info' => 'tiɣa',
+'pageinfo-contentpage' => 'Yetweḥseb am asebtar n ugbur',
 'pageinfo-contentpage-yes' => 'Ih',
 'pageinfo-protect-cascading-yes' => 'Ih',
 'pageinfo-category-info' => 'Tilɣa ɣef taggayt',
@@ -2524,6 +2794,13 @@ Anda tebɣiḍ tesmimeḍ "[[:$1]]" yella yagi. tebɣiḍ ad temḥuḍ iwakken
 
 # Image deletion
 'deletedrevision' => 'Tasiwelt taqdimt $1 tettumḥa.',
+'filedeleteerror-short' => 'Tuccḍ deg tukksa n ufaylu : $1',
+'filedeleteerror-long' => 'Llant tuccḍiwin deg tukksa n ufaylu :
+
+$1',
+'filedelete-missing' => 'Afaylu « $1 » ur yezmer ara ad yetwekkes acku ulac-it.',
+'filedelete-old-unregistered' => 'Lqem n ufaylu « $1 » ulac-it deg taffa n isefka.',
+'filedelete-current-unregistered' => 'Afaylu « $1 » ulac-it deg taffa n isefka.',
 
 # Browsing diffs
 'previousdiff' => '← Amgirred ssabeq',
@@ -2534,11 +2811,14 @@ Anda tebɣiḍ tesmimeḍ "[[:$1]]" yella yagi. tebɣiḍ ad temḥuḍ iwakken
 Lukan a t-tesseqdceḍ yezmer ad yexsser aselkim inek/inem.",
 'imagemaxsize' => "Tiddi tafellayt n tugniwin :<br />''(i isebtar n weglam ufaylu)''",
 'thumbsize' => 'Tiddi n tugna tamecṭuḥt:',
+'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|asebtar|isebtar}}',
 'file-info' => 'tiddi n ufaylu: $1, anaw n MIME: $2',
 'file-info-size' => '$1 × $2 pixel, tiddi n ufaylu: $3, anaw n MIME: $4',
 'file-nohires' => 'Ulac resolution i tameqqrant fell-as.',
 'svg-long-desc' => 'Afaylu SVG, tabadut n $1 × $2 pixel, lqedd : $3',
-'show-big-image' => 'Resolution tameqqrant',
+'show-big-image' => 'Afaylu aneṣli',
+'file-info-gif-looped' => 'deg taglult',
+'file-info-gif-frames' => '$1 {{PLURAL:$1|tugna|tugniwin}}',
 'file-info-png-looped' => 'deg taglult',
 'file-info-png-repeat' => 'yetwurar {{PLURAL:$1|tikelt|tikwal}}',
 'file-info-png-frames' => '$1 {{PLURAL:$1|tugna|tugniwin}}',
@@ -2676,6 +2956,37 @@ Izdayen nniḍen ɣef yiwen ajerriḍ llan d tisuraf, am isebtar ɣef anta tugna
 'exif-filesource' => 'Aɣbal n ufaylu',
 'exif-scenetype' => 'Tawsit n usayes',
 'exif-customrendered' => 'Agmuḍ asagan',
+'exif-exposuremode' => 'askar n timzikent',
+'exif-whitebalance' => 'Tisistelt n imellalen',
+'exif-digitalzoomratio' => 'Afmiḍi n zoom umḍin',
+'exif-focallengthin35mmfilm' => 'Teɣzef n usaḍas i usaru 35 mm',
+'exif-scenecapturetype' => 'Tawsit n tuddma n usayes',
+'exif-gaincontrol' => 'Aḥkam n urrbeḥ',
+'exif-contrast' => 'Amyeẓli',
+'exif-devicesettingdescription' => 'Aglam n tawila n allal',
+'exif-subjectdistancerange' => 'Ameccaq n tamsalt',
+'exif-imageuniqueid' => 'Asulay asuf n tugna',
+'exif-gpsversionid' => 'Lqem n ticṛeṭ GPS',
+'exif-gpslatituderef' => 'Tamselɣut i tafeltirit',
+'exif-gpslatitude' => 'Tafeltirit',
+'exif-gpslongituderef' => 'Tamselɣut i tazegrart',
+'exif-gpslongitude' => 'Tazegrart',
+'exif-gpsaltituderef' => 'Tamselɣut n usawen (0=asawen, 1=talqayt)',
+'exif-gpsaltitude' => 'Talqayt',
+'exif-gpstimestamp' => 'Asrag GPS (tamasragt tabelkamit)',
+'exif-gpssatellites' => 'Igensaten yetseqdacen i akat',
+'exif-gpsstatus' => 'Addad n unermas',
+'exif-gpsmeasuremode' => 'askar n akat',
+'exif-gpsdop' => 'Tiseddi n akat',
+'exif-gpsspeedref' => 'Aferdis n tazzla n unermas GPS',
+'exif-gpsspeed' => 'Tazzla n unermas GPS',
+'exif-gpstrack' => 'Tanila n uwliwel',
+'exif-gpsimgdirection' => 'Tanila n tugna',
+'exif-gpsdestlatitude' => 'Turrut n userken',
+'exif-gpsdestlongitude' => 'Tazegrart n userken',
+'exif-gpsdestdistance' => 'Ameccaq ar userken',
+'exif-gpsareainformation' => 'Isem n taɣzut GPS',
+'exif-gpsdatestamp' => 'Azmez GPS',
 'exif-worldregiondest' => 'Timnaḍin n umaḍal yebeqqeḍen',
 'exif-countrydest' => 'Timura yebeqqeḍen',
 'exif-countrycodedest' => 'Tangalt n tamurt yebeqqeḍen',
@@ -2702,9 +3013,10 @@ Izdayen nniḍen ɣef yiwen ajerriḍ llan d tisuraf, am isebtar ɣef anta tugna
 'exif-datetimereleased' => 'Tuffɣa ass n',
 'exif-originaltransmissionref' => 'Tangalt n usideg n tuzzna tamezwarut',
 'exif-identifier' => 'Asulay',
+'exif-label' => 'Aglam',
 
 'exif-copyrighted-true' => 'Ddaw azref n umeskar',
-'exif-copyrighted-false' => 'Taɣuly tazayezt',
+'exif-copyrighted-false' => 'Addad n izerfan n umeskar ur yesbadu ara',
 
 'exif-unknowndate' => 'Azmez warisem',
 
@@ -2952,6 +3264,7 @@ G leɛnaya-k sentem belli ṣaḥḥ tebɣiḍ ad tɛiwedeḍ axlaq n usebter-ag
 'imgmultipageprev' => '← asebter ssabeq',
 'imgmultipagenext' => 'asebter ameḍfir →',
 'imgmultigo' => 'Ruḥ!',
+'imgmultigoto' => 'Ruḥ ar usebtar $1',
 
 # Table pager
 'ascending_abbrev' => 'asawen',
@@ -3009,11 +3322,15 @@ G leɛnaya-k sentem belli ṣaḥḥ tebɣiḍ ad tɛiwedeḍ axlaq n usebter-ag
 'watchlisttools-raw' => 'Beddel umuɣ n uɛessi (raw)',
 
 # Core parser functions
+'unknown_extension_tag' => 'Ticṛeṭ n usiɣzef « $1 » warisem',
 'duplicate-defaultsort' => 'Ɣur-wet : tasarut n ufran m-ulac « $2 » atsefεej tasarut n uqbel « $1 ».',
 
 # Special:Version
 'version' => 'Lqem',
 'version-specialpages' => 'isebtar usligen',
+'version-other' => 'Nniḍen',
+'version-version' => '(lqem $1)',
+'version-poweredby-others' => 'nniḍen',
 'version-software' => 'Iseɣẓanen i serkeben',
 'version-software-product' => 'Afaris',
 'version-software-version' => 'Lqem',
@@ -3021,8 +3338,43 @@ G leɛnaya-k sentem belli ṣaḥḥ tebɣiḍ ad tɛiwedeḍ axlaq n usebter-ag
 'version-entrypoints-header-entrypoint' => 'Ired n wekcam',
 'version-entrypoints-header-url' => 'Tansa URL',
 
+# Special:Redirect
+'redirect-submit' => 'Ruḥ',
+'redirect-lookup' => 'Anadi :',
+'redirect-value' => 'Azal :',
+'redirect-user' => 'ID n umseqdac',
+'redirect-revision' => 'Tacaggart n usebtar',
+'redirect-file' => 'Isem n ufaylu',
+'redirect-not-exists' => 'Azal ulac-it',
+
+# Special:FileDuplicateSearch
+'fileduplicatesearch' => 'Anadi n allusen',
+'fileduplicatesearch-legend' => 'Nadi allus',
+'fileduplicatesearch-filename' => 'Isem n ufaylu :',
+'fileduplicatesearch-submit' => 'Nadi',
+'fileduplicatesearch-info' => '$1 × $2 pixel<br />Tiddi n ufaylu : $3<br />Anaw MIME : $4',
+'fileduplicatesearch-result-1' => 'Afaylu « $1 » ur yesɛa ara allus.',
+'fileduplicatesearch-result-n' => 'Afaylu « $1 » yesɛa {{PLURAL:$2|1 allus|$2 allusen}}.',
+'fileduplicatesearch-noresults' => 'Ulac afaylu s isem « $1 ».',
+
 # Special:SpecialPages
 'specialpages' => 'isebtar usligen',
+'specialpages-group-maintenance' => 'Iṛabulen n ibeddi',
+'specialpages-group-other' => 'Isebtar usligen nniḍen',
+'specialpages-group-login' => 'Asulu / assiggez',
+'specialpages-group-changes' => 'Ibeddilen imaynuten d iɣmisen',
+'specialpages-group-media' => 'Iṛabulen d taktert n ifuyla media',
+'specialpages-group-users' => 'Imseqdacen d izerfan yeqqnen',
+'specialpages-group-highuse' => 'Isebtar n usseqdec n waṭas',
+'specialpages-group-pages' => 'Umuɣen n isebtar',
+'specialpages-group-pagetools' => 'Ifecka i isebtar',
+'specialpages-group-wiki' => 'Isefka d ifecka',
+'specialpages-group-redirects' => 'Isebtar usligen yetsiwzelen',
+'specialpages-group-spam' => 'Ifecka mgal e-mail yerkan',
+
+# Special:BlankPage
+'blankpage' => 'Asebtar ilem',
+'intentionallyblankpage' => 'Asebtar agi, yetweǧǧ (qrib) d-ilem s lebɣi.',
 
 # External image whitelist
 'external_image_whitelist' => ' #Eǧǧ ajeṛṛiḍ agi aken yella.<pre>
@@ -3035,9 +3387,68 @@ G leɛnaya-k sentem belli ṣaḥḥ tebɣiḍ ad tɛiwedeḍ axlaq n usebter-ag
 #Ger akk tifersa n tinfaliyin timeɣẓanin nnig ajeṛṛiḍ  agi. Eǧǧ ajeṛṛiḍ agi aken yella.</pre>',
 
 # Special:Tags
+'tags' => 'Ticṛaḍ n ibeddilen sɣeblent',
 'tag-filter' => 'Astay n [[Special:Tags|ticraḍ]] :',
+'tag-filter-submit' => 'Sti',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Ticṛeṭ|Ticraḍ}}]] : $2)',
+'tags-title' => 'Ticraḍ',
+'tags-intro' => 'Asebtar agi yettaked umuɣ n ticraḍ ay aseɣẓan yezmer ad yeseqdec iwakken ad yecreḍ abeddel d anamek i yal abeddel.',
+'tags-tag' => 'Isem n ticṛeṭ',
+'tags-display-header' => 'Tummant deg umuɣen n ibeddilen',
+'tags-description-header' => 'Aglam ummid n ticṛeṭ',
+'tags-active-header' => 'Urmid ?',
+'tags-hitcount-header' => 'Ibeddilen yesɛan ticraḍ',
+'tags-active-yes' => 'Ih',
+'tags-active-no' => 'Ala',
+'tags-edit' => 'beddel',
+'tags-hitcount' => '$1 {{PLURAL:$1|abeddel|ibeddlen}}',
+
+# Special:ComparePages
+'comparepages' => 'Qaren isebtar',
+'compare-page1' => 'Asebtar 1',
+'compare-page2' => 'Asebtar 2',
+'compare-rev1' => 'Lqem 1',
+'compare-rev2' => 'Lqem 2',
+'compare-submit' => 'Qaren',
+'compare-invalid-title' => 'Azwel id efkiḍ ur yeɣbel ara.',
+'compare-title-not-exists' => 'Azwel id efkiḍ ulac-it.',
+'compare-revision-not-exists' => 'Lqem id efkiḍ ulac-it.',
+
+# Database error messages
+'dberr-header' => 'Wiki agi yesɛa ugur',
+'dberr-problems' => 'Ssurfet-aɣ ! Asmel agi yemliled ilɣiten itikniten.',
+'dberr-again' => 'Ɛreḍ ad arǧuḍ kra n tisdidin dɣa sismeḍ.',
+'dberr-info' => '(Ulamek an qqen ar uqeddac n taffa n isefka : $1)',
+'dberr-info-hidden' => '(Ulamek an qqen ar uqeddac n taffa n isefka)',
+
+# HTML forms
+'htmlform-submit' => 'Ssumer',
+'htmlform-reset' => 'Ekkes ibeddilen',
+'htmlform-selectorother-other' => 'Nniḍen',
+'htmlform-no' => 'Ala',
+'htmlform-yes' => 'Ih',
+'htmlform-chosen-placeholder' => 'Fren taxtiṛit',
 
 # New logging system
+'logentry-delete-delete' => '$1 {{GENDER:$2|yemḥa}} asebtar $3',
+'logentry-delete-restore' => '$1 {{GENDER:$2|yerred|terred}} asebtar $3',
+'logentry-delete-event' => '$1 {{GENDER:$2|yebeddel|tebeddel}} tabanit {{PLURAL:$5|n tadyant n uɣmis|n $5 tidyanin n uɣmis}} ɣef $3: $4',
+'logentry-delete-revision' => '$1 {{GENDER:$2|yebeddel|tebeddel}} tabani {{PLURAL:$5|n lqem|n $5 ileqman}} ɣef usebtar $3: $4',
+'logentry-delete-event-legacy' => '$1 {{GENDER:$2|yebeddel|tebeddel}} tabanit n tidyanin n uɣmis ɣef $3',
+'logentry-delete-revision-legacy' => '$1 {{GENDER:$2|yebeddel|tebeddel}} tabanit n ileqman ɣef usebtar $3',
+'logentry-suppress-delete' => '$1 {{GENDER:$2|yemḥa|temḥa}} asebtar $3',
+'logentry-suppress-event' => '$1 {{GENDER:$2|yebeddel s lbaḍna|tebeddel s lbaḍna}} tabanit {{PLURAL:$5|n tadyant n uɣmis|n $5 tidyanin n uɣmis}} ɣef $3: $4',
+'logentry-suppress-revision' => '$1 {{GENDER:$2|yebeddel s lbaḍna|tebeddel s lbaḍna}} tabani {{PLURAL:$5|n lqem|n $5 ileqman}} ɣef usebtar $3: $4',
+'logentry-suppress-event-legacy' => '$1 {{GENDER:$2|yebeddel s lbaḍna|tebeddel s lbaḍna}} tabanit n tidyanin n uɣmis ɣef $3',
+'logentry-suppress-revision-legacy' => '$1 {{GENDER:$2|yebeddel s lbaḍna|tebeddel s lbaḍna}} tabanit n ileqman ɣef usebtar $3',
+'revdelete-content-hid' => 'agbur yeffren',
+'revdelete-summary-hid' => 'agzul n ubeddil yeffren',
+'revdelete-uname-hid' => 'isem n umseqdac yeffren',
+'revdelete-content-unhid' => 'agbur yebeqqeḍen',
+'revdelete-summary-unhid' => 'agzul n ubeddil yebeqqeḍen',
+'revdelete-uname-unhid' => 'isem n umseqdac yebeqqeḍen',
+'logentry-move-move' => '$1 {{GENDER:$2|yebeddel isem|tebeddel isem}} n usebtar seg $3 ar $4',
+'logentry-move-move-noredirect' => '$1 {{GENDER:$2|yebeddel isem|tebeddel isem}} n usebtar seg $3 ar $4 war anegzum',
 'rightsnone' => '(ulaḥedd)',
 
 # Feedback
@@ -3046,6 +3457,23 @@ G leɛnaya-k sentem belli ṣaḥḥ tebɣiḍ ad tɛiwedeḍ axlaq n usebter-ag
 'feedback-cancel' => 'Semmewet',
 'feedback-submit' => 'Ceggaɛ iwenniten',
 'feedback-adding' => 'Rnud iwenniten inek/inem ar usebter...',
+'feedback-error1' => 'Tuccḍa : Agmuḍ n API ur yetwaɛqel ara',
+'feedback-error3' => 'Tuccḍa : Ulac tamrarut n API',
+'feedback-close' => 'D ayen',
+
+# Search suggestions
+'searchsuggest-search' => 'Nadi',
+
+# API errors
+'api-error-badtoken' => 'Tuccḍa tagensit : yir « tiddest ».',
+'api-error-fetchfileerror' => 'Tuccḍa tagensit : Yella kra ur yaɛeddan ara s luwqem deg tiririt n ufaylu.',
+'api-error-http' => 'Tuccḍa tagensit : ur yezmer ara ad yeqqen ar uqeddac.',
+'api-error-ok-but-empty' => 'Tuccḍa tagensit : Ulac tamrarut seg uqeddac.',
+'api-error-stashfailed' => 'Tuccḍa tagensit : aqeddac ur yezmer ara ad yekles afaylu uɛḍil.',
+'api-error-unclassified' => 'Yefkad anezri warisem.',
+'api-error-unknown-code' => 'Tuccḍa warisem : « $1 »',
+'api-error-unknown-warning' => 'Alɣu warisem : "$1".',
+'api-error-unknownerror' => 'Tuccḍa warisem : « $1 »',
 
 # Durations
 'duration-seconds' => '$1 {{PLURAL:$1|tasint|tisinin}}',
@@ -3058,4 +3486,10 @@ G leɛnaya-k sentem belli ṣaḥḥ tebɣiḍ ad tɛiwedeḍ axlaq n usebter-ag
 'duration-centuries' => '$1 {{PLURAL:$1|timiḍi|timiḍa}}',
 'duration-millennia' => '$1 {{PLURAL:$1|agimseggwas|agimseggwasen}}',
 
+# Limit report
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|tasint|tisinin}}',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|tasint|tisinin}}',
+
+# Unknown messages
+'uploadinvalidxml' => 'XML deg ufaylu yekteren ur d-yetwesleḍ ara.',
 );
index 179cb3f..a075be9 100644 (file)
@@ -55,17 +55,16 @@ $namespaceAliases = array(
 
 $messages = array(
 # User preference toggles
-'tog-underline' => 'Bınê girey de xete bıonce:',
-'tog-justify' => 'Paragrafu ayar ke',
+'tog-underline' => 'Bınê gırey de xete bonce:',
+'tog-justify' => 'Paragrafu eyar ke',
 'tog-hideminor' => 'Vurnayisunê senıku pela vurnayisunê peyênu de wedare',
 'tog-hidepatrolled' => 'Vurnayisunê qontrolkerdu pela vurnayisê peyêni de wedare',
 'tog-newpageshidepatrolled' => 'Pelunê qontrolkerdu lista pelunê newu de wedare',
-'tog-extendwatchlist' => 'Lista şêrkerdene hira bıke ke vurnayişi pêro bıasê, teyna tewr peyêni nê',
-'tog-usenewrc' => 'Pele be vurnayisunê grube de vurnayisê peyêni u lista şêrkerdişi (JavaScript lazımo)',
+'tog-extendwatchlist' => 'Lista şêrkerdene hira bıke ke vurnayişi pêro basê, teyna tewr peyêni nê',
+'tog-usenewrc' => 'Vurnayisê ke pela vurnayisunê peyênun u lista şêrkerdişi derê inu grube ke.',
 'tog-numberheadings' => 'Sernustu be ho numra cı sane',
 'tog-showtoolbar' => 'Gozagunê hacetunê vurnayişi bıasne (JavaScript lazımo)',
 'tog-editondblclick' => 'Pê dı rey teqnayene pele sero bıguriye (JavaScript lazımo)',
-'tog-editsection' => 'Vurnayena qısımi ebe gireyunê [bıvurne] ra feal ke',
 'tog-editsectiononrightclick' => 'Qısımu be teqnayena serrêze ra ebe gozaga raste bıvurne (JavaScript lazımo)',
 'tog-showtoc' => 'Tablowê tedeestewu bıasne (de pelunê be hirê sernustu ra jêdêri de)',
 'tog-rememberpassword' => 'Parola mı nê cıcêrawoği de bia ho viri (serba tewr jêde $1 {{PLURAL:$1|roze|rozu}}).',
@@ -83,7 +82,7 @@ $messages = array(
 'tog-shownumberswatching' => 'Amorê karberunê şêrkerdoğu bıasne',
 'tog-oldsig' => 'İmza mewcude:',
 'tog-fancysig' => 'İmza rê mamelê wikimeqaley bıke (bê girewo otomatik)',
-'tog-uselivepreview' => 'Verqayto cande bıgurene (JavaScript) (hona cerrebnayene dero)',
+'tog-uselivepreview' => 'Verqayto cınde bıgurene (cerrebane)',
 'tog-forceeditsummary' => 'Mı ke xulasa kerde cı vira, hay be mı ser de',
 'tog-watchlisthideown' => 'Vurnayisunê mı lista mına şêrkerdişi de wedare',
 'tog-watchlisthidebots' => 'Vurnayisunê boti lista mına şêrkerdişi de wedare',
@@ -280,7 +279,7 @@ $1',
 'pool-errorunknown' => 'Xeta nêzanıtiye',
 
 # 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).
-'aboutsite' => 'Heqdé {{SITENAME}}',
+'aboutsite' => 'Heqa {{SITENAME}} de',
 'aboutpage' => 'Project:Heqa',
 'copyright' => 'Zerrek bınê $1 dero.',
 'copyrightpage' => '{{ns:project}}:Telifheqiye',
@@ -762,7 +761,6 @@ Diqet kerê, beno ke tedeestê {{SITENAME}} uza endi rozane niyê.",
 'rows' => 'Rêji:',
 'columns' => 'Ustıni:',
 'searchresultshead' => 'Cıcêre',
-'resultsperpage' => 'Pelgê be vênıtun:',
 'stub-threshold' => 'Tertibê şêmıga <a href="#" class="stub">stub link</a> (\'\'bytes\'\'):',
 'recentchangesdays' => 'Rozê ke vurnaisunê peyênun de asenê:',
 'recentchangesdays-max' => 'Maksimum $1 {{PLURAL:$1|roze|roji}}',
index 12e7f5f..4252963 100644 (file)
@@ -371,7 +371,6 @@ $messages = array(
 'tog-numberheadings' => 'Мазмұн тақырыптарын автоматты нөмірлеу',
 'tog-showtoolbar' => 'Өңдеу құралдарын көрсету',
 'tog-editondblclick' => 'Қос шерту арқылы бетті өңдеу',
-'tog-editsection' => 'Бөлімдерді [өңдеу] сілтемесімен өңдеуін қос',
 'tog-editsectiononrightclick' => 'Бөлім тақырыбын оң нұқумен бөлім өңдеуін қосу',
 'tog-showtoc' => 'Мазмұнын көрсету (3-тен астам бөлімі болған жағдайда ғана)',
 'tog-rememberpassword' => 'Тіркелгімді осы браузерде ұмытпа (ең көбі $1 {{PLURAL:$1|күн|күн}})',
@@ -723,7 +722,7 @@ $1',
 'cannotdelete-title' => '«$1» бетін жою мүмкін емес',
 'delete-hook-aborted' => 'Түзету ілмек арқылы тоқтатылды.
 Қосымша түсіндірмелер көрсетілмеген.',
-'no-null-revision' => '"$1" Ð¼Ð°Ò\9bалаÑ\81Ñ\8b Ò¯Ñ\88Ñ\96н Ð¶Ð°Ò£Ð° Ð±Ð¾Ñ\81 Ò\9bаÑ\80ап Ñ\88Ñ\8bÒ\93Ñ\83дÑ\8b бастау мүмкін болмады.',
+'no-null-revision' => '"$1" Ð±ÐµÑ\82Ñ\96 Ò¯Ñ\88Ñ\96н Ð¶Ð°Ò£Ð° Ð±Ð¾Ñ\81 Ð½Ò±Ñ\81Ò\9bаÑ\81Ñ\8bн бастау мүмкін болмады.',
 'badtitle' => 'Жарамсыз тақырып аты',
 'badtitletext' => 'Сұралған бет тақырыбының аты жарамсыз, бос, тіларалық сілтемесі не уики-аралық тақырып аты бұрыс енгізілген.
 Мында тақырып атында қолдалмайтын бірқатар таңбалар болуы мүмкін.',
index 5e525d7..ab40ec5 100644 (file)
@@ -271,7 +271,6 @@ $messages = array(
 'tog-numberheadings' => 'ដាក់លេខ​ចំណងជើងរង​ដោយស្វ័យប្រវត្តិ',
 'tog-showtoolbar' => 'បង្ហាញ​របារឧបករណ៍កែប្រែ',
 'tog-editondblclick' => 'កែប្រែទំព័រដោយចុចពីរដង​ជាប់គ្នា',
-'tog-editsection' => 'អនុញ្ញាតអោយកែប្រែ​ផ្នែកណាមួយ​តាម​រយៈតំណភ្ជាប់ [កែប្រែ]',
 'tog-editsectiononrightclick' => 'អនុញ្ញាត​អោយកែប្រែ​​ផ្នែកណាមួយ ដោយ​ចុចកណ្តុរស្ដាំ​លើ​ចំណងជើង​របស់វា',
 'tog-showtoc' => 'បង្ហាញ​តារាងមាតិកា (សម្រាប់ទំព័រ​ដែលមាន​ចំណងជើងរង​លើសពី៣)',
 'tog-rememberpassword' => 'ចងចាំ​ការកត់ឈ្មោះចូលរបស់ខ្ញុំ​លើកុំព្យូទ័រនេះ (សំរាប់រយៈពេលយ៉ាងយូរ$1 {{PLURAL:$1|ថ្ងៃ|ថ្ងៃ}})',
@@ -852,7 +851,7 @@ $2',
 # Special:PasswordReset
 'passwordreset' => 'កំណត់​ពាក្យសម្ងាត់​សាឡើងវិញ',
 'passwordreset-text-one' => 'បំពេញសំណុំបែបបទនេះដើម្បីស្ដារពាក្យសម្ងាត់របស់អ្នក។',
-'passwordreset-text-many' => '{{PLURAL:$1|á\9e\9fá\9e¼á\9e\98á\9e\94á\9f\86á\9e\96á\9f\81á\9e\89á\9e\80á\9f\92á\9e\93á\9e»á\9e\84á\9e\94á\9f\92á\9e\9aá\9e¢á\9e\94á\9f\8bá\9e\98á\9e½á\9e\99á\9e\80á\9f\92á\9e\93á\9e»á\9e\84á\9e\85á\9f\86á\9e\8eá\9f\84á\9e\98á\9e\94á\9f\92á\9e\9aá\9e¢á\9e\94á\9f\8bá\9e\81á\9e¶á\9e\84á\9e\80á\9f\92á\9e\9aá\9f\84á\9e\98á\9e\8aá\9e¾á\9e\98á\9f\92á\9e\94á\9e¸á\9e\80á\9f\86á\9e\8eá\9e\8fá\9f\8bá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92á\9e\84á\9e¶á\9e\8fá\9f\8bá\9e\9aá\9e\94á\9e\9fá\9f\8bá\9e¢á\9f\92á\9e\93á\9e\80á\9e¡á\9e¾á\9e\84á\9e\9cá\9e·á\9e\89។}}',
+'passwordreset-text-many' => '{{PLURAL:$1|á\9e\9fá\9e¼á\9e\98á\9e\94á\9f\86á\9e\96á\9f\81á\9e\89á\9e\80á\9f\92á\9e\93á\9e»á\9e\84á\9e\94á\9f\92á\9e\9aá\9e¢á\9e\94á\9f\8bá\9e\98á\9e½á\9e\99á\9e\80á\9f\92á\9e\93á\9e»á\9e\84á\9e\85á\9f\86á\9e\8eá\9f\84á\9e\98á\9e\94á\9f\92á\9e\9aá\9e¢á\9e\94á\9f\8bá\9e\81á\9e¶á\9e\84á\9e\80á\9f\92á\9e\9aá\9f\84á\9e\98á\9e\8aá\9e¾á\9e\98á\9f\92á\9e\94á\9e¸á\9e\91á\9e\91á\9e½á\9e\9bá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92á\9e\84á\9e¶á\9e\8fá\9f\8bá\9e\94á\9e\8eá\9f\92á\9e\8aá\9f\84á\9f\87á\9e¢á\9e¶á\9e\9fá\9e\93á\9f\92á\9e\93á\9e\98á\9e½á\9e\99á\9e\8fá\9e¶á\9e\98á\9e\9aá\9e\99á\9f\88á\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9b។}}',
 'passwordreset-legend' => 'កំណត់​ពាក្យសម្ងាត់​សាឡើងវិញ',
 'passwordreset-disabled' => 'មុខងារប្ដូរទៅពាក្យសម្ងាត់ដើមត្រូវបានបិទមិនអោយប្រើនៅលើវិគីនេះ។',
 'passwordreset-emaildisabled' => 'មុខងារអ៊ីមែលត្រូវបានបិទមិនអោយប្រើនៅលើវិគីនេះ។',
@@ -1221,8 +1220,9 @@ $2
 'revdelete-selected' => "'''{{PLURAL:$2|កំណែប្រែ​ដែលបាន​ជ្រើសយក}}របស់​[[:$1]]:'''",
 'logdelete-selected' => "'''{{PLURAL:$1|ព្រឹត្តិការណ៍​កំណត់​ហេតុ​ដែលបាន​ជ្រើសយក}}:'''",
 'revdelete-suppress-text' => "ការ​ហាមឃាត់​គួរ​ត្រូវ​បាន​អនុវត្តិ​លើ​ករណី​ដូច​ខាង​ក្រោម​នេះ​ប៉ុណ្ណោះ​៖
-* ព័ត៌មាន​ផ្ទាល់​ខ្លួន​ ឯកជន​មិន​សមរម្យ​
-*: ''អាសយដ្ឋាននៃ​គេហដ្ឋាន​​ ​លេខ​ទូរស័ព្ទ និងលេខ​សន្តិសុខ​សង្គម​ជាដើម​''",
+* ព័ត៌មានបង្ខូចកេរ្ដិ៍ឈ្មោះធ្ងន់ធ្ងរ
+* ព័ត៌មាន​ផ្ទាល់​ខ្លួន​មិន​សមរម្យ​
+*: ''អាសយដ្ឋាននៃ​គេហដ្ឋាន​​ ​លេខ​ទូរស័ព្ទ និងលេខ​អត្តសញ្ញាណប័ណ្ឌជាដើម​''",
 'revdelete-legend' => 'ដាក់កំហិតគំហើញ',
 'revdelete-hide-text' => 'បិទបាំងអត្ថបទកំណែប្រែ',
 'revdelete-hide-image' => 'បិទបាំងខ្លឹមសារនៃឯកសារ',
@@ -1552,7 +1552,7 @@ $1",
 'right-reupload-own' => 'សរសេរលុបពីលើឯកសារមានស្រាប់ដែលត្រូវបានផ្ទុកឡើងដោយម្ចាស់ដើម',
 'right-reupload-shared' => 'សរសេរលុបពីលើឯកសារនៅក្នុងថតមេឌារួមរបស់វិគីនេះ',
 'right-upload_by_url' => 'ផ្ទុកឡើងឯកសារមួយពីអាសយដ្ឋាន URL មួយ',
-'right-autoconfirmed' => 'á\9e\80á\9f\82á\9e\94á\9f\92á\9e\9aá\9f\82á\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aá\9e\96á\9e¶á\9e\80á\9f\8bá\9e\80á\9e\8eá\9f\92á\9e\8aá\9e¶á\9e\9bá\9e\80á\9e¶á\9e\9aá\9e\96á\9e¶á\9e\9aá\9e\93á\9e¶á\9e\93á\9e',
+'right-autoconfirmed' => 'á\9e\98á\9e·á\9e\93á\9e\91á\9e\91á\9e½á\9e\9bá\9e\9aá\9e\84á\9e¥á\9e\91á\9f\92á\9e\92á\9e·á\9e\96á\9e\9bá\9e\96á\9e¸á\9e\80á\9e¶á\9e\9aá\9e\8aá\9e¶á\9e\80á\9f\8bá\9e\80á\9f\86á\9e á\9e·á\9e\8fá\9e\9bá\9f\92á\9e\94á\9e¿á\9e\93á\9e\8fá\9e¶á\9e\98IP',
 'right-bot' => 'ទុកជាដំណើរការស្វ័យប្រវត្តិមួយ',
 'right-nominornewtalk' => 'មិនបង្ហាញសាររំលឹក ពេលធ្វើកំនែតិចតួចនៅលើទំព័រពិភាក្សានានា',
 'right-writeapi' => 'ការប្រើប្រាស់ API សម្រាប់​សរសេរ',
@@ -1663,6 +1663,8 @@ $1",
 'recentchanges-label-minor' => 'នេះជាការកែប្រែតិចតួចមួយប៉ុណ្ណោះ',
 'recentchanges-label-bot' => 'ការកែប្រែនេះត្រូវបានធ្វើឡើងដោយរូបយន្ត',
 'recentchanges-label-unpatrolled' => 'ការកែប្រែនេះមិនទាន់ត្រូវបានល្បាតទេ',
+'recentchanges-label-plusminus' => 'ទំហំទំព័រត្រូវបានផ្លាស់ប្ដូរគិតជាចំនួនបៃ',
+'recentchanges-legend-heading' => "''កំណត់សម្គាល់៖'''",
 'recentchanges-legend-newpage' => '(មើលផងដែរនូវ [[Special:NewPages|បញ្ជីទំព័រថ្មី]])',
 'rcnotefrom' => "ខាងក្រោមនេះជាបន្លាស់ប្ដូរនានាគិតចាប់តាំងពី '''$2''' (បង្ហាញអតិបរមាចំនួន '''$1''')។",
 'rclistfrom' => 'បង្ហាញបន្លាស់ប្ដូរថ្មីៗចាប់តាំងពី $1',
@@ -1907,7 +1909,7 @@ $1',
 
 អ្នកគួរតែសាកល្បងនៅពេលដែលវិបសាយនេះមិនសូវរវល់។',
 
-'license' => 'á\9e¢á\9e¶á\9e\87á\9f\92á\9e\89á\9e¶á\9e\94á\9f\90á\9e\8eá\9f\92á\9e\8e',
+'license' => 'អាជ្ញាបណ្ណ',
 'license-header' => 'ការដាក់​អាជ្ញាប័ណ្ណ',
 'nolicense' => 'គ្មាន',
 'license-nopreview' => '(មិនទាន់មានការបង្ហាញការមើលជាមុនទេ)',
@@ -2342,7 +2344,7 @@ $PAGEINTRO $NEWPAGE
 អ៊ីមែល៖ $PAGEEDITOR_EMAIL
 វិគី៖ $PAGEEDITOR_WIKI
 
-នឹងមិនមាន​ការផ្ដល់ដំណឹង​ជាលាយលក្សណ៍អក្សរ​ផ្សេងទៀតពេលមានសកម្មភាពលើសពីនេះទេ លើកលែងតែ​អ្នកចូលមើល​ទំព័រនេះរួចសិន។ អ្នកក៏អាចកំណត់ឡើងវិញអំពីការផ្ដល់ដំណឹងសម្រាប់​ទំព័រដែលអ្នកកំពុងតាមដានផងដែរ។
\9e\93á\9e¹á\9e\84á\9e\98á\9e·á\9e\93á\9e\98á\9e¶á\9e\93â\80\8bá\9e\80á\9e¶á\9e\9aá\9e\95á\9f\92á\9e\8aá\9e\9bá\9f\8bá\9e\8aá\9f\86á\9e\8eá\9e¹á\9e\84â\80\8bá\9e\87á\9e¶á\9e\9bá\9e¶á\9e\99á\9e\9bá\9e\80á\9f\92á\9e\9fá\9e\8eá\9f\8dá\9e¢á\9e\80á\9f\92á\9e\9fá\9e\9aâ\80\8bá\9e\95á\9f\92á\9e\9fá\9f\81á\9e\84á\9e\91á\9f\80á\9e\8fá\9e\96á\9f\81á\9e\9bá\9e\98á\9e¶á\9e\93á\9e\9fá\9e\80á\9e\98á\9f\92á\9e\98á\9e\97á\9e¶á\9e\96á\9e\9bá\9e¾á\9e\9fá\9e\96á\9e¸á\9e\93á\9f\81á\9f\87á\9e\91á\9f\81 á\9e\9bá\9e¾á\9e\80á\9e\9bá\9f\82á\9e\84á\9e\8fá\9f\82â\80\8bá\9e¢á\9f\92á\9e\93á\9e\80á\9e\85á\9e¼á\9e\9bá\9e\98á\9e¾á\9e\9bâ\80\8bá\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aá\9e\93á\9f\81á\9f\87á\9e\8aá\9f\84á\9e\99á\9e\80á\9e\8fá\9f\8bá\9e\88á\9f\92á\9e\98á\9f\84á\9f\87á\9e\85á\9e¼á\9e\9bá\9e\9aá\9e½á\9e\85á\9e\9fá\9e·á\9e\93á\9f\94 á\9e¢á\9f\92á\9e\93á\9e\80á\9e\80á\9f\8fá\9e¢á\9e¶á\9e\85á\9e\80á\9f\86á\9e\8eá\9e\8fá\9f\8bá\9e¡á\9e¾á\9e\84á\9e\9cá\9e·á\9e\89á\9e¢á\9f\86á\9e\96á\9e¸á\9e\80á\9e¶á\9e\9aá\9e\95á\9f\92á\9e\8aá\9e\9bá\9f\8bá\9e\8aá\9f\86á\9e\8eá\9e¹á\9e\84á\9e\9fá\9e\98á\9f\92á\9e\9aá\9e¶á\9e\94á\9f\8bâ\80\8bá\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aá\9e\8aá\9f\82á\9e\9bá\9e¢á\9f\92á\9e\93á\9e\80á\9e\80á\9f\86á\9e\96á\9e»á\9e\84á\9e\8fá\9e¶á\9e\98á\9e\8aá\9e¶á\9e\93á\9e\95á\9e\84á\9e\8aá\9f\82á\9e\9aá\9f\94
 
 ពីប្រព័ន្ធផ្តល់ដំណឹង {{SITENAME}}
 
@@ -2387,10 +2389,12 @@ $UNWATCHURL
 'deletecomment' => 'មូលហេតុ៖',
 'deleteotherreason' => 'មូលហេតុបន្ថែមផ្សេងទៀត៖',
 'deletereasonotherlist' => 'មូលហេតុផ្សេងទៀត',
-'deletereason-dropdown' => '*ហេតុផលទូទៅ
-** សំណើរបស់អ្នកនិពន្ធ
+'deletereason-dropdown' => '* មូលហេតុលុបចោលទូទៅ
+** ស្ប៉ាម
+** អំពើបំផ្លាញទ្រព្យសម្បត្តិឯកជនឬសាធារណៈ
 ** បំពានកម្មសិទ្ធិបញ្ញា
-** អំពើបំផ្លាញទ្រព្យសម្បត្តិឯកជនឬសាធារណៈ',
+** សំណើរបស់អ្នកនិពន្ធ
+** ការបញ្ជូនបន្តដែលខូច',
 'delete-edit-reasonlist' => 'ពិនិត្យផ្ទៀងផ្ទាត់ហេតុផលនៃការលុប',
 'delete-toobig' => 'ទំព័រនេះមានប្រវត្តិកែប្រែធំលើសពី $1 {{PLURAL:$1|កំណែ|កំណែ}}។
 
@@ -2726,15 +2730,15 @@ $1',
 # Move page
 'move-page' => 'ប្តូរទីតាំង $1',
 'move-page-legend' => 'ប្តូរទីតាំងទំព័រ',
-'movepagetext' => "ការប្រើប្រាស់​ទម្រង់​ខាងក្រោម​នឹង​ប្តូរ​ឈ្មោះ​ទំព័រ ប្តូរទីតាំង​គ្រប់​ប្រវត្តិ​របស់​វា​ទៅ​ឈ្មោះថ្មី​
\9e\85á\9f\86á\9e\8eá\9e\84á\9e\87á\9e¾á\9e\84â\80\8bá\9e\85á\9e¶á\9e\9fá\9f\8bâ\80\8bá\9e\93á\9e¹á\9e\84â\80\8bá\9e\80á\9f\92á\9e\9bá\9e¶á\9e\99á\9e\87á\9e¶â\80\8bá\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aâ\80\8bá\9e\94á\9f\92á\9e\8fá\9e¼á\9e\9aá\9e\91á\9e·á\9e\9fទៅ​ចំណងជើងថ្មី​។
\9e\8fá\9f\86á\9e\8eá\9e\97á\9f\92á\9e\87á\9e¶á\9e\94á\9f\8bâ\80\8bá\9e\91á\9f\85â\80\8bá\9e\85á\9f\86á\9e\8eá\9e\84á\9e\87á\9e¾á\9e\84 á\9e\93á\9f\83â\80\8bá\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aá\9e\85á\9e¶á\9e\9fá\9f\8bâ\80\8bá\9e\93á\9e¹á\9e\84â\80\8bá\9e\98á\9e·á\9e\93â\80\8bá\9e\94á\9e¶á\9e\93â\80\8bá\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9câ\80\8bá\9e\95á\9f\92á\9e\9bá\9e¶á\9e\9fá\9f\8bá\9e\94á\9f\92á\9e\8fá\9e¼á\9e\9a; á\9e\9fá\9e¼á\9e\98â\80\8bá\9e\96á\9e·á\9e\93á\9e·á\9e\8fá\9f\92á\9e\99á\9e\98á\9e¾á\9e\9b á\9e\80á\9e¶á\9e\9aá\9e\94á\9f\92á\9e\8fá\9e¼á\9e\9aá\9e\91á\9e·á\9e\9f á\9e\98á\9e·á\9e\93á\9e\94á\9e¶á\9e\93á\9e\94á\9e\84á\9f\92á\9e\80á\9e¾á\9e\8f á\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aá\9e\94á\9f\92á\9e\8fá\9e¼á\9e\9aá\9e\91á\9e·á\9e\9fá\9e\91á\9f\92á\9e\9cá\9f\81 á\9e¬ á\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aá\9e\94á\9f\92á\9e\8fá\9e¼á\9e\9aá\9e\91á\9e·á\9e\9fá\9e\94á\9e¶á\9e\80á\9f\8b á\9f\94
\9e¢á\9f\92á\9e\93á\9e\80á\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9cá\9e\8fá\9f\82á\9e\92á\9e¶á\9e\93á\9e¶á\9e\94á\9f\92á\9e\9aá\9e¶á\9e\80á\9e\8a á\9e\90á\9e¶â\80\8bá\9e\8fá\9f\86á\9e\8eá\9e\97á\9f\92á\9e\87á\9e¶á\9e\94á\9f\8bá\9e\91á\9e¶á\9f\86á\9e\84á\9e\93á\9f\84á\9f\87 á\9e\94á\9e\93á\9f\92á\9e\8fá\9e\9fá\9f\86á\9e\8aá\9f\85â\80\8bá\9e\91á\9f\85â\80\8bá\9e\82á\9f\84á\9e\9bá\9e\8aá\9f\85á\9e\94á\9e¶á\9e\93á\9e\9fá\9e\93á\9f\92á\9e\98á\9e\8f​។
+'movepagetext' => "ការប្រើប្រាស់សំណុំបែបបទខាងក្រោម​នឹង​ប្តូរ​ឈ្មោះ​ទំព័រ និងប្តូរទីតាំង​ប្រវត្តិទាំងអស់​របស់​វា​ទៅ​ឈ្មោះថ្មី​នោះ
\9e\85á\9f\86á\9e\8eá\9e\84á\9e\87á\9e¾á\9e\84â\80\8bá\9e\85á\9e¶á\9e\9fá\9f\8bâ\80\8bá\9e\93á\9e¹á\9e\84â\80\8bá\9e\80á\9f\92á\9e\9bá\9e¶á\9e\99á\9e\87á\9e¶â\80\8bá\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aâ\80\8bá\9e\94á\9e\89á\9f\92á\9e\87á\9e¼á\9e\93á\9e\94á\9e\93á\9f\92á\9e\8fទៅ​ចំណងជើងថ្មី​។
\9e¢á\9f\92á\9e\93á\9e\80á\9e¢á\9e¶á\9e\85á\9e\94á\9e\93á\9f\92á\9e\91á\9e¶á\9e\93á\9f\8bá\9e\9fá\9e\98á\9f\90á\9e\99á\9e\80á\9e¶á\9e\9aá\9e\94á\9e\89á\9f\92á\9e\87á\9e¼á\9e\93á\9e\94á\9e\93á\9f\92á\9e\8fá\9e\8aá\9f\82á\9e\9bá\9e\9fá\9f\86á\9e\8aá\9f\85á\9e\91á\9f\85á\9e\9aá\9e\80á\9e\85á\9f\86á\9e\8eá\9e\84á\9e\87á\9e¾á\9e\84á\9e\85á\9e¶á\9e\9fá\9f\8bá\9e\8aá\9f\84á\9e\99á\9e\9fá\9f\92á\9e\9cá\9f\90á\9e\99á\9e\94á\9f\92á\9e\9aá\9e\9cá\9e\8fá\9f\92á\9e\8fá\9e·á\9f\94 á\9e\94á\9e¾á\9e\9fá\9e·á\9e\93á\9e\87á\9e¶á\9e¢á\9f\92á\9e\93á\9e\80á\9e\87á\9f\92á\9e\9aá\9e¾á\9e\9fá\9e\9aá\9e¾á\9e\9fá\9e\98á\9e·á\9e\93á\9e\92á\9f\92á\9e\9cá\9e¾á\9e\94á\9f\82á\9e\94á\9e\93á\9f\81á\9f\87 á\9e\9fá\9e¼á\9e\98á\9e\80á\9e»á\9f\86á\9e\97á\9f\92á\9e\9bá\9f\81á\9e\85á\9e\96á\9e·á\9e\93á\9e·á\9e\8fá\9f\92á\9e\99 [[Special:DoubleRedirects|á\9e\80á\9e¶á\9e\9aá\9e\94á\9e\89á\9f\92á\9e\87á\9e¼á\9e\93á\9e\94á\9e\93á\9f\92á\9e\8fá\9e\91á\9f\92á\9e\9cá\9f\81á\9e\8aá\9e\84]] á\9e\93á\9e·á\9e\84[[Special:BrokenRedirects|á\9e\80á\9e¶á\9e\9aá\9e\94á\9e\89á\9f\92á\9e\87á\9e¼á\9e\93á\9e\94á\9e\93á\9f\92á\9e\8fá\9e\8aá\9f\82á\9e\9bá\9e\8aá\9e¶á\9e\85á\9f\8b]]á\9f\94 
\9e¢á\9f\92á\9e\93á\9e\80á\9e\98á\9e¶á\9e\93á\9e\97á\9e¶á\9e\9aá\9f\88á\9e\92á\9f\92á\9e\9cá\9e¾á\9e¢á\9f\84á\9e\99á\9e\94á\9f\92á\9e\9aá\9e¶á\9e\80á\9e\8aá\9e\90á\9e¶á\9e\8fá\9f\86á\9e\8eá\9e\97á\9f\92á\9e\87á\9e¶á\9e\94á\9f\8bá\9e\91á\9e¶á\9f\86á\9e\84á\9e\93á\9f\84á\9f\87á\9e\93á\9f\85á\9e\8fá\9f\82á\9e\94á\9e\93á\9f\92á\9e\8fá\9e\9fá\9f\86á\9e\8aá\9f\85â\80\8bá\9e\91á\9f\85â\80\8bá\9e\80á\9e¶á\9e\93á\9f\8bá\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aá\9e\82á\9f\84á\9e\9bá\9e\8aá\9f\85á\9e\8fá\9f\92á\9e\9aá\9e¹á\9e\98á\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9c​។
 
-ទំព័រចាស់ នឹង'''មិន'''ត្រូវ បានប្តូរទីតាំង កាលបើ​មានទំព័រ​ក្នុងចំណងជើងថ្មី​។ បើគ្មានទំព័រ​ក្នុងចំណងជើងថ្មី, ទំព័ចាស់​នឹង​ទទេ ឬ ជា​ទំព័រប្តូរទិស និង​គ្មានប្រវត្តិកំណែប្រែ​។ វាមានន័យថា អ្នកអាចប្តូរឈ្មោះទំព័រ​ទៅទីតាំងដើម ករណី​អ្នកបានធ្វើកំហុស, និង ដែលអ្នកមិនអាច សរសេរជាន់ពីលើ ទំព័រមានស្រាប់​។
+ទំព័រចាស់នឹង'''មិន'''ត្រូវ បានប្តូរទីតាំង កាលបើ​មានទំព័រ​ក្នុងចំណងជើងថ្មី​រួចហើយ លើកលែងតែក្នុងករណីទំព័រ​ក្នុងចំណងជើងថ្មីជា​ទំព័របញ្ជូនបន្តហើយ​គ្មានប្រវត្តិកែប្រែពីមុន។ វាមានន័យថា អ្នកអាចប្តូរឈ្មោះទំព័រ​ទៅទីតាំងដើម ករណី​អ្នកបានធ្វើខុសដោយអចេនតនា ហើយអ្នកមិនអាចសរសេរជាន់ពីលើ ទំព័រមានស្រាប់​។
 
 '''ប្រយ័ត្ន!'''
-វាអាចជា បំលាស់ប្តូរដល់ឫសគល់ និង​មិននឹកស្មានជាមុន ចំពោះ​ទំព័រប្រជាប្រិយ​។ អ្នកត្រូវតែ​ដឹងប្រាកដ​អំពី​ផលវិបាកទាំងអស់ មុននឹង​បន្តទង្វើនេះ​។",
+វាអាចជាបន្លស់ប្តូរដល់ឫសគល់និង​មិននឹកស្មានជាមុន សម្រាប់​ទំព័រប្រជាប្រិយ​។ អ្នកត្រូវតែ​ដឹងប្រាកដ​អំពី​ផលវិបាកទាំងអស់ មុននឹង​បន្តទង្វើនេះ​។",
 'movepagetalktext' => "ទំព័រសហពិភាក្សាបើមាន នឹងត្រូវបានប្តូរទៅឈ្មោះ​ថ្មី​ជាមួយគ្នា​ដោយ​ស្វ័យប្រវត្តិ '''លើកលែងតែ៖'''
 *ទំព័រពិភាក្សាមិនទទេនិងមានរួចរាល់ក្រោមឈ្មោះថ្មី ឬ
 *អ្នក​ដោះប្រអប់ធីក​ខាងក្រោម។
@@ -3243,8 +3247,8 @@ $1',
 'exif-copyrightowner' => 'ម្ចាស់កម្មសិទ្ធិបញ្ញា',
 'exif-usageterms' => 'លក្ខខណ្ឌប្រើប្រាស់',
 'exif-webstatement' => 'សេចក្ដីប្រកាសកម្មសិទ្ធបញ្ញាលើអ៊ីនធើណិត',
-'exif-licenseurl' => 'URL á\9e\9fá\9f\86á\9e\9aá\9e¶á\9e\94á\9f\8bá\9e¢á\9e¶á\9e\87á\9f\92á\9e\89á\9e¶á\9e\94á\9e\8eá\9f\92á\9e\8cá\9e\80á\9e\98á\9f\92á\9e\98á\9e\9fá\9e·á\9e\91á\9f\92á\9e\92បញ្ញា',
-'exif-morepermissionsurl' => 'ព័ត៌មានអាជ្ញាបណ្ឌជំនួស',
+'exif-licenseurl' => 'URL á\9e\9fá\9e\98á\9f\92á\9e\9aá\9e¶á\9e\94á\9f\8bâ\80\8bá\9e¢á\9e¶á\9e\87á\9f\92á\9e\89á\9e¶á\9e\94á\9e\8eá\9f\92á\9e\8eâ\80\8bá\9e\80á\9e\98á\9f\92á\9e\98á\9e\9fá\9e·á\9e\91á\9f\92á\9e\92á\9e·â\80\8bបញ្ញា',
+'exif-morepermissionsurl' => 'ព័ត៌មាន​អាជ្ញាបណ្ណ​ជំនួស',
 'exif-attributionurl' => 'នៅពេលកែច្នៃស្នាដៃនេះយកទៅប្រើ សូមដាក់តំណភ្ជាប់ទៅ',
 'exif-preferredattributionname' => 'នៅពេលកែច្នៃស្នាដៃនេះយកទៅប្រើ សូមថ្លែងអំណរគុណដល់ម្ចាស់ដើម',
 'exif-pngfilecomment' => 'វិចារលើឯកសារ PNG',
@@ -3460,7 +3464,7 @@ $5
 'confirmemail_body_set' => 'នរណាម្នាក់ ប្រហែលជាខ្លួនអ្នកផ្ទាល់ មកពីអាស័យដ្ឋានIP $1,
 បានដាក់ភ្ជាប់អាស័យដ្ឋានអ៊ីមែលរបស់គណនី "$2" ជាមួយនឹងអាស័យដ្ឋានអ៊ីមែលនេះនៅលើ{{SITENAME}}។
 
\9e\8aá\9e¾á\9e\98á\9f\92á\9e\94á\9e¸á\9e\94á\9e\89á\9f\92á\9e\87á\9e¶á\9e\80á\9f\8bá\9e\90á\9e¶á\9e\93á\9f\81á\9f\87á\9e\96á\9e·á\9e\8fá\9e\87á\9e¶á\9e\82á\9e\8eá\9e\93á\9e¸á\9e\95á\9f\92á\9e\91á\9e¶á\9e\9bá\9f\8bá\9e\9aá\9e\94á\9e\9fá\9f\8bá\9e¢á\9f\92á\9e\93á\9e\80á\9e\98á\9f\82á\9e\93 á\9e\93á\9e·á\9e\84á\9e\8aá\9f\86á\9e\8eá\9e¾á\9e\9aá\9e\80á\9e¶á\9e\9aá\9e\98á\9e»á\9e\81á\9e\84á\9e¶á\9e\9aá\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bá\9e\80á\9f\92á\9e\93á\9e»á\9e\84{{SITENAME}}á\9e¡á\9e¾á\9e\84á\9e\9cá\9e·á\9e\89
\9e\8aá\9e¾á\9e\98á\9f\92á\9e\94á\9e¸á\9e\94á\9e\89á\9f\92á\9e\87á\9e¶á\9e\80á\9f\8bá\9e\90á\9e¶á\9e\93á\9f\81á\9f\87á\9e\96á\9e·á\9e\8fá\9e\87á\9e¶á\9e\82á\9e\8eá\9e\93á\9e¸á\9e\95á\9f\92á\9e\91á\9e¶á\9e\9bá\9f\8bá\9e\9aá\9e\94á\9e\9fá\9f\8bá\9e¢á\9f\92á\9e\93á\9e\80á\9e\98á\9f\82á\9e\93 á\9e\93á\9e·á\9e\84á\9e\94á\9e¾á\9e\80á\9e\8aá\9f\86á\9e\8eá\9e¾á\9e\9aá\9e\80á\9e¶á\9e\9aá\9e\98á\9e»á\9e\81á\9e\84á\9e¶á\9e\9aá\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bá\9e\80á\9f\92á\9e\93á\9e»á\9e\84{{SITENAME}}
 សូមបើកតំណភ្ជាប់ខាងក្រោមនេះក្នុងកម្មវិធីរាយរកអ៊ីនធើណិតរបស់អ្នក៖
 
 $3
@@ -3591,7 +3595,7 @@ $5
 'version-hook-name' => 'ឈ្មោះ​ Hook',
 'version-hook-subscribedby' => 'បានជាវ ជាប្រចាំ ដោយ',
 'version-version' => '(កំណែ $1)',
-'version-license' => 'អាជ្ញាបណ្ណ មេឌាវិគី',
+'version-license' => 'អាជ្ញាបណ្ណមេឌាវិគី',
 'version-ext-license' => 'អាជ្ញាបណ្ណ',
 'version-ext-colheader-version' => 'កំណែ',
 'version-ext-colheader-license' => 'អាជ្ញាបណ្ណ',
@@ -3627,8 +3631,7 @@ $5
 # Special:SpecialPages
 'specialpages' => 'ទំព័រ​ពិសេស​ៗ',
 'specialpages-note' => '* ទំព័រពិសេសៗធម្មតា។
-* <span class="mw-specialpagerestricted">ទំព័រពិសេសៗដែលមានការដាក់កំហិត។</span>
-* <span class="mw-specialpagecached">ទំព័រពិសេសៗសំរាប់រក្សាទុក។</span>',
+* <span class="mw-specialpagerestricted">ទំព័រពិសេសៗដែលមានការដាក់កំហិត។</span>',
 'specialpages-group-maintenance' => 'របាយការណ៍នានាអំពីតំហែទាំ',
 'specialpages-group-other' => 'ទំព័រពិសេសៗផ្សេងៗទៀត',
 'specialpages-group-login' => 'កត់ឈ្មោះចូល / បង្កើតគណនី',
index 3592d68..1665711 100644 (file)
@@ -31,6 +31,7 @@
  * @author Klutzy
  * @author Kwj2772
  * @author LFM
+ * @author Leehoy
  * @author Mintz0223
  * @author Pi.C.Noizecehx
  * @author Priviet
@@ -368,26 +369,25 @@ $messages = array(
 'tog-hidepatrolled' => '최근 바뀜에서 검토한 편집을 숨기기',
 'tog-newpageshidepatrolled' => '새 문서 목록에서 검토한 문서를 숨기기',
 'tog-extendwatchlist' => '주시문서 목록에서 가장 최근의 편집만이 아닌 모든 편집을 보기',
-'tog-usenewrc' => 'ìµ\9cê·¼ ë°\94ë\80\9cê³¼ ì£¼ì\8b\9c문ì\84\9c ëª©ë¡\9dì\97\90ì\84\9c 문서별 그룹 바뀜',
-'tog-numberheadings' => '머릿글 번호 매기기',
+'tog-usenewrc' => 'ìµ\9cê·¼ ë°\94ë\80\9cê³¼ ì£¼ì\8b\9c문ì\84\9c ëª©ë¡\9dì\9d\98 문서별 그룹 바뀜',
+'tog-numberheadings' => '자동으로 머릿글 번호 매기기',
 'tog-showtoolbar' => '편집에 툴바 보이기',
 'tog-editondblclick' => '더블 클릭으로 문서 편집하기',
-'tog-editsection' => '[편집] 링크로 부분 편집하기',
 'tog-editsectiononrightclick' => '제목을 오른쪽 클릭해서 문단 편집하기 활성화',
-'tog-showtoc' => '문서의 차례 보여주기 (머릿글이 4개 이상인 경우)',
-'tog-rememberpassword' => '이 브라우저에서 로그인 상태를 저장하기 (최대 $1{{PLURAL:$1|일}})',
+'tog-showtoc' => '문서의 목차 보여주기 (머릿글이 4개 이상인 경우)',
+'tog-rememberpassword' => '이 브라우저에 로그인 상태를 저장하기(최대 $1{{PLURAL:$1|일}})',
 'tog-watchcreations' => '내가 만드는 문서와 내가 올린 파일을 주시문서 목록에 추가',
 'tog-watchdefault' => '내가 편집하는 문서와 파일을 주시문서 목록에 추가',
 'tog-watchmoves' => '내가 이동하는 문서와 파일을 주시문서 목록에 추가',
 'tog-watchdeletion' => '내가 삭제하는 문서와 파일을 주시문서 목록에 추가',
-'tog-minordefault' => '사소한 편집을 기본적으로 선택하기',
-'tog-previewontop' => '편집 상자 앞에 미리 보기 보기',
-'tog-previewonfirst' => '처음 편집할 때 미리 보기 보기',
+'tog-minordefault' => '모든 편집에 기본적으로 사소한 편집을 표시',
+'tog-previewontop' => '편집 상자 앞에 미리 보기 보기',
+'tog-previewonfirst' => '처음 편집할 때 미리 보기 보기',
 'tog-enotifwatchlistpages' => '주시문서 목록에 속한 문서나 파일이 바뀌면 이메일로 알림',
 'tog-enotifusertalkpages' => '내 토론 문서가 바뀌면 이메일로 알림',
 'tog-enotifminoredits' => '문서나 파일의 사소한 편집도 이메일로 알림',
 'tog-enotifrevealaddr' => '알림 메일에 내 이메일 주소를 밝히기',
-'tog-shownumberswatching' => '주시 ì\82¬ì\9a©ì\9e\90 ì\88\98 ë³´ê¸°',
+'tog-shownumberswatching' => '주시í\95\98ë\8a\94 ì\82¬ì\9a©ì\9e\90 ì\88\98 ë³´ì\9d´ê¸°',
 'tog-oldsig' => '현재 서명:',
 'tog-fancysig' => '서명을 위키텍스트로 취급 (자동으로 링크를 걸지 않음)',
 'tog-uselivepreview' => '실시간 미리 보기 사용하기 (실험 기능)',
@@ -400,22 +400,22 @@ $messages = array(
 'tog-watchlisthidepatrolled' => '주시문서 목록에서 검토한 편집을 숨기기',
 'tog-ccmeonemails' => '이메일을 보낼 때 내 이메일로 복사본을 보내기',
 'tog-diffonly' => '편집 차이를 비교할 때 문서 내용을 보지 않기',
-'tog-showhiddencats' => '숨은 분류 보기',
+'tog-showhiddencats' => '숨은 분류 보기',
 'tog-noconvertlink' => '링크 제목 변환을 비활성화',
-'tog-norollbackdiff' => 'ë\90\98ë\8f\8c리기 í\9b\84 ì°¨ì\9d´ë¥¼ ë³´ì\9d´ì§\80 ì\95\8a기',
+'tog-norollbackdiff' => '되돌리기 후 차이를 보지 않기',
 'tog-useeditwarning' => '바꾼 내용을 저장하지 않고 편집 페이지를 벗어날 때 알림',
 'tog-prefershttps' => '로그인할 때 항상 보안 연결 사용',
 
 'underline-always' => '항상',
-'underline-never' => '치지 않음',
-'underline-default' => '스킨 또는 브라우저 설정을 따르기',
+'underline-never' => '항상 치지 않기',
+'underline-default' => '스킨 또는 브라우저 기본 값을 따르기',
 
 # Font style option in Special:Preferences
-'editfont-style' => '편집창의 글꼴:',
-'editfont-default' => '브라우저 설정을 따르기',
+'editfont-style' => '편집 창의 글꼴:',
+'editfont-default' => '브라우저 기본 값을 따르기',
 'editfont-monospace' => '고정폭 글꼴',
-'editfont-sansserif' => '산세리프ì²´',
-'editfont-serif' => '세리프ì²´',
+'editfont-sansserif' => '산세리프 ê¸\80ê¼´',
+'editfont-serif' => '세리프 ê¸\80ê¼´',
 
 # Dates
 'sunday' => '일요일',
@@ -498,7 +498,7 @@ $messages = array(
 'listingcontinuesabbrev' => '(계속)',
 'index-category' => '색인된 문서',
 'noindex-category' => '색인에서 제외되는 문서',
-'broken-file-category' => '잘못된 파일 링크가 포함된 문서',
+'broken-file-category' => '깨진 파일 링크가 포함된 문서',
 
 'about' => '소개',
 'article' => '본문',
@@ -508,7 +508,7 @@ $messages = array(
 'morenotlisted' => '이 목록은 완성되지 않았습니다.',
 'mypage' => '문서',
 'mytalk' => '토론',
-'anontalk' => '익명 사용자 토론',
+'anontalk' => '익명 사용자 토론',
 'navigation' => '둘러보기',
 'and' => ',',
 
@@ -561,8 +561,8 @@ $messages = array(
 'delete' => '삭제',
 'deletethispage' => '이 문서 삭제하기',
 'undeletethispage' => '이 문서를 되살리기',
-'undelete_short' => '{{PLURAL:$1|편집 $1개}} 되살리기',
-'viewdeleted_short' => '{{PLURAL:$1|삭제된 편집 $1개}} 보기',
+'undelete_short' => '{{PLURAL:$1|편집}} $1개 되살리기',
+'viewdeleted_short' => '{{PLURAL:$1|삭제된 편집}} $1개 보기',
 'protect' => '보호',
 'protect_change' => '보호 수준 바꾸기',
 'protectthispage' => '이 문서 보호하기',
@@ -595,13 +595,13 @@ $messages = array(
 'jumpto' => '이동:',
 'jumptonavigation' => '둘러보기',
 'jumptosearch' => '검색',
-'view-pool-error' => '서버가 과부하에 걸렸습니다.
+'view-pool-error' => '현재 서버에 과부하가 걸렸습니다.
 너무 많은 사용자가 이 문서를 보려고 하고 있습니다.
 이 문서를 다시 열기 전에 잠시만 기다려주세요.
 
 $1',
 'pool-timeout' => '잠금 대기 중 타임아웃',
-'pool-queuefull' => '풀 큐가 가득 찼습니다',
+'pool-queuefull' => '풀 대기열이 가득 찼습니다',
 'pool-errorunknown' => '알 수 없는 오류',
 
 # 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).
@@ -624,8 +624,8 @@ $1',
 'privacypage' => 'Project:개인 정보 정책',
 
 'badaccess' => '권한 오류',
-'badaccess-group0' => 'ì\9a\94ì²­í\95\9c ë\8f\99ì\9e\91을 실행할 권한이 없습니다.',
-'badaccess-groups' => 'ì\9a\94ì²­í\95\9c ë\8f\99ì\9e\91은 {{PLURAL:$2|다음|다음 중 하나의}} 권한을 가진 사용자에게만 가능합니다: $1',
+'badaccess-group0' => 'ì\9a\94ì²­í\95\9c ëª\85ë ¹을 실행할 권한이 없습니다.',
+'badaccess-groups' => 'ì\9a\94ì²­í\95\9c ëª\85ë ¹은 {{PLURAL:$2|다음|다음 중 하나의}} 권한을 가진 사용자에게만 가능합니다: $1',
 
 'versionrequired' => '미디어위키 $1 버전 필요',
 'versionrequiredtext' => '이 문서를 사용하려면 $1 버전 미디어위키가 필요합니다.
@@ -633,9 +633,9 @@ $1',
 
 'ok' => '확인',
 'retrievedfrom' => '원본 주소 "$1"',
-'youhavenewmessages' => '다른 사용자가 남긴 $1가 있습니다. ($2)',
-'youhavenewmessagesfromusers' => '{{PLURAL:$3|다른 사용자가|사용자 $3명이}} 남긴 $1가 있습니다. ($2)',
-'youhavenewmessagesmanyusers' => '여러 사용자가 남긴 $1가 있습니다. ($2)',
+'youhavenewmessages' => '다른 사용자가 $1를 {{PLURAL:$3|남겼습니다}}. ($2)',
+'youhavenewmessagesfromusers' => '{{PLURAL:$3|다른 사용자가|사용자 $3명이}} $1를 {{PLURAL:$4|남겼습니다}}. ($2)',
+'youhavenewmessagesmanyusers' => '여러 사용자가 $1를 남겼습니다. ($2)',
 'newmessageslinkplural' => '{{PLURAL:$1|새 메시지}}',
 'newmessagesdifflinkplural' => '마지막으로 {{PLURAL:$1|바뀐 내용}}',
 'youhavenewmessagesmulti' => '다른 사용자가 $1에 남긴 새 메시지가 있습니다',
@@ -652,10 +652,10 @@ $1',
 'collapsible-expand' => '펼치기',
 'thisisdeleted' => '$1 문서를 보거나 되살리겠습니까?',
 'viewdeleted' => '$1 문서를 보겠습니까?',
-'restorelink' => '{{PLURAL:$1|삭제된 편집 $1개}}',
+'restorelink' => '{{PLURAL:$1|삭제된 편집}} $1개',
 'feedlinks' => '피드:',
 'feed-invalid' => '잘못된 구독 피드 방식입니다.',
-'feed-unavailable' => 'í\94¼ë\93\9c ì\84\9cë¹\84ì\8a¤ë\8a\94 ì \9cê³µí\95\98ì§\80 ì\95\8a습니다',
+'feed-unavailable' => 'í\94¼ë\93\9c ì\84\9cë¹\84ì\8a¤ë¥¼ ì\82¬ì\9a©í\95  ì\88\98 ì\97\86습니다',
 'site-rss-feed' => '$1 RSS 피드',
 'site-atom-feed' => '$1 Atom 피드',
 'page-rss-feed' => '"$1" RSS 피드',
@@ -677,8 +677,8 @@ $1',
 'nstab-category' => '분류',
 
 # Main script and global functions
-'nosuchaction' => 'í\95´ë\8b¹í\95\98ë\8a\94 ë\8f\99ì\9e\91이 없습니다.',
-'nosuchactiontext' => 'URL로 요청한 동작이 잘못되었습니다.
+'nosuchaction' => 'í\95´ë\8b¹í\95\98ë\8a\94 ëª\85ë ¹이 없습니다.',
+'nosuchactiontext' => 'URL이 지정한 명령이 잘못되었습니다.
 URL을 잘못 입력하였거나, 잘못된 링크를 따라갔을 수 있습니다.
 {{SITENAME}}의 버그일 수도 있습니다.',
 'nosuchspecialpage' => '해당하는 특수 문서가 없습니다.',
@@ -690,12 +690,12 @@ URL을 잘못 입력하였거나, 잘못된 링크를 따라갔을 수 있습니
 'error' => '오류',
 'databaseerror' => '데이터베이스 오류',
 'databaseerror-text' => '데이터베이스 쿼리에 오류가 발생했습니다.
\86\8cí\94\84í\8a¸ì\9b¨ì\96´ì\9d\98 버그가 있을 수 있습니다.',
\86\8cí\94\84í\8a¸ì\9b¨ì\96´ì\97\90 버그가 있을 수 있습니다.',
 'databaseerror-textcl' => '데이터베이스 쿼리에 오류가 발생했습니다.',
 'databaseerror-query' => '쿼리: $1',
 'databaseerror-function' => '함수: $1',
 'databaseerror-error' => '오류: $1',
-'laggedslavemode' => "'''경고:''' ë¬¸ì\84\9cê°\80 ìµ\9cê·¼ì\97\90 ë°\94ë\80\90 ë\82´ì\9a©ì\9d´ ì\95\84ë\8b\90 수도 있습니다.",
+'laggedslavemode' => "'''경고:''' ë¬¸ì\84\9cê°\80 ìµ\9cê·¼ì\97\90 ë°\94ë\80\90 ë\82´ì\9a©ì\9d\84 í\8f¬í\95¨í\95\98ì§\80 ì\95\8aì\9d\84 수도 있습니다.",
 'readonly' => '데이터베이스 잠김',
 'enterlockreason' => '데이터베이스를 잠그는 이유와 예상되는 기간을 적어 주세요.',
 'readonlytext' => '데이터베이스가 잠겨 있어서 문서를 편집할 수 없습니다. 데이터베이스 관리가 끝난 후에는 정상으로 돌아올 것입니다.
@@ -712,36 +712,36 @@ URL을 잘못 입력하였거나, 잘못된 링크를 따라갔을 수 있습니
 'readonly_lag' => '슬레이브 데이터베이스가 마스터 서버의 자료를 새로 고치는 중입니다. 데이터베이스가 자동으로 잠겨 있습니다.',
 'internalerror' => '내부 오류',
 'internalerror_info' => '내부 오류: $1',
-'fileappenderrorread' => 'ë\82´ì\9a©ì\9d\84 ë\8d§ë¶\99ì\9d´ë\8b¤ê°\80 "$1" í\8c\8cì\9d¼ì\9d\84 ì\9d½ì\9d\84 ì\88\98 ì\97\86습니다.',
+'fileappenderrorread' => 'ë\82´ì\9a©ì\9d\84 ë\8d§ë¶\99ì\9d´ë\8a\94 ë\8f\84ì¤\91 "$1" í\8c\8cì\9d¼ì\9d\84 ì\9d½ì\9d\84 ì\88\98 ì\97\86ì\97\88습니다.',
 'fileappenderror' => '"$1" 파일을 "$2"에 덧붙일 수 없습니다.',
 'filecopyerror' => '"$1" 파일을 "$2"로 복사할 수 없습니다.',
 'filerenameerror' => '"$1" 파일을 "$2"로 옮길 수 없습니다.',
 'filedeleteerror' => '"$1" 파일을 삭제할 수 없습니다.',
 'directorycreateerror' => '"$1" 디렉터리를 만들 수 없습니다.',
 'filenotfound' => '"$1" 파일을 찾을 수 없습니다.',
-'fileexistserror' => '"$1" 파일이 이미 있어 여기에 쓸 수 없습니다.',
-'unexpected' => '예상되지 않은 값: "$1"="$2"',
+'fileexistserror' => '"$1" 파일이 이미 있어 쓸 수 없습니다.',
+'unexpected' => '예기치 못한 값: "$1"="$2"',
 'formerror' => '오류: 양식을 제출할 수 없습니다.',
-'badarticleerror' => '지금의 명령은 이 문서에서는 실행할 수 없습니다.',
+'badarticleerror' => '해당 명령은 이 문서에서 실행할 수 없습니다.',
 'cannotdelete' => '"$1" 문서나 파일을 삭제할 수 없습니다.
 이미 삭제되었을 수도 있습니다.',
 'cannotdelete-title' => '"$1" 문서를 삭제할 수 없습니다.',
-'delete-hook-aborted' => 'í\9b\85ì\97\90 ì\9d\98í\95´ ì\82­ì \9cê°\80 ì¤\91ë\8b¨ë\90\98ì\97\88ì\8aµë\8b\88ë\8b¤.
+'delete-hook-aborted' => 'í\9b\85ì\9d´ ì\82­ì \9c를 ì¤\91ë\8b¨í\96\88ì\8aµë\8b\88ë\8b¤.
 아무런 설명도 주어지지 않았습니다.',
 'no-null-revision' => '"$1" 문서에 대한 새 빈 판을 만들 수 없습니다',
 'badtitle' => '잘못된 제목',
 'badtitletext' => '요청한 문서 제목이 잘못되었거나, 비어있거나, 잘못된 인터위키 제목으로 링크했습니다.
 문서 제목에 사용할 수 없는 문자를 사용했을 수 있습니다.',
-'perfcached' => '다음 자료는 캐시된 것이므로 현재 상황을 반영하지 않을 수 있습니다. 캐시에 최대 {{PLURAL:$1|결과 $1개}}가 있습니다.',
+'perfcached' => '다음 자료는 캐시된 것이므로 새로 바뀐 내용을 반영하지 못할 수도 있습니다. 캐시에 최대 {{PLURAL:$1|$1개의 결과}}가 있습니다.',
 'perfcachedts' => '다음 자료는 캐시된 것으로, $1에 마지막으로 새로 고쳐졌습니다.  캐시에 최대 {{PLURAL:$4|결과 $4개}}가 있습니다.',
 'querypage-no-updates' => '이 문서의 새로 고침이 현재 비활성화되어 있습니다.
\9e\90ë£\8cê°\80 ì\9e ì\8b\9c 새로 고치지 않을 것입니다.',
\9d´ ë¬¸ì\84\9cì\9d\98 ì\9e\90ë£\8c를 ì\9e ì\8b\9c ë\8f\99ì\95\88 새로 고치지 않을 것입니다.',
 'viewsource' => '원본 보기',
 'viewsource-title' => '$1 문서 원본 보기',
 'actionthrottled' => '동작 중지',
-'actionthrottledtext' => '스팸을 막기 위해 짧은 시간 안에 이 작업을 너무 많이 하는 것을 막고 있습니다.
+'actionthrottledtext' => '스팸을 막기 위해 짧은 시간 동안 이 작업을 너무 많이 수행하는 것을 막고 있습니다.
 제한을 넘었으니 몇 분 뒤에 새로 시도하세요.',
-'protectedpagetext' => '이 문서는 편집하거나 다른 행동을 할 수 없도록 보호되어 있습니다.',
+'protectedpagetext' => '이 문서는 편집하거나 다른 명령을 할 수 없도록 보호되어 있습니다.',
 'viewsourcetext' => '문서의 원본을 보거나 복사할 수 있습니다:',
 'viewyourtext' => "이 문서에 남긴 '''내 편집''' 내용을 보거나 복사할 수 있습니다:",
 'protectedinterface' => '이 문서는 이 위키의 소프트웨어 인터페이스에 쓰이는 문서로, 부정 행위를 막기 위해 보호되어 있습니다.
@@ -767,19 +767,19 @@ $2',
 'invalidtitle-knownnamespace' => '제목 오류: "$2" 이름공간과 "$3" 텍스트',
 'invalidtitle-unknownnamespace' => '제목 오류: 알 수 없는 $1 이름공간 번호와, "$2" 텍스트',
 'exception-nologin' => '로그인하지 않음',
-'exception-nologin-text' => '이 행동을 하거나 이 문서에 접근하려면 [[Special:Userlogin|로그인]]하십시오.',
-'exception-nologin-text-manual' => '이 문서에 접근하거나 이 행동을 하려면 $1하십시오.',
+'exception-nologin-text' => '이 문서에 접근하거나 이 명령을 수행하려면 [[Special:Userlogin|로그인]]하세요.',
+'exception-nologin-text-manual' => '이 문서에 접근하거나 이 명령을 수행하려면 $1하세요.',
 
 # Virus scanner
 'virus-badscanner' => "잘못된 설정: 알 수 없는 바이러스 검사기: '''$1'''",
 'virus-scanfailed' => '검사 실패 (코드 $1)',
-'virus-unknownscanner' => '알려지지 않은 백신:',
+'virus-unknownscanner' => '알 수 없는 백신 소프트웨어:',
 
 # Login and logout pages
 'logouttext' => "'''지금 로그아웃했습니다.'''
 
-브라우저 캐시를 지우지 않으면 일부 문서에서 로그인이 되어 있는 것처럼 보일 수 있다는 점을 참고하세요.",
-'welcomeuser' => '$1, 환영합니다!',
+브라우저 캐시를 지우지 않으면 일부 문서에서 로그인이 되어 있는 것처럼 보일 수 있습니다.",
+'welcomeuser' => '$1 님, 환영합니다!',
 'welcomecreation-msg' => '계정이 만들어졌습니다.
 [[Special:Preferences|{{SITENAME}} 사용자 환경 설정]]을 바꿀 수 있습니다.',
 'yourname' => '사용자 이름:',
@@ -818,7 +818,7 @@ $2',
 'userlogin-resetpassword-link' => '비밀번호를 잊으셨나요?',
 'helplogin-url' => 'Help:로그인',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|로그인에 관한 도움말]]',
-'userlogin-loggedin' => 'ì\9d´ë¯¸ $1ë¡\9c ë¡\9cê·¸ì\9d¸ë\90\98ì\96´ ì\9e\88ì\8aµë\8b\88ë\8b¤. ì\95\84ë\9e\98ì\9d\98 ì\96\91ì\8b\9dì\9c¼ë¡\9c 다른 계정으로 로그인하세요.',
+'userlogin-loggedin' => 'ì\9d´ë¯¸ $1ë¡\9c ë¡\9cê·¸ì\9d¸ë\90\98ì\96´ ì\9e\88ì\8aµë\8b\88ë\8b¤. ì\95\84ë\9e\98ì\9d\98 ì\96\91ì\8b\9dì\9d\84 ì\82¬ì\9a©í\95\98ì\97¬ 다른 계정으로 로그인하세요.',
 'userlogin-createanother' => '다른 계정 만들기',
 'createacct-join' => '아래에 정보를 입력하세요.',
 'createacct-another-join' => '아래에 새 계정의 정보를 입력하세요.',
@@ -836,8 +836,8 @@ $2',
 'createacct-submit' => '계정 만들기',
 'createacct-another-submit' => '다른 계정 만들기',
 'createacct-benefit-heading' => '{{SITENAME}}(은)는 여러분과 같은 사람으로 이루어집니다.',
-'createacct-benefit-body1' => '{{PLURAL:$1|편집 수}}',
-'createacct-benefit-body2' => '{{PLURAL:$1|문서 수}}',
+'createacct-benefit-body1' => '{{PLURAL:$1|편집}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|문서}}',
 'createacct-benefit-body3' => '최근 {{PLURAL:$1|기여자}}',
 'badretype' => '입력한 비밀번호가 일치하지 않습니다.',
 'userexists' => '입력하신 사용자 이름이 이미 등록되어 있습니다.
@@ -919,7 +919,7 @@ $1 기다렸다가 다시 시도하세요.',
 
 # Email sending
 'php-mail-error-unknown' => 'PHP의 mail() 함수에서 알 수 없는 오류가 발생했습니다.',
-'user-mail-no-addy' => '받는이의 이메일 주소가 없으면 이메일을 보낼 수 없습니다.',
+'user-mail-no-addy' => '받는 이의 이메일 주소가 없으면 이메일을 보낼 수 없습니다.',
 'user-mail-no-body' => '비어 있거나 지나치게 짧은 본문으로 이메일을 보내려고 했습니다.',
 
 # Change password dialog
@@ -933,6 +933,8 @@ $1 기다렸다가 다시 시도하세요.',
 'retypenew' => '새 비밀번호 재입력:',
 'resetpass_submit' => '비밀번호를 설정하고 로그인하기',
 'changepassword-success' => '비밀번호가 성공적으로 바뀌었습니다!',
+'changepassword-throttled' => '로그인에 연속으로 실패하였습니다.
+$1 기다렸다가 다시 시도하세요.',
 'resetpass_forbidden' => '비밀번호를 바꿀 수 없습니다',
 'resetpass-no-info' => '이 특수 문서에 직접 접근하려면 반드시 로그인해야 합니다.',
 'resetpass-submit-loggedin' => '비밀번호 바꾸기',
@@ -954,7 +956,7 @@ $1 기다렸다가 다시 시도하세요.',
 'passwordreset-capture' => '발송 결과 이메일을 보시겠습니까?',
 'passwordreset-capture-help' => '이 상자에 체크하면 이메일이 발송된 즉시 임시 비밀번호가 담긴 이메일을 볼 수 있습니다.',
 'passwordreset-email' => '이메일 주소:',
-'passwordreset-emailtitle' => '{{SITENAME}} 계정 자세한 정보',
+'passwordreset-emailtitle' => '{{SITENAME}} 계정에 대한 자세한 정보',
 'passwordreset-emailtext-ip' => '$1 IP 주소를 사용하는 누군가가 아마 자신이 {{SITENAME}} ($4)의 비밀번호 재설정을 요청하였습니다.
 이 이메일 주소와 연관된 {{PLURAL:$3|계정}}의 목록입니다:
 
@@ -990,6 +992,8 @@ $2
 'changeemail-password' => '{{SITENAME}} 비밀번호:',
 'changeemail-submit' => '이메일 주소 바꾸기',
 'changeemail-cancel' => '취소',
+'changeemail-throttled' => '로그인에 연속으로 너무 많이 실패하였습니다.
+$1 기다렸다가 다시 시도하세요.',
 
 # Special:ResetTokens
 'resettokens' => '토큰 재설정',
@@ -1010,7 +1014,7 @@ $2
 'italic_sample' => '기울인 글씨',
 'italic_tip' => '기울인 글씨',
 'link_sample' => '링크 제목',
-'link_tip' => 'ì\95\88쪽 ë§\81í\81¬',
+'link_tip' => 'ë\82´ë¶\80 ê³ ë¦¬',
 'extlink_sample' => 'http://www.example.com 사이트 이름',
 'extlink_tip' => '바깥 링크 (주소 앞에 http://가 있어야 합니다)',
 'headline_sample' => '제목',
@@ -1025,7 +1029,7 @@ $2
 # Edit pages
 'summary' => '요약:',
 'subject' => '주제/제목:',
-'minoredit' => '사소한 편집',
+'minoredit' => '사소한 편집입니다',
 'watchthis' => '이 문서 주시하기',
 'savearticle' => '저장',
 'preview' => '미리 보기',
@@ -1042,7 +1046,7 @@ IP 주소가 문서 역사에 남게 됩니다.",
 다시 \"{{int:savearticle}}\" 버튼을 클릭하면 글이 제목 없이 저장됩니다.",
 'summary-preview' => '요약 미리 보기:',
 'subject-preview' => '주제/제목 미리 보기:',
-'blockedtitle' => '차단됨',
+'blockedtitle' => 'ì\82¬ì\9a©ì\9e\90ê°\80 ì°¨ë\8b¨ë\90¨',
 'blockedtext' => "'''사용자 계정 또는 IP 주소가 차단되었습니다.'''
 
 차단한 사람은 $1입니다.
@@ -1054,7 +1058,7 @@ IP 주소가 문서 역사에 남게 됩니다.",
 
 $1 또는 [[{{MediaWiki:Grouppage-sysop}}|다른 관리자]]에게 차단에 대해 문의할 수 있습니다.
 [[Special:Preferences|계정 환경 설정]]에 올바른 이메일 주소가 있어야만 '이메일 보내기' 기능을 사용할 수 있습니다. 또 이메일 보내기 기능이 차단되어 있으면 이메일을 보낼 수 없습니다.
-지금 당신의 IP 주소는 $3이고, 차단 ID는 #$5입니다.
+현재 당신의 IP 주소는 $3이고, 차단 ID는 #$5입니다.
 문의할 때에 이 정보를 같이 알려주세요.",
 'autoblockedtext' => '당신의 IP 주소는 $1 사용자가 차단한 사용자가 사용했던 IP이기 때문에 자동으로 차단되었습니다.
 차단된 이유는 다음과 같습니다:
@@ -1082,7 +1086,7 @@ $1 또는 [[{{MediaWiki:Grouppage-sysop}}|다른 관리자]]에게 차단에 대
 'loginreqlink' => '로그인',
 'loginreqpagetext' => '다른 문서를 보기 위해서는 $1해야 합니다.',
 'accmailtitle' => '비밀번호를 보냈습니다',
-'accmailtext' => '[[User talk:$1|$1]] 사용자의 비밀번호가 임의로 만들어져 $2(으)로 보냈습니다. 로그인하고 나서 [[Special:ChangePassword|비밀번호를 바꿀]] 수 있습니다.',
+'accmailtext' => '[[User talk:$1|$1]] 사용자의 비밀번호를 임의로 만들어 $2(으)로 보냈습니다. 로그인하고 나서 [[Special:ChangePassword|비밀번호를 바꿀]] 수 있습니다.',
 'newarticle' => '(새 문서)',
 'newarticletext' => "아직 없는 문서의 링크를 따라왔습니다.
 새 문서를 만들려면 아래 상자에 내용을 입력하면 됩니다. (자세한 내용은 [[{{MediaWiki:Helppage}}|도움말 문서]]를 참고하세요)
@@ -1190,7 +1194,7 @@ IP 주소는 여러 사용자가 공유할 수 있습니다.
 'nocreatetext' => '{{SITENAME}}에서 새로운 문서를 만드는 것은 제한되어 있습니다.
 이미 존재하는 다른 문서를 편집하거나, [[Special:UserLogin|로그인하거나 계정을 만들]] 수 있습니다.',
 'nocreate-loggedin' => '새 문서를 만들 권한이 없습니다.',
-'sectioneditnotsupported-title' => '부분 편집 지원 안됨',
+'sectioneditnotsupported-title' => '부분 편집 지원 안 됨',
 'sectioneditnotsupported-text' => '이 문서에서는 문단 편집을 지원하지 않습니다.',
 'permissionserrors' => '권한 오류',
 'permissionserrorstext' => '해당 명령을 수행할 권한이 없습니다. 다음 {{PLURAL:$1|이유}}를 확인해보세요:',
@@ -1217,6 +1221,8 @@ IP 주소는 여러 사용자가 공유할 수 있습니다.
 'content-not-allowed-here' => '"$1" 내용은 [[$2]] 문서예 허용하지 않습니다',
 'editwarning-warning' => '이 페이지에서 벗어나면 저장하지 않은 바뀜이 모두 사라집니다.
 로그인을 했다면, 환경 설정의 "편집 상자"에서 이 경고를 띄우지 않도록 설정할 수 있습니다.',
+'editpage-notsupportedcontentformat-title' => '지원하지 않는 컨텐츠 형식',
+'editpage-notsupportedcontentformat-text' => '컨텐츠 모델 $2 에서는 컨텐츠형식 $1을 지원하지 않습니다.',
 
 # Content models
 'content-model-wikitext' => '위키텍스트',
@@ -1232,11 +1238,11 @@ $2개 보다 적게 {{PLURAL:$2|써야}} 하지만 {{PLURAL:$1|지금은 $1개
 'post-expand-template-inclusion-warning' => "'''경고:''' 틀 포함 크기가 너무 큽니다.
 일부 틀은 포함되지 않을 수 있습니다.",
 'post-expand-template-inclusion-category' => '사용한 틀의 크기가 지나치게 큰 문서의 목록',
-'post-expand-template-argument-warning' => "'''경고:''' 이 문서는 전개하면 크기가 너무 큰 틀 수가 하나 이상 포함되어 있습니다.
-이 수는 생략했습니다.",
+'post-expand-template-argument-warning' => "'''경고:''' 이 문서는 전개하면 크기가 너무 큰 틀 수가 하나 이상 포함되어 있습니다.
+이 수는 생략했습니다.",
 'post-expand-template-argument-category' => '생략된 틀 변수를 포함한 문서',
 'parser-template-loop-warning' => '재귀적인 틀이 발견되었습니다: [[$1]]',
-'parser-template-recursion-depth-warning' => '틀 반복 횟수 제한을 초과함($1)',
+'parser-template-recursion-depth-warning' => '틀 반복 깊이 제한을 초과함 ($1)',
 'language-converter-depth-warning' => '언어 변환기 실행 제한 초과($1)',
 'node-count-exceeded-category' => '문서가 노드 횟수를 초과하였습니다.',
 'node-count-exceeded-warning' => '문서가 노드 수를 초과하였습니다.',
@@ -1345,13 +1351,13 @@ $2개 보다 적게 {{PLURAL:$2|써야}} 하지만 {{PLURAL:$1|지금은 $1개
 'revdelete-legend' => '보이기 제한을 설정',
 'revdelete-hide-text' => '판 내용',
 'revdelete-hide-image' => '파일을 숨기기',
-'revdelete-hide-name' => '기록 내용과 대상을 숨기기',
+'revdelete-hide-name' => '명령 내용과 대상을 숨기기',
 'revdelete-hide-comment' => '편집 요약',
 'revdelete-hide-user' => '편집자의 사용자 이름/IP 주소',
 'revdelete-hide-restricted' => '관리자도 보지 못하게 숨기기',
 'revdelete-radio-same' => '(바꾸지 않음)',
 'revdelete-radio-set' => '숨겨짐',
-'revdelete-radio-unset' => 'ë³´ì\97¬ì§\90',
+'revdelete-radio-unset' => 'ë³´ì\9e\84',
 'revdelete-suppress' => '문서 내용을 관리자에게도 보이지 않게 숨기기',
 'revdelete-unsuppress' => '되살린 판에 대한 제한을 해제',
 'revdelete-log' => '이유:',
@@ -1462,13 +1468,14 @@ $1",
 'searchprofile-articles-tooltip' => '$1에서 검색',
 'searchprofile-project-tooltip' => '$1에서 검색',
 'searchprofile-images-tooltip' => '파일 검색',
-'searchprofile-everything-tooltip' => '토론 문서를 포함한 모든 문서 검색',
+'searchprofile-everything-tooltip' => '모든 문서 검색(토론 문서를 포함)',
 '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-redirect' => '($1에서 넘어옴)',
 'search-section' => '($1 문단)',
+'search-file-match' => '(내용이 일치하는 파일 있음)',
 'search-suggest' => '$1 문서를 찾고 있으신가요?',
 'search-interwiki-caption' => '자매 프로젝트',
 'search-interwiki-default' => '$1 결과:',
@@ -1487,7 +1494,7 @@ $1",
 'powersearch-togglelabel' => '확인:',
 'powersearch-toggleall' => '모두',
 'powersearch-togglenone' => '모두 제외',
-'search-external' => '바깥 검색',
+'search-external' => '바깥에서 검색',
 'searchdisabled' => '{{SITENAME}} 검색이 비활성화되어 있습니다.
 검색이 작동하지 않는 동안에는 Google(구글)을 통해 검색할 수 있습니다.
 검색 엔진의 내용은 최신이 아닐 수 있다는 점을 참고하세요.',
@@ -1500,7 +1507,7 @@ $1",
 'prefsnologintext2' => '사용자 환경 설정을 설정하려면 $1하십시오.',
 'prefs-skin' => '스킨',
 'skin-preview' => '미리 보기',
-'datedefault' => '기본값',
+'datedefault' => '기본 값',
 'prefs-beta' => '베타 기능',
 'prefs-datetime' => '날짜와 시각',
 'prefs-labs' => '실험 중인 기능',
@@ -1537,7 +1544,7 @@ $1",
 'savedprefs' => '설정을 저장했습니다.',
 'timezonelegend' => '시간대:',
 'localtime' => '현지 시각:',
-'timezoneuseserverdefault' => '위키 기본값($1)을 사용',
+'timezoneuseserverdefault' => '위키 기본 값($1)을 사용',
 'timezoneuseoffset' => '기타 (시차를 입력해주세요)',
 'servertime' => '서버 시각:',
 'guesstimezone' => '웹 브라우저 설정에서 가져오기',
@@ -1555,12 +1562,12 @@ $1",
 'prefs-searchoptions' => '검색',
 'prefs-namespaces' => '이름공간',
 'defaultns' => '다음 이름공간에서 검색:',
-'default' => '기본값',
+'default' => '기본 값',
 'prefs-files' => '파일',
 'prefs-custom-css' => '사용자 CSS',
 'prefs-custom-js' => '사용자 자바스크립트',
 'prefs-common-css-js' => '모든 스킨에 대한 공통 CSS/자바스크립트:',
-'prefs-reset-intro' => '이 사이트의 기본값으로 환경 설정을 재설정할 수 있습니다.
+'prefs-reset-intro' => '이 사이트의 기본 값으로 환경 설정을 재설정할 수 있습니다.
 재설정한 환경 설정은 되돌릴 수 없습니다.',
 'prefs-emailconfirm-label' => '이메일 인증:',
 'youremail' => '이메일:',
@@ -1578,7 +1585,7 @@ $1",
 HTML 태그를 확인하세요.',
 'badsiglength' => '서명이 너무 깁니다.
 서명은 $1 {{PLURAL:$1|글자}}보다 짧아야 합니다.',
-'yourgender' => 'ì\96´ë\96»ê²\8c ì\84±ë³\84ì\9d\84 ì\95\8c려주고 ì\8b¶ì\8aµ니까?',
+'yourgender' => 'ì\96´ë\96¤ ì\84±ë³\84ë¡\9c í\91\9cì\8b\9cë\90\98ë\8a\94 ê²\83ì\9d\84 ì\84 í\98¸í\95©니까?',
 'gender-unknown' => '밝히고 싶지 않습니다.',
 'gender-male' => '위키 문서를 편집하는 남자입니다',
 'gender-female' => '위키 문서를 편집하는 여자입니다',
@@ -1609,7 +1616,7 @@ HTML 태그를 확인하세요.',
 'prefs-displaywatchlist' => '보이기 설정',
 'prefs-tokenwatchlist' => '토큰',
 'prefs-diffs' => '차이',
-'prefs-help-prefershttps' => '이 사용자 환경 설정은 다음 로그인 적용됩니다.',
+'prefs-help-prefershttps' => '이 사용자 환경 설정은 다음 로그인부터 적용됩니다.',
 'prefs-tabs-navigation-hint' => '팁: 탭 목록에서 탭 사이를 둘러보려면 왼쪽과 오른쪽 화살표 키를 사용할 수 있습니다.',
 
 # User preference: email validation using jQuery
@@ -1638,7 +1645,7 @@ HTML 태그를 확인하세요.',
 'userrights-changeable-col' => '바꿀 수 있는 권한',
 'userrights-unchangeable-col' => '바꿀 수 없는 권한',
 'userrights-conflict' => '사용자 권한 바꾸기가 충돌합니다! 바뀜을 검토하고 확인하세요.',
-'userrights-removed-self' => 'ì\9e\90ì\8b ì\9d\98 ê¶\8cí\95\9cì\9d\84 ì\84±ê³µì \81ì\9c¼ë¡\9c ì \9cê±°했습니다. 따라서 더 이상 이 문서에 접근할 수 없습니다.',
+'userrights-removed-self' => 'ì\9e\90ì\8b ì\9d\98 ê¶\8cí\95\9cì\9d\84 ì \9cê±°í\95\98ë\8a\94 ë\8d° ì\84±ê³µ했습니다. 따라서 더 이상 이 문서에 접근할 수 없습니다.',
 
 # Groups
 'group' => '그룹:',
@@ -1670,12 +1677,12 @@ HTML 태그를 확인하세요.',
 'right-createpage' => '문서 만들기 (토론 문서 제외)',
 'right-createtalk' => '토론 문서 만들기',
 'right-createaccount' => '새 계정 만들기',
-'right-minoredit' => '사소한 편집 사용 가능',
+'right-minoredit' => '사소한 편집으로 표시',
 'right-move' => '문서 이동',
 'right-move-subpages' => '문서와 하위 문서 이동하기',
 'right-move-rootuserpages' => '최상위 사용자 문서 이동',
 'right-movefile' => '파일 옮기기',
-'right-suppressredirect' => '문ì\84\9c ì\9d´ë\8f\99í\95  ë\95\8c ì\9d´ì \84 ì\9d´ë¦\84ì\9c¼ë¡\9c ë\90\9c ë\84\98겨주기를 ë\82¨ê¸°지 않기',
+'right-suppressredirect' => '문ì\84\9c ì\9d´ë\8f\99í\95  ë\95\8c ì\9d´ì \84 ì\9d´ë¦\84ì\9c¼ë¡\9c ë\90\9c ë\84\98겨주기를 ë§\8cë\93¤지 않기',
 'right-upload' => '파일 올리기',
 'right-reupload' => '이미 존재하는 파일을 다시 올리기',
 'right-reupload-own' => '자신이 이미 올린 파일 덮어쓰기',
@@ -1689,15 +1696,15 @@ HTML 태그를 확인하세요.',
 'right-writeapi' => 'API 작성',
 'right-delete' => '문서 삭제',
 'right-bigdelete' => '문서 역사가 긴 문서를 삭제',
-'right-deletelogentry' => '특정 기록 항목을 삭제하고 되살리기',
-'right-deleterevision' => '문서의 특정 판을 삭제하고 되살리기',
+'right-deletelogentry' => '특정 기록 항목을 삭제 및 되살리기',
+'right-deleterevision' => '문서의 특정 판을 삭제 및 되살리기',
 'right-deletedhistory' => '삭제된 문서의 내용을 제외한 역사를 보기',
 'right-deletedtext' => '삭제된 문서의 내용과 편집상의 차이를 보기',
 'right-browsearchive' => '삭제된 문서 검색',
 'right-undelete' => '삭제된 문서 되살리기',
-'right-suppressrevision' => '관리자 보지 못하도록 숨겨진 판을 검토하고 되살리기',
+'right-suppressrevision' => '관리자 보지 못하도록 숨겨진 판을 검토하고 되살리기',
 'right-suppressionlog' => '숨겨진 기록을 보기',
-'right-block' => '다른 사용자 편집을 못하도록 차단',
+'right-block' => '다른 사용자 편집을 못하도록 차단',
 'right-blockemail' => '다른 사용자가 이메일을 보내지 못하도록 차단',
 'right-hideuser' => '사용자 이름을 차단하고 숨김',
 'right-ipblock-exempt' => 'IP 차단, 자동 차단, 광역 차단을 무시',
@@ -1765,11 +1772,11 @@ HTML 태그를 확인하세요.',
 'action-undelete' => '이 문서 되살리기',
 'action-suppressrevision' => '이 숨겨진 판을 검토하고 되살릴',
 'action-suppressionlog' => '비공개 기록 보기',
-'action-block' => '이 사용자 편집하지 못하도록 차단',
+'action-block' => '이 사용자 편집하지 못하도록 차단',
 'action-protect' => '이 문서의 보호 설정을 바꾸기',
 'action-rollback' => '특정 문서를 마지막으로 편집한 사용자의 모든 편집을 간편하게 되돌리기',
 'action-import' => '다른 위키에서 문서 가져오기',
-'action-importupload' => 'í\8c\8cì\9d¼ ì\98¬ë¦¬ê¸°ë¥¼ í\86µí\95´ ë¬¸ì\84\9c를 ê°\80ì ¸ì\98¬',
+'action-importupload' => 'í\8c\8cì\9d¼ ì\98¬ë¦¬ê¸°ë¥¼ í\86µí\95´ ë¬¸ì\84\9c를 ê°\80ì ¸ì\98¤ê¸°',
 'action-patrol' => '다른 사용자의 편집을 검토된 것으로 표시하기',
 'action-autopatrol' => '자신의 편집을 검토된 것으로 표시할',
 'action-unwatchedpages' => '주시되지 않은 문서 목록 보기',
@@ -1795,7 +1802,7 @@ HTML 태그를 확인하세요.',
 'recentchanges-label-newpage' => '새 문서',
 'recentchanges-label-minor' => '사소한 편집',
 'recentchanges-label-bot' => '봇의 편집',
-'recentchanges-label-unpatrolled' => '아직 검토하지 않은 편집',
+'recentchanges-label-unpatrolled' => '아직 순찰하지 않은 편집',
 'recentchanges-label-plusminus' => '바이트로 표기된 바뀐 문서 크기',
 'recentchanges-legend-heading' => "'''범례:'''",
 'recentchanges-legend-newpage' => '([[Special:NewPages|새 문서 목록]]도 보세요)',
@@ -1806,7 +1813,7 @@ HTML 태그를 확인하세요.',
 'rcshowhidebots' => '봇을 $1',
 'rcshowhideliu' => '등록된 사용자를 $1',
 'rcshowhideanons' => '익명 사용자를 $1',
-'rcshowhidepatr' => '검토된 편집을 $1',
+'rcshowhidepatr' => '순찰된 편집을 $1',
 'rcshowhidemine' => '내 편집을 $1',
 'rclinks' => '최근 $2일간의 $1개 바뀐 문서 보기<br />$3',
 'diff' => '비교',
@@ -1833,7 +1840,7 @@ HTML 태그를 확인하세요.',
 'recentchangeslinked-summary' => "여기를 가리키는 문서(분류일 경우 이 분류에 포함된 문서)에 대한 최근 바뀜이 나와 있습니다.
 [[Special:Watchlist|주시하는 문서]]는 '''굵은''' 글씨로 나타납니다.",
 'recentchangeslinked-page' => '문서 이름:',
-'recentchangeslinked-to' => '해당 문서를 링크한 문서의 바뀜 보기',
+'recentchangeslinked-to' => '해당 문서를 가리키는 문서의 바뀜 보기',
 
 # Upload
 'upload' => '파일 올리기',
@@ -1853,7 +1860,7 @@ HTML 태그를 확인하세요.',
 
 문서에 파일을 넣으려면 아래 방법 중 하나를 사용하세요.
 * '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' 파일의 온전한 모양을 사용하고자 할 때
-* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200í\94½ì\85\80\84¬ë\84¤ì\9d¼|ì\99¼ìª½|ì\84¤ëª\85]]</nowiki></code>''' í\8c\8cì\9d¼ì\9d\98 ë\84\93ì\9d´를 200픽셀로 하고 왼쪽 정렬하며 '설명' 이라는 주석을 파일 밑에 달 때
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200í\94½ì\85\80\84¬ë\84¤ì\9d¼|ì\99¼ìª½|ì\84¤ëª\85]]</nowiki></code>''' í\8c\8cì\9d¼ì\9d\98 ë\84\88ë¹\84를 200픽셀로 하고 왼쪽 정렬하며 '설명' 이라는 주석을 파일 밑에 달 때
 * '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' 파일을 직접 보여주지 않고 파일로 바로 링크할 때",
 'upload-permitted' => '허용하는 파일 확장자: $1',
 'upload-preferred' => '권장하는 파일 확장자: $1',
@@ -1865,22 +1872,22 @@ HTML 태그를 확인하세요.',
 'filename' => '파일 이름',
 'filedesc' => '파일의 설명',
 'fileuploadsummary' => '요약:',
-'filereuploadsummary' => '파일 바뀜에 대한 요약:',
+'filereuploadsummary' => '파일의 바뀜:',
 'filestatus' => '저작권 상태:',
 'filesource' => '출처:',
 'uploadedfiles' => '파일 올리기',
 'ignorewarning' => '경고를 무시하고 파일 저장',
 'ignorewarnings' => '모든 경고 무시하기',
 'minlength1' => '파일 이름은 적어도 1글자 이상이어야 합니다.',
-'illegalfilename' => 'í\8c\8cì\9d¼ ì\9d´ë¦\84 "$1"ì\97\90ë\8a\94 ë¬¸ì\84\9c ì \9c목ì\9c¼ë¡\9c 허용되지 않는 글자가 포함되어 있습니다.
+'illegalfilename' => 'í\8c\8cì\9d¼ ì\9d´ë¦\84 "$1"ì\97\90ë\8a\94 ë¬¸ì\84\9c ì \9c목ì\97\90 허용되지 않는 글자가 포함되어 있습니다.
 이름을 바꾸어 다시 시도해 주세요.',
 'filename-toolong' => '파일 이름은 240바이트를 넘을 수 없습니다.',
 'badfilename' => '파일 이름이 "$1"로 바뀌었습니다.',
-'filetype-mime-mismatch' => '".$1" 파일 확장자와 이 파일의 MIME($2)가 일치하지 않습니다.',
-'filetype-badmime' => '"$1" MIME을 가진 파일은 올릴 수 없습니다.',
-'filetype-bad-ie-mime' => 'ì\9d¸í\84°ë\84· ì\9dµì\8a¤í\94\8cë¡\9cë\9f¬ê°\80 ì\9e ì\9e¬ì \81ì\9c¼ë¡\9c ì\9c\84í\97\98í\95\9c í\8c\8cì\9d¼ í\98\95ì\8b\9dì\9c¼ë¡\9c í\8c\90ë\8b¨ë\90\98ì\96´ ì\82¬ì\9a©ì\9d´ ê¸\88ì§\80ë\90\9c "$1"ë¡\9c ì\9d¸ì\8b\9dí\95  ì\88\98 ì\9e\88기 ë\95\8c문ì\97\90 ì\9d´ í\8c\8cì\9d¼ì\9d\84 ì\98¬ë¦´ ì\88\98 ì\97\86습니다.',
-'filetype-unwanted-type' => "'''\".\$1\"''' 확장자는 추천하지 않습니다.
-추천하는 {{PLURAL:\$3|파일 확장자}}는 \$2입니다.",
+'filetype-mime-mismatch' => '".$1" 파일 확장자와 이 파일의 MIME 형식($2)이 일치하지 않습니다.',
+'filetype-badmime' => '"$1" MIME 형식을 가진 파일은 올릴 수 없습니다.',
+'filetype-bad-ie-mime' => 'ì\9d´ í\8c\8cì\9d¼ì\9d\84 ì\98¬ë¦´ ì\88\98 ì\97\86ì\8aµë\8b\88ë\8b¤. ì\9d¸í\84°ë\84· ì\9dµì\8a¤í\94\8cë¡\9cë\9f¬ê°\80 ì\9e ì\9e¬ì \81ì\9c¼ë¡\9c ì\9c\84í\97\98í\95\9c í\8c\8cì\9d¼ í\98\95ì\8b\9dì\9c¼ë¡\9c í\8c\90ë\8b¨í\95\98ì\97¬ ì\82¬ì\9a©ì\9d´ ê¸\88ì§\80ë\90\9c "$1"ë¡\9c ì\9d¸ì\8b\9dí\95  ì\88\98 ì\9e\88습니다.',
+'filetype-unwanted-type' => "'''\".\$1\"''' 확장자는 권장하지 않습니다.
+권장하는 {{PLURAL:\$3|파일 확장자}}는 \$2입니다.",
 'filetype-banned-type' => '\'\'\'".$1"\'\'\' {{PLURAL:$4|형식의 파일은 올릴 수 없습니다}}.
 $2 {{PLURAL:$3|형식만 사용할 수 있습니다}}.',
 'filetype-missing' => '파일에 확장자(".jpg" 등)가 없습니다.',
@@ -1895,7 +1902,7 @@ $2 {{PLURAL:$3|형식만 사용할 수 있습니다}}.',
 'unknown-error' => '알 수 없는 오류가 발생했습니다.',
 'tmp-create-error' => '임시 파일을 만들 수 없습니다.',
 'tmp-write-error' => '임시 파일을 작성하는 데 오류가 발생했습니다.',
-'large-file' => '파일 크기는 $1을 넘지 않는 것을 추천합니다.
+'large-file' => '파일 크기는 $1을 넘지 않는 것을 권장합니다.
 이 파일의 크기는 $2입니다.',
 'largefileserver' => '이 파일의 크기가 서버에서 허용된 설정보다 큽니다.',
 'emptyfile' => '올리려는 파일이 빈 파일입니다.
@@ -1935,14 +1942,14 @@ $2 {{PLURAL:$3|형식만 사용할 수 있습니다}}.',
 'overwroteimage' => '사용자가 "[[$1]]" 파일의 새 판을 올렸습니다.',
 'uploaddisabled' => '올리기 비활성화됨',
 'copyuploaddisabled' => 'URL로 파일 올리기가 비활성화되어 있습니다.',
-'uploadfromurl-queued' => '올리기 명령이 기록되었습니다.',
+'uploadfromurl-queued' => '올리기 명령이 대기열에 추가됐습니다.',
 'uploaddisabledtext' => '파일 올리기 기능이 비활성화되어 있습니다.',
 'php-uploaddisabledtext' => 'PHP 파일 올리기가 비활성화되었습니다. 파일 올리기 설정을 확인하십시오.',
 'uploadscripted' => '이 파일에는 HTML이나 다른 스크립트 코드가 포함되어 있어, 웹 브라우저에서 오류를 일으킬 수 있습니다.',
 'uploadvirus' => '파일이 바이러스를 포함하고 있습니다!
 자세한 설명: $1',
 'uploadjava' => '이 ZIP 파일은 자바의 .class 파일을 포함하고 있습니다.
-보안을 위한 제한을 우회할 수 있기 때문에 자바 파일을 올리는 것이 허용되지 않습니다.',
+보안 규제를 우회할 수 있기 때문에 자바 파일을 올리는 것이 허용되지 않습니다.',
 'upload-source' => '원본 파일',
 'sourcefilename' => '원본 파일 이름:',
 'sourceurl' => '출처 URL:',
@@ -1987,7 +1994,7 @@ $1',
 'upload-misc-error-text' => '파일을 올리는 중 알 수 없는 오류가 발생했습니다.
 URL이 올바르고 접근 가능한지를 확인하고 다시 시도하세요.
 문제가 계속되면 [[Special:ListUsers/sysop|관리자]]에게 연락해주세요.',
-'upload-too-many-redirects' => 'URL이 너무 많은 넘겨주기에 연결되어 있습니다.',
+'upload-too-many-redirects' => 'URL이 너무 많은 넘겨주기를 포함하고 있습니다.',
 'upload-unknown-size' => '크기를 알 수 없음',
 'upload-http-error' => 'HTTP 오류 발생: $1',
 'upload-copy-upload-invalid-domain' => '이 도메인에 속하지 않는 웹사이트의 파일을 올릴 수 없습니다.',
@@ -2124,7 +2131,7 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 'filehist-current' => '현재',
 'filehist-datetime' => '날짜/시간',
 'filehist-thumb' => '섬네일',
-'filehist-thumbtext' => '$1 판의 일',
+'filehist-thumbtext' => '$1 판의 섬네일',
 'filehist-nothumb' => '섬네일 없음',
 'filehist-user' => '사용자',
 'filehist-dimensions' => '크기',
@@ -2166,7 +2173,7 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 'filerevert-defaultcomment' => '$1 $2 버전으로 되돌림',
 'filerevert-submit' => '되돌리기',
 'filerevert-success' => "'''[[Media:$1|$1]]''' 파일을 [$4 $2 $3 버전]으로 되돌렸습니다.",
-'filerevert-badversion' => '주ì\96´ì§\84 í\83\80ì\9e\84ì\8a¤í\83¬í\94\84를 가진 파일의 로컬 버전이 없습니다.',
+'filerevert-badversion' => 'ì\9e\85ë ¥ë\90\9c ì\8b\9cê°\84 ê¸°ë¡\9dì\9d\84 가진 파일의 로컬 버전이 없습니다.',
 
 # File deletion
 'filedelete' => '$1 삭제하기',
@@ -2192,7 +2199,7 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 'mimesearch' => 'MIME 검색',
 'mimesearch-summary' => 'MIME 유형에 해당하는 파일을 검색합니다.
 다음 형태로 입력해주세요: 내용종류/하위종류, 예를 들어 <code>image/jpeg</code>',
-'mimetype' => 'MIME 종류:',
+'mimetype' => 'MIME 형식:',
 'download' => '다운로드',
 
 # Unwatched pages
@@ -2323,7 +2330,7 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 'protectedtitlesempty' => '해당 조건에 맞는 만들기 금지 표제어가 없습니다.',
 'listusers' => '사용자 목록',
 'listusers-editsonly' => '기여가 있는 사용자만 보기',
-'listusers-creationsort' => '계정을 만든 날짜 순으로 정렬',
+'listusers-creationsort' => '계정을 만든 날짜순으로 정렬',
 'listusers-desc' => '내림차순으로 정렬',
 'usereditcount' => '{{PLURAL:$1|편집}} $1회',
 'usercreated' => '$1 $2에 계정 {{GENDER:$3|만들어짐}}',
@@ -2416,7 +2423,7 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 'listusers-blocked' => '(차단됨)',
 
 # Special:ActiveUsers
-'activeusers' => 'í\99\9cë\8f\99ì \81ì\9d¸ 사용자 목록',
+'activeusers' => 'í\99\9cë°\9cí\95\9c 사용자 목록',
 'activeusers-intro' => '다음은 최근 $1{{PLURAL:$1|일}} 동안 활동한 사용자의 목록입니다.',
 'activeusers-count' => '마지막 {{PLURAL:$3|$3일}} 사이의 {{PLURAL:$1|활동}} $1회',
 'activeusers-from' => '다음으로 시작하는 사용자를 보기:',
@@ -2461,7 +2468,7 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 'noemailtext' => '이 사용자는 올바른 이메일 주소를 입력하지 않았습니다.',
 'nowikiemailtitle' => '이메일이 허용되지 않음',
 'nowikiemailtext' => '이 사용자는 다른 사용자로부터의 이메일을 받지 않도록 설정하였습니다.',
-'emailnotarget' => '받는이로 없는 사용자를 지정하였거나 사용자 이름이 잘못되었습니다.',
+'emailnotarget' => '없는 사용자를 받는 이로 지정하였거나 사용자 이름이 잘못되었습니다.',
 'emailtarget' => '수신자 사용자 이름 입력',
 'emailusername' => '사용자 이름:',
 'emailusernamesubmit' => '확인',
@@ -2597,7 +2604,7 @@ $UNWATCHURL
 'delete-warning-toobig' => '이 문서에는 {{PLURAL:$1|편집 역사}}가 $1개 있습니다.
 편집 역사가 긴 문서를 삭제하면 {{SITENAME}} 데이터베이스 동작에 큰 영향을 줄 수 있습니다.
 주의해 주세요.',
-'deleting-backlinks-warning' => "'''경고:''' 삭제하려는 문서로의 링크를 가진 다른 문서가 있습니다.",
+'deleting-backlinks-warning' => "'''경고:''' 삭제하려는 문서가 다른 문서에 연결되거나 삽입되어 있습니다.",
 
 # Rollback
 'rollback' => '편집 되돌리기',
@@ -2661,7 +2668,7 @@ $UNWATCHURL
 'protect-expiring' => '$1 (UTC)에 만료',
 'protect-expiring-local' => '$1에 해제',
 'protect-expiry-indefinite' => '무기한',
-'protect-cascade' => '연쇄적 보호 - 이 문서에서 사용되는 다른 문서를 함께 보호합니다.',
+'protect-cascade' => '연쇄적 보호 - 이 문서가 포함하고 있는 다른 문서를 함께 보호합니다.',
 'protect-cantedit' => '이 문서의 보호 설정을 바꿀 권한이 없습니다.',
 'protect-othertime' => '다른 기간:',
 'protect-othertime-op' => '다른 기간',
@@ -2791,7 +2798,7 @@ $1',
 'nolinkshere' => "'''[[:$1]]''' 문서를 가리키는 문서가 없습니다.",
 'nolinkshere-ns' => "선택한 이름공간에는 '''[[:$1]]''' 문서를 가리키는 문서가 없습니다.",
 'isredirect' => '넘겨주기 문서',
-'istemplate' => '포함',
+'istemplate' => '끼워넣기',
 'isimage' => '파일 사용 중',
 'whatlinkshere-prev' => '{{PLURAL:$1|이전|이전 $1개}}',
 'whatlinkshere-next' => '{{PLURAL:$1|다음|다음 $1개}}',
@@ -2840,6 +2847,7 @@ $1',
 차단된 사용자 목록은 [[Special:BlockList|여기]]에서 볼 수 있습니다.',
 'ipb-blockingself' => '자기 자신을 차단하려고 합니다! 정말로 실행할까요?',
 'ipb-confirmhideuser' => '사용자를 차단하면서 "사용자 숨기기" 설정을 선택했습니다. 모든 기록에서 이 사용자의 사용자 이름을 숨기게 됩니다. 정말로 계정을 숨기시겠습니까?',
+'ipb-confirmaction' => '그것을 정말로 하기 원한다면 아래에 있는 "{{int:ipb-confirm}}" 부분에 체크하세요',
 'ipb-edit-dropdown' => '차단 이유 목록 편집하기',
 'ipb-unblock-addr' => '$1 차단 해제하기',
 'ipb-unblock' => '사용자 또는 IP 주소 차단 해제하기',
@@ -2904,7 +2912,7 @@ $1 사용자가 차단된 이유는 다음과 같습니다: "$2"',
 'range_block_disabled' => 'IP 범위 차단 기능이 비활성화되어 있습니다.',
 'ipb_expiry_invalid' => '차단 기간이 잘못되었습니다.',
 'ipb_expiry_temp' => '사용자 이름을 숨기는 차단은 반드시 무기한이어야 합니다.',
-'ipb_hide_invalid' => '해당 계정은 막을 수 없습니다. 기여량이 너무 많습니다.',
+'ipb_hide_invalid' => '해당 계정은 막을 수 없습니다. {{PLURAL:$1|1회|$1회}} 이상 편집했습니다.',
 'ipb_already_blocked' => '"$1" 사용자는 이미 차단되었습니다',
 'ipb-needreblock' => '$1 사용자는 이미 차단되었습니다. 차단 설정을 바꾸시겠습니까?',
 'ipb-otherblocks-header' => '다른 {{PLURAL:$1|차단}} 기록',
@@ -3197,9 +3205,9 @@ $2',
 'tooltip-n-portal' => '프로젝트에 대해 여러분이 할 수 있고, 정보를 찾을 수 있는 곳',
 'tooltip-n-currentevents' => '최근의 소식 알아 보기',
 'tooltip-n-recentchanges' => '위키의 최근 바뀜 목록',
-'tooltip-n-randompage' => '임의 문서 기',
+'tooltip-n-randompage' => '임의 문서 불러오기',
 'tooltip-n-help' => '도움말',
-'tooltip-t-whatlinkshere' => '여기를 링크한 모든 위키 문서의 목록',
+'tooltip-t-whatlinkshere' => '여기를 가리키는 모든 위키 문서의 목록',
 'tooltip-t-recentchangeslinked' => '이 문서에서 링크한 문서의 최근 바뀜',
 'tooltip-feed-rss' => '이 문서의 RSS 피드',
 'tooltip-feed-atom' => '이 문서의 Atom 피드',
@@ -3223,7 +3231,7 @@ $2',
 'tooltip-save' => '바뀐 내용 저장하기',
 'tooltip-preview' => '바뀜을 미리 봅니다. 저장하기 전에 미리 보기를 해주세요!',
 'tooltip-diff' => '자신이 바꾼 내용 보기',
-'tooltip-compareselectedversions' => '이 문서에서 선택한 두 판간의 차이를 비교',
+'tooltip-compareselectedversions' => '이 문서에서 선택한 두 판 간의 차이를 비교',
 'tooltip-watch' => '이 문서를 주시문서 목록에 추가',
 'tooltip-watchlistedit-normal-submit' => '항목 제거하기',
 'tooltip-watchlistedit-raw-submit' => '주시문서 목록 새로 고침',
@@ -3344,7 +3352,7 @@ $2',
 'markaspatrolleddiff' => '검토한 문서로 표시',
 'markaspatrolledtext' => '이 문서를 검토한 것으로 표시',
 'markedaspatrolled' => '검토한 문서로 표시',
-'markedaspatrolledtext' => '[[:$1]] 문서의 선택한 판을 검토한 것으로 표시하였습니다.',
+'markedaspatrolledtext' => '[[:$1]] 문서의 선택한 판을 순찰한 것으로 표시하였습니다.',
 'rcpatroldisabled' => '최근 바뀜 검토 기능 비활성화됨',
 'rcpatroldisabledtext' => '최근 바뀜 검토 기능은 현재 비활성화되어 있습니다.',
 'markedaspatrollederror' => '검토한 것으로 표시할 수 없습니다.',
@@ -3450,8 +3458,8 @@ Variants for Chinese language
 
 # Metadata
 'metadata' => '메타데이터',
-'metadata-help' => '이 파일은 그 파일을 만들거나 디지털화하는 데 사용되는 카메라나 스캐너에서 기록한 부가 정보를 가지고 있습니다.
\94\84ë¡\9cê·¸ë\9e¨ì\97\90ì\84\9c í\8c\8cì\9d¼ì\9d\84 í\8e¸ì§\91í\95  경우, 새로 저장한 파일에 일부 부가 정보가 빠질 수 있습니다.',
+'metadata-help' => '이 파일은 카메라나 스캐너가 파일을 만들거나 디지털화하는 데 사용하기위해 기록한 부가 정보를 포함하고 있습니다.
\94\84ë¡\9cê·¸ë\9e¨ì\97\90ì\84\9c í\8c\8cì\9d¼ì\9d\84 í\8e¸ì§\91í\95\9c 경우, 새로 저장한 파일에 일부 부가 정보가 빠질 수 있습니다.',
 'metadata-expand' => '자세한 정보 보이기',
 'metadata-collapse' => '자세한 정보 숨기기',
 'metadata-fields' => '파일 메타데이터 표가 접혀 있을 때, 이 메시지에 올라와 있는 다음 속성값만이 기본적으로 보이게 됩니다.
@@ -4063,7 +4071,9 @@ $5
 '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]'''(미디어위키)를 기반으로 작동합니다. Copyright © 2001-$1 $2.",
 'version-poweredby-others' => '그 외 다른 개발자',
@@ -4285,6 +4295,7 @@ $5
 'api-error-overwrite' => '이미 있는 파일을 덮어쓸 수 없습니다.',
 'api-error-stashfailed' => '내부 오류: 서버가 임시 파일을 저장하지 못했습니다.',
 'api-error-publishfailed' => '내부 오류: 서버가 임시 파일을 게시하지 못했습니다.',
+'api-error-stasherror' => '파일을 안전한 곳으로 업로드 하는 동안 오류가 발생했습니다.',
 'api-error-timeout' => '서버가 제 시간 내에 응답하지 않았습니다.',
 'api-error-unclassified' => '알 수 없는 오류가 발생했습니다.',
 'api-error-unknown-code' => '알 수 없는 오류: "$1"',
@@ -4341,4 +4352,6 @@ $5
 'expand_templates_generate_rawhtml' => '원본 HTML 보이기',
 'expand_templates_preview' => '미리 보기',
 
+# Unknown messages
+'uploadinvalidxml' => '업로드된 파일의 XML의 구문을 분석할 수 없습니다.',
 );
index 05bb1b9..4fc4d21 100644 (file)
@@ -117,14 +117,13 @@ $messages = array(
 'tog-hidepatrolled' => 'Джангы тюрлениулени тизмесинде тинтилген тюрлениулени кёргюзме',
 'tog-newpageshidepatrolled' => 'Джангы бетлени тизмесинде тинтилген бетлени кёргюзме',
 'tog-extendwatchlist' => 'Кёзде тургъан тизмени, къуру ахыр тюл, бютеу тюрлениулени кёрюр ючюн кенгерт',
-'tog-usenewrc' => 'Ахыр тюрлениуледе эм кёздеги тизмеде бетлени къауум тюрлениулери (JavaScript керекди)',
+'tog-usenewrc' => 'Ахыр тюрлениуледе эм кёздеги тизмеде бетлени тюрлениулерин къауумлашдыр',
 'tog-numberheadings' => 'Башлыкъланы (бёлюмлени атлары) автомат номерленсинле',
-'tog-showtoolbar' => 'Тюрлендирген сагъатда, башындагъы адыр панелни кёргюз (JavaScript)',
-'tog-editondblclick' => 'Эки басыу бла тюрлендириу бет ачылсын (JavaScript)',
-'tog-editsection' => 'Хар бёлюмге «тюрлендир» джибериуню кёргюз',
-'tog-editsectiononrightclick' => 'Бёлюмлени бёлюм башлыкъгъа басханлай тюрлендириу бетин ач',
+'tog-showtoolbar' => 'Тюрлендириу адыр панелни кёргюз',
+'tog-editondblclick' => 'Эки басыу бла бетлени тюрлендир',
+'tog-editsectiononrightclick' => 'Бёлюмлени бёлюм башлыкъгъа басханлай тюрлендир',
 'tog-showtoc' => 'Башларын кёргюз (3-ден кёб бёлюм башлыгъы болгъан бетлеге)',
-'tog-rememberpassword' => 'Ð\91Ñ\83 ÐºÐ¾Ð¼Ð¿Ñ\8cÑ\8eÑ\82еÑ\80де Ð¼ÐµÐ½Ð¸ Ñ\82еÑ\80геÑ\9e Ð´Ð¶Ð°Ð·Ñ\8bÑ\9eÑ\83мÑ\83 Ñ\81акÑ\8aла (Ñ\8dм ÐºÑ\91б $1 {{PLURAL:$1|1=кюн|кюн}})',
+'tog-rememberpassword' => 'Ð\91Ñ\83 Ð±Ñ\80аÑ\83зеÑ\80де Ð¼ÐµÐ½Ð¸ Ñ\82еÑ\80геÑ\9e Ð´Ð¶Ð°Ð·Ñ\8bÑ\9eÑ\83мÑ\83 Ñ\81акÑ\8aла (Ñ\8dм ÐºÑ\91б: $1 {{PLURAL:$1|биÑ\80 кюн|кюн}})',
 'tog-watchcreations' => 'Мен къурагъан (башлагъан) бетлени эм мен джюклеген файлланы кёзюмде тургъан тизмеме къош',
 'tog-watchdefault' => 'Мен тюрлендирген бетлени эм файлланы кёзюмде тургъан тизмеме къош',
 'tog-watchmoves' => 'Мен атларын ауушдургъан бетлени эм файлланы кёзюмде тургъан тизмеме къош',
@@ -152,6 +151,7 @@ $messages = array(
 'tog-showhiddencats' => 'Джашыртын категорияланы кёргюз',
 'tog-norollbackdiff' => 'Къайтарыудан сора версияланы башхалыкъларын кёргюзме',
 'tog-useeditwarning' => 'Тюрлендириулени сакълатмай редакторлау бетден кетген сагъатымда билдир',
+'tog-prefershttps' => 'Системагъа киргенден сора джакъланнган байламны хаманда хайырландыр',
 
 'underline-always' => 'Хаманда',
 'underline-never' => 'Бир заманда да',
@@ -229,18 +229,18 @@ $messages = array(
 'december-date' => '$1 декабрь',
 
 # Categories related messages
-'pagecategories' => '{{PLURAL:$1|1=Категория|Категорияла}}',
+'pagecategories' => '{{PLURAL:$1|Категория|Категорияла}}',
 'category_header' => '«$1» категориядагъы бетле',
 'subcategories' => 'Тюбкатегорияла',
 'category-media-header' => '«$1» категориядагъы файлла',
 'category-empty' => "''Бу категория бусагъатда бошду.''",
-'hidden-categories' => '{{PLURAL:$1|1=Джашырылгъан категория|Джашырылгъан категорияла}}',
+'hidden-categories' => '{{PLURAL:$1|Джашырылгъан категория|Джашырылгъан категорияла}}',
 'hidden-category-category' => 'Джашыртын категорияла',
-'category-subcat-count' => '{{PLURAL:$2|1=Бу категориягъа къуру баргъан тюбкатегория киреди.|$2 тюбкатегориядан $1 киреди бу категориягъа.}}',
-'category-subcat-count-limited' => 'Бу категорияда {{PLURAL:$1|$1 тюбкатегория}} барды.',
-'category-article-count' => '{{PLURAL:$2|1=Бу категорияда къуру бир бет барды.|Бу категориядагъы $2 бетден $1 кёргюзюлгенди.}}',
+'category-subcat-count' => '{{PLURAL:$2|Бу категориягъа къуру баргъан тюбкатегория киреди.|$2 тюбкатегориядан $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|Бу категорияда къуру бир файл барды.|Категориядагъы $2 файлдан {{PLURAL:$1|$1 файлы кёргюзюлгенди}}.}}',
+'category-file-count' => '{{PLURAL:$2|Бу категорияда къуру бир файл барды.|Категориядагъы $2 файлдан {{PLURAL:$1|бир файл|$1 файлы}} кёргюзюлгенди.}}',
 'category-file-count-limited' => 'Бу категория да {{PLURAL:$1|$1 файл}} барды.',
 'listingcontinuesabbrev' => '(баргъаны)',
 'index-category' => 'Индексленнген бетле',
@@ -307,8 +307,9 @@ $messages = array(
 'create-this-page' => 'Бу бетни къура',
 'delete' => 'Кетер',
 'deletethispage' => 'Бу бетни кетер',
-'undelete_short' => '$1 {{PLURAL:$1|тюрлендириуню}} къайтар',
-'viewdeleted_short' => '{{PLURAL:$1|1=1|$1}} кетерилген тюрлендириуге къарау',
+'undeletethispage' => 'Бу бетни ызына сал',
+'undelete_short' => '{{PLURAL:$1|Бир тюрлендириуню$1 тюрлендириуню}} ызына сал',
+'viewdeleted_short' => '{{PLURAL:$1|Бир кетерилген тюрлендириуню|$1 кетерилген тюрлендириуню}} кёрюу',
 'protect' => 'Джакъла',
 'protect_change' => 'тюрлендир',
 'protectthispage' => 'Бу бетни джакъла',
@@ -336,7 +337,7 @@ $messages = array(
 'redirectedfrom' => '(«$1» бетден джиберилгенди)',
 'redirectpagesub' => 'Башха бетге джибериучю бет',
 'lastmodifiedat' => 'Бу бетни ахыр тюрленнгени: $2, $1.',
-'viewcount' => 'Бу бетге {{PLURAL:$1|1=1|$1}} кере киргендиле.',
+'viewcount' => 'Бу бетге {{PLURAL:$1|бир|$1}} кере киргендиле.',
 'protectedpage' => 'Джакъланнган бет',
 'jumpto' => 'Бери кёчерге:',
 'jumptonavigation' => 'навигация',
@@ -521,14 +522,14 @@ $2',
 'yourpasswordagain' => 'Паролну джангыдан джаз:',
 'createacct-yourpasswordagain' => 'Паролну бегит',
 'createacct-yourpasswordagain-ph' => 'Паролну энтда бир кере джаз',
-'remembermypassword' => 'Ð\91Ñ\83 ÐºÐ¾Ð¼Ð¿Ñ\8cÑ\8eÑ\82еÑ\80де Ð¼ÐµÐ½Ð¸ Ñ\82еÑ\80геÑ\9e Ð´Ð¶Ð°Ð·Ñ\8bÑ\9eÑ\83мÑ\83 Ñ\83нÑ\83Ñ\82ма (Ñ\8dм ÐºÑ\91б $1 {{PLURAL:$1|1=кюн|кюн}})',
+'remembermypassword' => 'Ð\91Ñ\83 ÐºÐ¾Ð¼Ð¿Ñ\8cÑ\8eÑ\82еÑ\80де Ð¼ÐµÐ½Ð¸ Ñ\82еÑ\80геÑ\9e Ð´Ð¶Ð°Ð·Ñ\8bÑ\9eÑ\83мÑ\83 Ñ\81акÑ\8aлаб Ñ\82Ñ\83Ñ\80 (Ñ\8dм ÐºÑ\91б: $1 {{PLURAL:$1|биÑ\80 кюн|кюн}})',
 'userlogin-remembermypassword' => 'Системада туруу',
 'userlogin-signwithsecure' => 'Джакъланнган байлам',
 'yourdomainname' => 'Сизни доменигиз:',
 'password-change-forbidden' => 'Бу викиде паролугъузну тюрлендиреллик тюлсюз.',
 'externaldberror' => 'Тыш информация базаны болушлугъу бла аутентификация, халатлы болду, неда тыш аккаунтугъузну тюрлендирирге хакъларагъыз джетмейди.',
-'login' => 'Ð\9aириу',
-'nav-login-createaccount' => 'Ð\9aиÑ\80иÑ\83 / Ñ\80егиÑ\81Ñ\82Ñ\80аÑ\86иÑ\8f Ñ\8dÑ\82иу',
+'login' => 'СиÑ\81Ñ\82емагÑ\8aа Ðºириу',
+'nav-login-createaccount' => 'СиÑ\81Ñ\82емагÑ\8aа ÐºÐ¸Ñ\80иÑ\83 / Ð\90ккаÑ\83нÑ\82 ÐºÑ\8aÑ\83Ñ\80ау',
 'loginprompt' => '{{SITENAME}} сайтха кирир ючюн «cookies» эркин этерге керексиз.',
 'userlogin' => 'Кир / регистрация эт',
 'userloginnocreate' => 'Кириу',
@@ -541,7 +542,7 @@ $2',
 'nologinlink' => 'Тергеу джазыу (аккаунт) къурагъыз',
 'createaccount' => 'Аккаунт къурау',
 'gotaccount' => 'Тергеу джазыуугъуз (аккаунтугъуз) энди бармыды? $1.',
-'gotaccountlink' => 'Ð\9aиÑ\80иÑ\83',
+'gotaccountlink' => 'СиÑ\81Ñ\82емагÑ\8aа ÐºÐ¸Ñ\80',
 'userlogin-resetlink' => 'Кирир ючюн билгилеригизни унутхан этгенмисиз?',
 'userlogin-resetpassword-link' => 'Паролну джибериу',
 'helplogin-url' => 'Help:Кириу',
@@ -565,7 +566,7 @@ $2',
 'badretype' => 'Джазгъан паролларыгъыз бир-бирине келишмейдиле.',
 'userexists' => 'Джазылгъан ат хайырландырылады.
 Башха ат сайлагъыз.',
-'loginerror' => 'Кириу хата',
+'loginerror' => 'Кириуде халат',
 'createacct-error' => 'Тергеу джазыу къурауда халат',
 'createaccounterror' => 'Быллай тергеу джазыу (аккаунт) къураргъа болмайды: $1',
 'nocookiesnew' => 'Къошлуучу регистрацияны ётгенди, алай кирмегенди. {{SITENAME}} къошулуучуланы таныр ючюн «cookies»-ни хайырландырады. Сиз «cookies»-ни эркин этмегенсиз. «Cookies»-ни эркин этигиза да, андан сора джангы атыгъыз эм паролюгъуз бла киригиз.',
@@ -586,7 +587,7 @@ $2',
 'passwordtooshort' => '$1 {{PLURAL:$1|символдан}} аз болмазгъа керекди пароль.',
 'password-name-match' => 'Пароль къошулуучу атдан башха тюрлю болургъа керекди.',
 'password-login-forbidden' => 'Бу къошулуучу ат бла паролну хайырландыргъан джарамайды.',
-'mailmypassword' => 'Ð\9cеннге e-mail Ð±Ð»Ð° Ð´Ð¶Ð°Ð½Ð³Ñ\8b Ð¿Ð°Ñ\80олÑ\8c джибер',
+'mailmypassword' => 'Ð\9fаÑ\80олнÑ\83 джибер',
 'passwordremindertitle' => '{{SITENAME}}  къошулуучугъа джангы болджаллы пароль',
 'passwordremindertext' => 'Ким эседа (сиз болургъа боллукъсуз, IP-адрес: $1) {{SITENAME}} ($4) къошулуучугъа джангы пароль къураргъа соргъанды. $2 къошулуучугъа джангы пароль: $3. Сорууну джиберген сиз болгъан эсегиз, системагъа кирирге эм паролну алышдырыргъа тыйычлыды. Джангы паролну $5 {{PLURAL:$5|кюнню}} ичинде амалы боллукъду.
 
@@ -748,7 +749,7 @@ $2',
 'nosuchsectiontext' => 'Сиз болмагъан бетни тюрлендирирге кюрешесиз.
 Бу бетге къарагъан заманыгъызда, кетерилирге неда башха джерге кёчюрюлюрге боллукъду.',
 'loginreqtitle' => 'Кирирге керекди',
-'loginreqlink' => 'Ð\9aириу',
+'loginreqlink' => 'кириу',
 'loginreqpagetext' => 'Сиз башха бетлеге къарар ючюн $1 керексиз.',
 'accmailtitle' => 'Пароль джиберилди',
 'accmailtext' => "[[User talk:$1|$1]] къошулуучугъа къуралгъан пароль $2 адресине джиберилгенди.
@@ -834,12 +835,12 @@ $2',
 'cascadeprotectedwarning' => "'''Эсгертиу:''' Бу бетни къуру Администраторла къауумдагъы къошулуучула тюрлендирирге боллукъду. Каскад джакълау {{PLURAL:$1|1=бетде|бетде}} хайырланнганы себебли:",
 'titleprotectedwarning' => "'''Эсгертиу: Бу бет джакъланыбды. Джангыз [[Special:ListGroupRights|энчи хакълары]] болгъанла текстни салыргъа боллукъдула.'''
 Тюбюнде, билги ючюн журналдан ахыр джазыу берилгенди:",
-'templatesused' => 'Бу бетде хайырланылгъан {{PLURAL:$1|1=шаблон|шаблонла}}:',
+'templatesused' => 'Бу бетде хайырланылгъан {{PLURAL:$1|шаблон|шаблонла}}:',
 'templatesusedpreview' => 'Ал къаралыучу бетде хайырланнган {{PLURAL:$1|1=шаблон|шаблонла}}:',
 'templatesusedsection' => 'Бу бетде хайырланнган {{PLURAL:$1|1=шаблон|шаблонла}}:',
 'template-protected' => '(джакъланнган)',
 'template-semiprotected' => '(джарты джакъланыбды)',
-'hiddencategories' => 'Бу бет $1 {{PLURAL:$1|1=1 джашырылыннган категориягъа|$1 джашырылыннган категориялагъа}} киреди:',
+'hiddencategories' => 'Бу бет $1 {{PLURAL:$1|1 джашырылгъан категориягъа|$1 джашырылгъан категориягъа}} киреди:',
 'edittools' => '<!-- Былайда орналгъан текст тюрлениу эмда джюклениу формада кёрюннюкдю. -->',
 'nocreatetext' => 'Бу сайтда джангы бет къуралыу тыйылгъанды.
 Ызына къайтыб болгъан бетни тюрлендирирге боллукъсуз, [[Special:UserLogin|системагъа кесигизни танытыргъа неда джангы тергеу джазыу (аккаунт) къураргъа]].',
@@ -930,8 +931,8 @@ $3 джанындан берилген сылтау: ''$2''",
 'histlegend' => "Ангылатыула: '''({{int:cur}})''' — бусагъатдагъы версиядан башхалыгъы, '''({{int:last}})''' — алдагъы версиядан башхалыгъы; '''({{int:last}})''' — гитче тюрлениу",
 'history-fieldset-title' => 'Тарихине къара',
 'history-show-deleted' => 'Къуру кетерилгенле',
-'histfirst' => 'Эм эски',
-'histlast' => 'Эм джангы',
+'histfirst' => 'эм эскиле',
+'histlast' => 'эм джангыла',
 'historysize' => '($1 {{PLURAL:$1|1=байт|байт}})',
 'historyempty' => '(бош)',
 
@@ -1078,7 +1079,7 @@ $1",
 'compareselectedversions' => 'Сайланнган версияланы тенглешдириу',
 'showhideselectedversions' => 'Сайланнган версияланы кёргюз/джашыр',
 'editundo' => 'ызына алыу',
-'diff-multi' => '({{PLURAL:$2|1=Бир къошулуучу|$2 къошулуучу}} этген {{PLURAL:$1|1=$1 аралыкъ тюрлениу|$1 аралыкъ тюрлениу}} кёргюзюлмегенди)',
+'diff-multi' => '({{PLURAL:$2|Бир къошулуучу|$2 къошулуучу}} этген {{PLURAL:$1|Бир аралыкъ тюрлениу|$1 аралыкъ тюрлениу}} кёргюзюлмегенди)',
 'diff-multi-manyusers' => '($2 къошулуучудан кёб {{PLURAL:$2|1=Бир къошулуучу|къошулуучу}} этген {{PLURAL:$1|1=бир аралыкъ тюрлениу|$1 аралыкъ тюрлениу}} кёргюзюлмегенди)',
 'difference-missing-revision' => 'Бу тенглешдириу ($1) ючюн {{PLURAL:$2|1=$2 версия}} {{PLURAL:$2|табылмады}}.
 
@@ -1408,7 +1409,7 @@ $1 {{PLURAL:$1|1=символдан|символладан}} кеб болург
 'action-sendemail' => 'E-mail джибериу',
 
 # Recent changes
-'nchanges' => '$1 {{PLURAL:$1|1=тюрлениу|тюрлениу}}',
+'nchanges' => '$1 {{PLURAL:$1|тюрлениу|тюрлениу}}',
 'recentchanges' => 'Ахыр тюрлениуле',
 'recentchanges-legend' => 'Ахыр тюрлениулени джарашдырыулары',
 'recentchanges-summary' => 'Тюбюнде, Википедияда этилген ахыр тюрлениуле хронология бла тизилиб турадыла.',
@@ -1417,12 +1418,13 @@ $1 {{PLURAL:$1|1=символдан|символладан}} кеб болург
 'recentchanges-label-minor' => 'Бу гитче тюрлениудю',
 'recentchanges-label-bot' => 'Бу тюрлендириуню бот этгенди',
 'recentchanges-label-unpatrolled' => 'Бу тюрлендириу алкъын патруль этилинмегенди',
-'recentchanges-legend-newpage' => '$1 — джангы бет',
+'recentchanges-label-plusminus' => 'Бетни ёлчеми быллай бир байтха тюрленнгенди',
+'recentchanges-legend-newpage' => '(къарагъыз: [[Special:NewPages|джангы бетлени тизмеси]])',
 'rcnotefrom' => 'Тюбюрекде <strong>$2</strong> башлаб (<strong>$1</strong> дери) тюрлендириуле кёрюнедиле',
 'rclistfrom' => '$1 башлаб джангы тюрлениулени кёргюз',
 'rcshowhideminor' => 'гитче тюрлендириулени $1',
 'rcshowhidebots' => 'ботланы $1',
-'rcshowhideliu' => 'кирген къошулуучуланы $1',
+'rcshowhideliu' => '$1 системагъа кирген къошулуучу',
 'rcshowhideanons' => 'анонимлени $1',
 'rcshowhidepatr' => '$1 патруль этилиннген тюрлендириуле',
 'rcshowhidemine' => 'кесими тюрлендириулерими $1',
@@ -1440,14 +1442,14 @@ $1 {{PLURAL:$1|1=символдан|символладан}} кеб болург
 'rc-change-size' => '$1',
 'rc-change-size-new' => 'Тюрлениуден сора ёлчеми: $1 {{PLURAL:$1|байт}}',
 'newsectionsummary' => '/* $1 */ Джангы бёлюм',
-'rc-enhanced-expand' => 'Ð\9aÑ\8aоÑ\88акÑ\8aланÑ\8b ÐºÑ\91Ñ\80гÑ\8eз (JavaScript Ñ\85айÑ\8bÑ\80ланадÑ\8b)',
+'rc-enhanced-expand' => 'ТолÑ\83Ñ\81Ñ\83 Ð±Ð»Ð° ÐºÑ\91Ñ\80гÑ\8eз',
 'rc-enhanced-hide' => 'Къошакъланы джашыр',
 'rc-old-title' => 'биринчи «$1» деб къуралгъан',
 
 # Recent changes linked
 'recentchangeslinked' => 'Байламлы тюрлениуле',
-'recentchangeslinked-feed' => 'Ð\91айламлÑ\8b Ñ\82Ñ\8eÑ\80лендиÑ\80иÑ\83ле',
-'recentchangeslinked-toolbox' => 'Байламлы тюрлендириуле',
+'recentchangeslinked-feed' => 'Байламлы тюрлениуле',
+'recentchangeslinked-toolbox' => 'Байлам тюрлениуле',
 'recentchangeslinked-title' => '$1 бет бла байламлы тюрлендириуле',
 'recentchangeslinked-summary' => "Белгиленнген бет (неда белгиленнген категориягъа киргенле) джиберген бетледе джангы тюрлениулени тизмеси.
 [[Special:Watchlist|Кёзде тургъан тизмеге]] кирген бетле '''чертилибдиле'''.",
@@ -1821,7 +1823,7 @@ URL-ни тюз , сайтны ачыкъ болгъанына ишексиз б
 'nbytes' => '$1 {{PLURAL:$1|байт|байт}}',
 'ncategories' => '$1 {{PLURAL:$1|1=категория|категорияла}}',
 'nlinks' => '$1 {{PLURAL:$1|1=джибериу|джибериу}}',
-'nmembers' => '$1 {{PLURAL:$1|объект}}',
+'nmembers' => '$1 {{PLURAL:$1|объект|объект}}',
 'nrevisions' => '$1 {{PLURAL:$1|1=версия|версия}}',
 'nviews' => '$1 {{PLURAL:$1|1=къарау|къарау}}',
 'nimagelinks' => '$1 {{PLURAL:$1|1=бетде|бетде}} хайырланады',
@@ -1875,8 +1877,8 @@ URL-ни тюз , сайтны ачыкъ болгъанына ишексиз б
 'notargettext' => 'Бу функцияны ишлетир ючюн нюзюр бетни неда къошулуучуну белгилемегенсиз.',
 'nopagetitle' => 'Быллай нюзюр бет джокъду',
 'nopagetext' => 'Белгиленнген нюзюр бет джокъду.',
-'pager-newer-n' => '{{PLURAL:$1|1=1 джангыракъ|$1 джангыракъ}}',
-'pager-older-n' => '{{PLURAL:$1|1=1 эскирек|$1 эскирек}}',
+'pager-newer-n' => '{{PLURAL:$1|1 джангыракъ|$1 джангыракъ}}',
+'pager-older-n' => '{{PLURAL:$1|1 эскирек|$1 эскирек}}',
 'suppress' => 'Джашырыу',
 
 # Book sources
@@ -2013,7 +2015,7 @@ URL-ни тюз , сайтны ачыкъ болгъанына ишексиз б
 'usermessage-editor' => 'Система билдириучю',
 
 # Watchlist
-'watchlist' => 'Кёзюмде тургъан тизмем',
+'watchlist' => 'Кёздеги тизме',
 'mywatchlist' => 'Кёздеги тизме',
 'watchlistfor2' => '$1 ючюн $2',
 'nowatchlist' => 'Кёзюгюзде тургъан тизмегиз бошду.',
@@ -2031,7 +2033,7 @@ URL-ни тюз , сайтны ачыкъ болгъанына ишексиз б
 'unwatchthispage' => 'Кёзде тутууну тохтат',
 'notanarticle' => 'Статья тюлдю',
 'notvisiblerev' => 'Версия кетерилгенди',
-'watchlist-details' => 'Кёзюгюзде тургъан тизмегизде, сюзюу бетлери саналмай {{PLURAL:$1|1=$1 бет|$1 бет}} барды.',
+'watchlist-details' => 'Кёздеги тизмегизде сюзюу бетлери саналмай {{PLURAL:$1|бет|бет}} барды.',
 'wlheader-enotif' => 'Эл. почта бла хапар бериу джандырылыбды.',
 'wlheader-showupdated' => "Ахыр кириуюгюзден сора бетни тюрлениулери '''къалын''' джазыу бла кёргюзюлгенди.",
 'watchmethod-recent' => 'кёзде тургъан бетледе этилген ахыр тюрлениуле кёрюу',
@@ -2254,12 +2256,12 @@ $1',
 'blanknamespace' => '(Баш)',
 
 # Contributions
-'contributions' => 'Къошулуучуну къошханы',
+'contributions' => '{{GENDER:$1|Къошулуучуну}} къошуму',
 'contributions-title' => '$1 къошулуучуну къошагъы',
 'mycontris' => 'Къошум',
-'contribsub2' => '$1 ($2) къошакъ',
+'contribsub2' => '{{GENDER:$3|$1}} къошуму ($2)',
 'nocontribs' => 'Бу критерийлеге келишген тюрлениуле табылмадыла',
-'uctop' => '(аÑ\85Ñ\8bÑ\80гъы)',
+'uctop' => '(бÑ\83Ñ\81агÑ\8aаÑ\82дагъы)',
 'month' => 'Айдан башлаб (эм алгъаракъ):',
 'year' => 'Джылдан башлаб (эм алгъаракъ):',
 
@@ -2281,7 +2283,7 @@ $1',
 'sp-contributions-submit' => 'Таб',
 
 # What links here
-'whatlinkshere' => 'Былайгъа джибериуле',
+'whatlinkshere' => 'Бетге джибериуле',
 'whatlinkshere-title' => '«$1» бетге джиберген бетле',
 'whatlinkshere-page' => 'Бет:',
 'linkshere' => "'''[[:$1]]''' битге джиберген бетле:",
@@ -2290,8 +2292,8 @@ $1',
 'isredirect' => 'джибериу бет',
 'istemplate' => 'къошуу',
 'isimage' => 'файлгъа джибериу',
-'whatlinkshere-prev' => '{{PLURAL:$1|1=алдагъы|алдагъы $1}}',
-'whatlinkshere-next' => '{{PLURAL:$1|1=эндиги|эндиги $1}}',
+'whatlinkshere-prev' => '{{PLURAL:$1|алдагъы|алдагъы $1}}',
+'whatlinkshere-next' => '{{PLURAL:$1|эндиги|эндиги $1}}',
 'whatlinkshere-links' => '← джибериуле',
 'whatlinkshere-hideredirs' => 'джибериуле $1',
 'whatlinkshere-hidetrans' => 'Къошулуулары $1',
@@ -2782,7 +2784,7 @@ $1',
 'file-info-size' => '$1 × $2 пиксель, файлны ёлчеми: $3, MIME типи: $4',
 'file-nohires' => 'Мындан ары ачыкъланнган версиясы джокъду',
 'svg-long-desc' => 'SVG файл, шартлы $1 × $2 пиксель, файлны ёлчеми: $3',
-'show-big-image' => 'ТолÑ\83 Ð°Ñ\87Ñ\8bкÑ\8aлаÑ\83',
+'show-big-image' => 'ЧÑ\8bкÑ\8aгÑ\8aан Ñ\84айл',
 'show-big-image-preview' => 'Ал къарауда уллулугъу: $1.',
 'show-big-image-size' => '$1 × $2 пиксель',
 'file-info-gif-looped' => 'тогъайланнганды',
@@ -3441,7 +3443,7 @@ $5
 # Special:Version
 'version' => 'Версия',
 'version-extensions' => 'Салыннган кенгертиуле',
-'version-specialpages' => 'Къуллукъчу бетле',
+'version-specialpages' => 'Къуллукъ бетле',
 'version-parserhooks' => 'Синтаксис анализаторну тутуучула',
 'version-variables' => 'Тюрленнгенле',
 'version-antispam' => 'Антиспам',
@@ -3481,7 +3483,7 @@ MediaWiki хайырлы боллукъду деген умут бла джай
 'fileduplicatesearch-noresults' => '«$1» деген файл табылмады.',
 
 # Special:SpecialPages
-'specialpages' => 'Къуллукъчу бетле',
+'specialpages' => 'Къуллукъ бетле',
 'specialpages-note' => '* Тюз къуллукъчу бетле.
 * <span class="mw-specialpagerestricted">Кирирге эркинлик чекленнген къуллукъчу бетле.</span>
 * <span class="mw-specialpagecached">Кэш этилген къуллукъчу бетле (эски болургъа боллукъдула).</span>',
index 99b17cc..e5c476a 100644 (file)
@@ -222,7 +222,6 @@ $messages = array(
 'tog-numberheadings' => 'Dun de Üvverschrefte automatisch nummereere',
 'tog-showtoolbar' => 'De Wärkzüchleß zom Ändere aanzeije',
 'tog-editondblclick' => 'Sigge met Dubbel-Klicke ändere',
-'tog-editsection' => 'Maach [{{int:Editsection}}]-Links aan de Avschnedde dran',
 'tog-editsectiononrightclick' => 'Afschnedde met Räächs-Klecke op de Üvverschrefte ändere',
 'tog-showtoc' => 'Zeich en Enhaldsüvversich bei Sigge met mieh wie drei Üvverschrefte dren',
 'tog-rememberpassword' => 'Op Duur enlogge op dämm Kompjuter un för dää Brauser (hält {{PLURAL:$1|för eine Daach|bes op $1 Dääsch|bloß för hück}})',
index 1f929a0..f4bfdec 100644 (file)
@@ -189,10 +189,9 @@ $messages = array(
 'tog-newpageshidepatrolled' => 'Esconder las hojas surveyadas de la lista de las hojas muevas',
 'tog-extendwatchlist' => 'Anchar mi lista de akavidamiento afín de àmostrar todos los trocamientos, no sólo los muevos',
 'tog-usenewrc' => 'Agrupar kambios por pajinas en kambios resiente y lista',
-'tog-numberheadings' => 'Numerotar otomatika mente los títůlos de los kapítůlos',
-'tog-showtoolbar' => 'Àmostrar el chibuk de aparatos',
-'tog-editondblclick' => 'Trocar las pajinas con doble klik',
-'tog-editsection' => 'Ofrir la possibilidad de trocar los kapítůlos con el atamiento [trocar]',
+'tog-numberheadings' => 'Numerotar otomatika mente los títolos de los kapítolos',
+'tog-showtoolbar' => 'Amostrar el chibuk de aparatos',
+'tog-editondblclick' => 'Trocar las hojas con doble klik',
 'tog-editsectiononrightclick' => 'Pueder trocar los kapítůlos, en pizando el botón derecho del ratón encima el títůlo',
 'tog-showtoc' => 'Àmostrar el cuadro de contènidos (para las hojas que tienen más de 3 títůlos de capítůlo)',
 'tog-rememberpassword' => 'Acordarse de mi entrada en este navigador (a lo más muńcho $1 {{PLURAL:$1|día|días}})',
@@ -252,17 +251,17 @@ $messages = array(
 'fri' => 'Vie',
 'sat' => 'Shab',
 'january' => 'Jenero',
-'february' => 'Hevrero',
+'february' => 'Febrero',
 'march' => 'Março',
-'april' => 'Avril',
+'april' => 'Abril',
 'may_long' => 'Mayo',
 'june' => 'Juño',
-'july' => 'Jullo',
+'july' => 'Julio',
 'august' => 'Agosto',
 'september' => 'Setiembre',
-'october' => 'Ochòvre',
+'october' => 'Ochobre',
 'november' => 'Noviembre',
-'december' => 'Deziembre',
+'december' => 'Diziembre',
 'january-gen' => 'Jenero',
 'february-gen' => 'Hevrero',
 'march-gen' => 'Março',
@@ -301,12 +300,12 @@ $messages = array(
 'december-date' => 'Disiembre $1',
 
 # Categories related messages
-'pagecategories' => '{{PLURAL:$1|Kateggoría|Kateggorías}}',
-'category_header' => 'Artíkolos en la kateggoría "$1"',
-'subcategories' => 'Sòkategoriyas',
-'category-media-header' => 'Arxivos de multimedya en la kateggoría "$1"',
-'category-empty' => "''Esta katēggoría oy día, no contiene ni artícůlos ni arxivos de multimedya''",
-'hidden-categories' => '{{PLURAL:$1|Kateggoría escondida|Kateggorías escondidas}}',
+'pagecategories' => '{{PLURAL:$1|Kategoría|Kategorías}}',
+'category_header' => 'Artíkolos en la kategoría "$1"',
+'subcategories' => 'Sòkategorías',
+'category-media-header' => 'Dosyas de multimedya en la kategoría "$1"',
+'category-empty' => "''Esta kategoría oy día, no contiene ni hojas ni dosyas de multimedya''",
+'hidden-categories' => '{{PLURAL:$1|Kategoría escondida|Kategorías escondidas}}',
 'hidden-category-category' => 'Katēggorías escondidas',
 'category-subcat-count' => '{{PLURAL:$2|Esta katēggoría contiene sólo una baxo-katēggoría:|Esta katēggoría contiene {{PLURAL:$1|esta baxo-katēggoría aquí abaxo|$1 baxo-katēggorías aquí abaxo}}, de un total de $2 baxo-katēggorías:}}',
 'category-subcat-count-limited' => 'Esta katēggoría contiene {{PLURAL:$1|la baxo-katēggoría venidera|$1 baxo-katēggorías venideras}}.',
@@ -325,7 +324,7 @@ $messages = array(
 'cancel' => 'Anular',
 'moredotdotdot' => 'Mas...',
 'morenotlisted' => 'Esta lista no esta kompleta',
-'mypage' => 'Pajina',
+'mypage' => 'Hoja',
 'mytalk' => 'Mi diskusyon',
 'anontalk' => 'Diskusyón para este adresso de IP',
 'navigation' => 'Navigación',
@@ -344,11 +343,11 @@ $messages = array(
 'vector-action-addsection' => 'Ajustar sujeto',
 'vector-action-delete' => 'Efassar',
 'vector-action-move' => 'Taşirear',
-'vector-action-protect' => 'Guardar',
+'vector-action-protect' => 'Guadrar',
 'vector-action-undelete' => 'Traer atrás',
-'vector-action-unprotect' => 'Kambiar proteksyon',
+'vector-action-unprotect' => 'Trocar proteksyon',
 'vector-simplesearch-preference' => 'Aktivar barra de buskida simplifikada (solamente kon aspekto Vector)',
-'vector-view-create' => 'Krear',
+'vector-view-create' => 'Criar',
 'vector-view-edit' => 'Trocar',
 'vector-view-history' => 'Ver la istoria',
 'vector-view-view' => 'Meldar',
@@ -362,27 +361,27 @@ $messages = array(
 'returnto' => 'Tornar a $1.',
 'tagline' => 'De {{SITENAME}}',
 'help' => 'Ayudo',
-'search' => 'Bushkar',
-'searchbutton' => 'Bushkar',
-'go' => 'Vate',
+'search' => 'Buxcar',
+'searchbutton' => 'Buxcar',
+'go' => 'Ir',
 'searcharticle' => 'Ir',
 'history' => 'La istoria de la hoja',
 'history_short' => 'Istoria',
 'updatedmarker' => 'trocado desde mi visita de alcavo',
-'printableversion' => 'Forma apropiada para imprimir',
+'printableversion' => 'La forma parâ imprimir',
 'permalink' => 'Atamiento permanente',
 'print' => 'Imprimir',
 'view' => 'Ver',
 'edit' => 'Trocar',
-'create' => 'Krear',
+'create' => 'Criar',
 'editthispage' => 'Trocar esta hoja',
-'create-this-page' => 'Crîar esta hoja',
+'create-this-page' => 'Criar esta hoja',
 'delete' => 'Efaçar',
 'deletethispage' => 'Efassar esta hoja',
 'undeletethispage' => 'Restorar esta pajina',
 'undelete_short' => 'Traer atrás $1 {{PLURAL:$1|trocamientos|trocamientos}}',
 'viewdeleted_short' => 'Ver {{PLURAL:$1|un trocamiento efassado|$1 trocamientos efassados}}',
-'protect' => 'Guardar',
+'protect' => 'Guadrar',
 'protect_change' => 'trocar el guardadijo',
 'protectthispage' => 'Guardar esta hoja',
 'unprotect' => 'Trocar guardadijo',
@@ -396,7 +395,7 @@ $messages = array(
 'articlepage' => 'Ver el artícůlo de contenido',
 'talk' => 'Diskusyón',
 'views' => 'Vistas',
-'toolbox' => 'Aparatos',
+'toolbox' => 'Aparates',
 'userpage' => 'Ver la hoja del usador',
 'projectpage' => 'Ver la hoja del projeto',
 'imagepage' => 'Ver la hoja de la dosya',
@@ -408,12 +407,12 @@ $messages = array(
 'otherlanguages' => 'En otras linguas',
 'redirectedfrom' => '(Redirigido desde $1)',
 'redirectpagesub' => 'Hoja redirigida',
-'lastmodifiedat' => 'Esta hoja fue trocada por la dal cavo vez el $1, a las $2.',
-'viewcount' => 'Este pajina fue vijitado {{{{PLURAL:$1|una vez|$1 vezes}}.',
+'lastmodifiedat' => 'Esta hoja fue trocada por la vez dalcavo en el $1, a las $2.',
+'viewcount' => 'Este pajina fue vijitado {{PLURAL:$1|una vez|$1 vezes}}.',
 'protectedpage' => 'Hoja guardada',
 'jumpto' => 'Saltar a:',
 'jumptonavigation' => 'navigación',
-'jumptosearch' => 'Bushkar',
+'jumptosearch' => 'buxcar',
 'view-pool-error' => 'Diskulpe, los servidores estan sovrekargado en est momento.
 Ay demaziado usuarios estan aprovando a ver esta pajina.
 Aspera un momento antes de aprovar esta pajina de muevo.
@@ -430,8 +429,8 @@ $1',
 'copyrightpage' => '{{ns:project}}:Derechos de autor',
 'currentevents' => 'Novedades',
 'currentevents-url' => 'Project:Novedades',
-'disclaimers' => 'Refuso de responsabilitá',
-'disclaimerpage' => 'Project:Refuso de responsabilitá jeneral',
+'disclaimers' => 'Refuzo de responsabilitá',
+'disclaimerpage' => 'Project:Refuzo de responsabilitá jeneral',
 'edithelp' => '¿Cómo se la troca?',
 'helppage' => 'Help:Contènidos',
 'mainpage' => 'La Primera Hoja',
@@ -439,25 +438,25 @@ $1',
 'policy-url' => 'Project:Politikas',
 'portal' => 'Portal de la komunitá',
 'portal-url' => 'Project:Portal de la komunitá',
-'privacy' => 'Principio de particòlaridad',
-'privacypage' => 'Project:Principio de particòlaridad',
+'privacy' => 'Prencipio de partikolaridad',
+'privacypage' => 'Project:Prencipio de partikolaridad',
 
 'badaccess' => 'Yerro de permissión',
 'badaccess-group0' => 'No estas autorizado a egzekutir el aksyon que a demandado.',
-'badaccess-groups' => 'El aksyon ke a demandado esta limitado a los usuarios ke estan en {{{{PLURAL:$2|el grupo|uno de los grupos}}: $1',
+'badaccess-groups' => 'El aksyon ke a demandado esta limitado a los usuarios ke estan en {{PLURAL:$2|el grupo|uno de los grupos}}: $1',
 
 'versionrequired' => 'Se nesesite la versyon $1 de MediaWiki',
 'versionrequiredtext' => 'Se nesesita versyon $1 de MediaWiki para uzar este pajina. Ver [[Special:Version|La pajina de versyon]].',
 
 'ok' => 'DE ACORDDO',
-'retrievedfrom' => 'Acòjido del adhresso "$1"',
+'retrievedfrom' => 'Acòjido del adresso "$1"',
 'youhavenewmessages' => '{{PLURAL:$3|Tienes}} $1 ($2).',
 'youhavenewmessagesfromusers' => '{{PLURAL:$4|Tiene}} $1 de {{PLURAL:$3|otro usuario|$3 usuarios}}($2).',
 'youhavenewmessagesmanyusers' => 'Tiene $1 de munchos usuarios ($2).',
 'newmessageslinkplural' => '{{PLURAL:$1|un muevo mesaje|999=mesajes muevos}}',
 'newmessagesdifflinkplural' => '{{PLURAL:$1|ulitmo kambio|999=ultimos kambios}}',
 'youhavenewmessagesmulti' => 'Tienes messajes nuevos en $1',
-'editsection' => 'troca',
+'editsection' => 'trocar',
 'editold' => 'trocar',
 'viewsourceold' => 'Ver su manadero',
 'editlink' => 'trocar',
@@ -475,7 +474,7 @@ $1',
 'feed-invalid' => 'Tipo de kanal de subskripsyon es invalido.',
 'feed-unavailable' => 'Kanales de subskripsyon no estan disponibles',
 'site-rss-feed' => 'Fuente de RSS de $1',
-'site-atom-feed' => 'Alimentela de Atom de $1',
+'site-atom-feed' => 'Canal Atomo de $1',
 'page-rss-feed' => '"$1" Fuente RSS',
 'page-atom-feed' => '"$1" Subscripción Atom',
 'red-link-title' => '$1 (la hoja no egziste)',
@@ -483,73 +482,120 @@ $1',
 'sort-ascending' => 'Atakanar en orden asendente',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main' => 'Pajina',
-'nstab-user' => 'Pajina de usuario',
+'nstab-main' => 'Hoja',
+'nstab-user' => 'Hoja de kullaneador',
 'nstab-media' => 'Hoja de Meddia',
 'nstab-special' => 'Hoja especial',
 'nstab-project' => 'Hoja del proyecto',
-'nstab-image' => 'Archivo',
+'nstab-image' => 'Dosya',
 'nstab-mediawiki' => 'Messaj',
 'nstab-template' => 'Şablón',
 'nstab-help' => 'Ayudo',
-'nstab-category' => 'Kategoriya',
+'nstab-category' => 'Kategoría',
 
 # Main script and global functions
 'nosuchaction' => 'No egziste esa aksyon',
+'nosuchactiontext' => 'La aksyon espesefikada por el URL es invalido.
+Es posivle ke el URL fue eskrito mal, o ke segite un enlase inkorrecto.
+Tambiem puede indikar un yerro en la programa uzado por {{SITENAME}}.',
 'nosuchspecialpage' => 'No ay tala hoja especial',
+'nospecialpagetext' => '<strong>Demandaste una pajina espesial invalida.</strong>
+
+Puede topar una lista de pajinas espesiales validas en[[Special:SpecialPages|{{int:specialpages}}]].',
 
 # General errors
 'error' => 'Yerro',
 'databaseerror' => 'Yerro de la Databasa',
+'databaseerror-text' => 'Afito un yerro en la demanda del base de data.
+Esto puede indikar un yerro en la programa.',
+'databaseerror-textcl' => 'Afito un yerro en la demanda del base de data.',
 'databaseerror-query' => 'Demanda: $1',
 'databaseerror-function' => 'Fonksyon: $1',
 'databaseerror-error' => 'Yerro: $1',
-'missing-article' => 'La basa de dados no topó el teksto de la hoja llamada "$1" $2.
+'laggedslavemode' => "'''Aviso:''' Puede ke la pajina no kontiene las aktualizasyones mas resientes.",
+'readonly' => 'Base de datos blokeada',
+'enterlockreason' => 'Eskrive un razon por el blokeo,incluyendo un estimasyon de kuando libera el blokeo',
+'readonlytext' => 'La base de datos esta blokeada a muevas entradas i otras modifikasyones,probablemente para mantenemento rutinas, Kuando akava se enkontra dispozible.
+
+El administrador ke blokeo dio esta esplikasyon: $1',
+'missing-article' => 'La basa de dados no topó el teksto de una hoja llamada "$1" $2.
 
-En lo mas muncho, esto se cavsa de un "dif" anakróniko ou de un atamiento a la istoria de una hoja que se efaçó.
+En lo mas muncho esto passa por cavsa de un atamiento (link) istoriko a una hoja efaçada.
 
-Si esto no es el cavso, puede ser que topates una chincha en el lojikal.
-Si puede ser mete un [[Special:ListUsers/sysop|administrador]] en corriente y también anota la URL.',
+Si esto no es el cavso, puede ser que topates una chincha (un yerro) en el lojikal (la proǵrama).
+Alora, házemos el plazer de avisar un [[Special:ListUsers/sysop|administrador]] y también escrivirlo la URL (el adresso). Mercí muncho.',
 'missingarticle-rev' => '(nº. de revisión: $1)',
 'missingarticle-diff' => '(Dif.: $1, $2)',
+'readonly_lag' => 'La base de datos se a blokeado mientres los servidores se sinkronizan',
+'internalerror' => 'Yerro enterno',
+'internalerror_info' => 'Yerro enterno: $1',
+'fileappenderrorread' => 'No se pudo meldar "$1" durante enkashyon.',
+'fileappenderror' => 'No se pudo enkashar "$1" a "$2".',
 'filecopyerror' => 'No se pudo copiar el arxiv "$1" a "$2".',
+'filerenameerror' => 'No se pudo renombrar archivo "$1" a "$2".',
+'filedeleteerror' => 'No se pudo efasar archivo "$1".',
+'directorycreateerror' => 'No se pudo krear direktorio "$1".',
+'filenotfound' => 'No se pudo topar archivo "$1".',
+'fileexistserror' => 'No se pudo eskrivir al archivo "$1": Archivo ya egziste.',
+'unexpected' => 'Valor enasperado: "$1"="$2".',
+'formerror' => 'Yerro: No se pudo embiar fomulario.',
+'badarticleerror' => 'No se puede azer esta aksyon en este pajina.',
+'cannotdelete' => 'No pudo efasar esta pajina o archivo "$1".
+Puede ser ke ya a efasado otra persona.',
+'cannotdelete-title' => 'No se puede efasar pajina "$1"',
+'delete-hook-aborted' => 'Efasyon fue anulado por "hook".',
+'no-null-revision' => 'No pudo krear la mueva revizyon nula para la pajina "$1"',
 'badtitle' => 'Titolo negro',
 'badtitletext' => 'El título de la hoja demandada está vazío, no es valible, o es un link interlingua o interwiki incorrecto.
 Puede ser que contiene uno o más caracteres que no se pueden usar en los títulos.',
+'perfcached' => 'Los sigiente datos se enkontra en el cache i puede ser ke no esta aktualizada. Un maksimo de {{PLURAL:$1|un resultado esta|$1 resultados estan}} enkontrado en el cache.',
+'perfcachedts' => 'Los sigiente datos se enkontra en el cache, i fue aktualizado $1. Un maksimo de {{PLURAL:$4|un resultado esta|$1 resultados estan}} enkontrado en el cache.',
+'querypage-no-updates' => 'Las aktualizasyones de esta pajina esta desaktivado.
+Las datos no va aktualizar agora.',
 'viewsource' => 'Ver su manadero',
 'viewsource-title' => 'Ver la fuente de $1',
 'actionthrottled' => 'Aksyon limitada',
+'actionthrottledtext' => 'Komo prekosyon kontra el spam, ay un limite de kuanto vezes puede azer este aksyon en poko tiempo, i sovrepasaste este limite.
+Aprovar de muevo en unos minutos.',
+'protectedpagetext' => 'La pajina esta guardado kontra esdisyones i otras aksyones.',
+'viewsourcetext' => 'Puede ver i kopiar la fuente de este pajina:',
+'viewyourtext' => 'Puede ver i kopiar la fuente de "tus edisyones" a esta pajina:',
+'protectedinterface' => 'Esta pajina abastese teksto de la interfaz para la programa de este viki, i es guardado para empedir abuso.
+Para anyadir o kambiar traduksyones para todos los vikis, uza [//translatewiki.net/translatewiki.net], el projecto de lokalizasyon de MediaWiki.',
+'editinginterface' => "'''Aviso:''' Estas editando una pajina uzada para abasteser teksto de la interfaz para la programa.
+Kambios a esta pajina afectara la aparesemiento de la interfaz de usuario para los otros usuarios en este viki.
+Para anyadir o kambiar traduksyones para todos los vikis, uza [//translatewiki.net/translatewiki.net], el projecto de lokalizasyon de MediaWiki.",
 
 # Virus scanner
 'virus-unknownscanner' => 'antivirus deskonosido:',
 
 # Login and logout pages
 'welcomeuser' => 'Bienvinidos, $1',
-'yourname' => 'Nombre de usuario:',
+'yourname' => 'Nombre de kullaneador:',
 'userlogin-yourname' => 'Nombre de usuario',
 'userlogin-yourname-ph' => 'Eskrive tu nombre de usuario',
 'createacct-another-username-ph' => 'Eskrive el nombre de usuario',
-'yourpassword' => 'Parola',
+'yourpassword' => 'Kóddiche:',
 'userlogin-yourpassword' => 'Kontrasenya',
 'userlogin-yourpassword-ph' => 'Eskriva tu kontrasenya',
 'createacct-yourpassword-ph' => 'Eskriva una kontrasenya',
-'yourpasswordagain' => 'Entra de muevo la parola',
+'yourpasswordagain' => 'Entra de muevo el kóddiche:',
 'createacct-yourpasswordagain' => 'Konfirme contrasenya',
 'createacct-yourpasswordagain-ph' => 'Eskrive la kontrasenya de muevo',
-'remembermypassword' => 'Acórdate de mi entrada de usador en este bilgisayar/orddênador (por un maksimum de {{PLURAL:$1|día|días}})',
+'remembermypassword' => 'Acódrate de mi entrada de kullaneador en este navigador (por un maksimum de {{PLURAL:$1|día|días}})',
 'yourdomainname' => 'Tu dominyo:',
 'password-change-forbidden' => 'No se puede kambiar contrasenyas en este viki.',
 'login' => 'Entrar',
-'nav-login-createaccount' => 'Entrar / Criar un cuento',
+'nav-login-createaccount' => 'Entrar / criar un cuento',
 'loginprompt' => 'Kale tener "cookies" aktivadas enel navegador para enrejistrarse en {{SITENAME}}',
-'userlogin' => 'Entrar / Registrarse',
+'userlogin' => 'Entrar / Criar cuento',
 'logout' => 'Salir',
 'userlogout' => 'Salir',
 'userlogin-noaccount' => 'No tiene un kuento?',
 'userlogin-joinproject' => 'Abonar {{SITENAME}}',
 'nologin' => "¿No tienes un cuento? '''$1'''.",
-'nologinlink' => 'Crea un cuento',
-'createaccount' => 'Crea un nuevo cuento',
+'nologinlink' => 'Criar un kuento',
+'createaccount' => 'Criar un cuento',
 'gotaccount' => "¿Ya tienes un cuento? '''$1'''.",
 'gotaccountlink' => 'Entrar',
 'userlogin-resetlink' => 'Olvidates tus detalyos de akseso?',
@@ -560,19 +606,21 @@ Puede ser que contiene uno o más caracteres que no se pueden usar en los títul
 'createacct-emailoptional' => 'Korreo elektroniko (opsyonal)',
 'createacct-email-ph' => 'Eskrive tu adreso de korreo elektroniko',
 'createacct-another-email-ph' => 'Eskrive el adreso de korreo elektronico',
-'createaccountmail' => 'por una letra electrónica',
+'createaccountmail' => 'Uzar una contrasenya temporal y embiarla al korreo elektronico espesificado',
 'createacct-realname' => 'Nombre verdadero (opsyonal)',
 'createaccountreason' => 'Razon:',
 'createacct-reason' => 'Razon',
 'createacct-submit' => 'Krear tu cuento',
 'createacct-another-submit' => 'Krear otro kuento',
 'createacct-benefit-heading' => '{{SITENAME}} es izo por djente komo tu.',
+'createacct-benefit-body1' => '{{PLURAL:$1|edisyon|edisyones}}',
 'createacct-benefit-body2' => '{{PLURAL:$1|pajina|pajinas}}',
 'userexists' => 'El nombre de usuario que eskrivites ya se uza.
 Eskoje un nombre diferente.',
+'createacct-error' => 'Yerro de kreasyon de kuento',
 'createaccounterror' => 'No se pudo crear el cuento: $1',
 'password-name-match' => 'Tu contrasenya kale ser diferente de tu usuario.',
-'mailmypassword' => 'Restableser kontrasenya',
+'mailmypassword' => 'Restableser kóddiche',
 'mailerror' => 'Falta al embiar korreo: $1',
 'emailconfirmlink' => 'Confirma su adderesso de letra electrónica',
 'accountcreated' => 'Cuento creado',
@@ -595,6 +643,8 @@ Eskoje un nombre diferente.',
 'passwordreset-username' => 'Nombre de usador:',
 'passwordreset-domain' => 'Dominio:',
 'passwordreset-email' => 'Adresso de letral:',
+'passwordreset-emailelement' => 'Usuario: $1
+Kontrasenya temporal: $2',
 
 # Special:ChangeEmail
 'changeemail' => 'Kambiar adreso de korreo elektroniko',
@@ -610,20 +660,20 @@ Eskoje un nombre diferente.',
 'resettokens-token-label' => '$1(valor aktual: $2)',
 
 # Edit page toolbar
-'bold_sample' => 'Teksto gordo',
-'bold_tip' => 'Teksto gordo',
-'italic_sample' => 'Teksto cursivo',
-'italic_tip' => 'Teksto en cursiva',
-'link_sample' => 'Título del enlase',
+'bold_sample' => 'Teksto reforçado',
+'bold_tip' => 'Teksto reforçado',
+'italic_sample' => 'Teksto aladado',
+'italic_tip' => 'Teksto aladado',
+'link_sample' => 'Títolo del atamiento',
 'link_tip' => 'Link interno',
-'extlink_sample' => 'http://www.example.com Título del link',
+'extlink_sample' => 'http://www.example.com Títolo del atamiento',
 'extlink_tip' => 'Link eksterno (acόrdate de ajustar el prefiks http://)',
-'headline_sample' => 'Escrituria de títůlo',
+'headline_sample' => 'Escritura de títolo',
 'headline_tip' => 'Titular de nivel 2',
 'nowiki_sample' => 'Escribid aquí texto sin formato',
 'nowiki_tip' => 'Iñorar el formato wiki',
 'image_tip' => 'Imagen incorporada',
-'media_tip' => 'Link al arxivo multimedia',
+'media_tip' => 'Atamiento de la dosya',
 'sig_tip' => 'Firma, data i ora',
 'hr_tip' => 'Liña orizontala (úsala de vez en cuando)',
 
@@ -648,7 +698,7 @@ Tu adresso de IP va ser enrejjistrado en la istoria de la hoja.",
 'loginreqlink' => 'entrar',
 'loginreqpagetext' => 'Tienes que $1 para pueder ver otras hojas.',
 'accmailtitle' => 'La kontrasenya ha sido embiada.',
-'accmailtext' => 'La kontrasenya para "$1" se ha embiado a $2.',
+'accmailtext' => "Se a embiado a $2 una kontrasenya jenerado por [[User talk:$1|$1]]. Se puede kambiar en la pajina ''[[Special:ChangePassword|cambiar kontrasenya]]'' al entrar.",
 'newarticle' => '(Muevo)',
 'newarticletext' => 'Arrivates a una hoja que daínda no egziste.
 Para crear esta hoja, empeça a escribir en la caxa de abaxo. Mira [[{{MediaWiki:Helppage}}|la hoja de ayudo]] para saber más.
@@ -673,9 +723,9 @@ Los tus trokamientos no se tienen guadrados!",
 'copyrightwarning' => "Si puede ser, observa que todas las contribuciones a {{SITENAME}} se consideran hechas públicas abaxo la $2 (ver detalyos en $1). Si no queres que la gente endereche tus tekstos escritos sin piadad i los esparta libberamente, alora no los metas aquí. También nos estás asegurando ansí que escribites este teksto tu mismo i sos el dueño de los derechos de autor, o lo copiates desde el dominio público u otra fuente libbero.'''¡QUE N0 USES TEKSTOS ESCRITOS CON COPYRIGHT SIN PERMISSIÓN!'''<br />",
 'templatesused' => '{{PLURAL:$1|El şablón usado|Los şablones usados}} en esta hoja:',
 'templatesusedpreview' => '{{PLURAL:$1|El xabblón usado|Los xabblones usados}} en esta vista:',
-'template-protected' => '(guardada)',
-'template-semiprotected' => '(media guardada)',
-'hiddencategories' => 'Esta hoja es un miembro de {{PLURAL:$1|1 kateggoría escondida|$1 kateggorías escondidas}}:',
+'template-protected' => '(guadrada)',
+'template-semiprotected' => '(media guadrada)',
+'hiddencategories' => 'Esta hoja es un miembro de {{PLURAL:$1|1 kategoría escondida|$1 kategorías escondidas}}:',
 'nocreate-loggedin' => 'No tienes el permisso de creas hojas nuevas.',
 'permissionserrorstext-withaction' => 'No tienes el permiso para $2, por las {{PLURAL:$1|razón|razones}} venideras:',
 'recreate-moveddeleted-warn' => "'''Aviso: Estas kriando una oja la kuala fue efassada antes.'''
@@ -711,19 +761,19 @@ Este o estos kampos no van ser amostrados",
 'revisionasof' => 'Enderechamiento a las $1',
 'revision-info' => 'Revision en data $1 por $2',
 'previousrevision' => '← Enderechamiento de antes',
-'nextrevision' => 'Rêvisión venidera →',
+'nextrevision' => 'Revizión venidera →',
 'currentrevisionlink' => 'Revisión actual',
 'cur' => 'act',
 'next' => 'venidero',
-'last' => 'de alcabo',
+'last' => 'de alcavo',
 'page_first' => 'primeras',
 'page_last' => 'de alcabo',
 'histlegend' => "Selección de diferencias: marca los selectores de las versiones a comparar y pulsa ''enter'' o el botón de abajo.<br />
 Leyenda: (act) = diferencias con la versión actual,
 (prev) = diferencias con la versión previa, M = edición menor",
-'history-fieldset-title' => 'Buscar en la istoria',
+'history-fieldset-title' => 'Navegar en la istoria',
 'history-show-deleted' => 'Sólamente efassado',
-'histfirst' => 'Lo mas antiko',
+'histfirst' => 'Lo mas viejo',
 'histlast' => 'Lo mas muevo',
 'historysize' => '({{PLURAL:$1|1 byte|$1 bytes}})',
 'historyempty' => '(vazío)',
@@ -743,7 +793,7 @@ Leyenda: (act) = diferencias con la versión actual,
 'revdelete-radio-set' => 'Eskondido',
 'revdelete-radio-unset' => 'Visible',
 'revdelete-log' => 'Razon:',
-'revdel-restore' => 'troca la visibilitá',
+'revdel-restore' => 'troca la vizibilitá',
 'pagehist' => 'La storia de la hoja',
 'revdelete-otherreason' => 'Otro razon/razon adisiyonal',
 'revdelete-reasonotherlist' => 'Otra razón',
@@ -758,13 +808,13 @@ Leyenda: (act) = diferencias con la versión actual,
 # Diffs
 'history-title' => 'Istorya de trokamientos para «$1»',
 'lineno' => 'Liña $1:',
-'compareselectedversions' => 'Comparar versiones escogidas',
+'compareselectedversions' => 'Comparar versiones escojidas',
 'editundo' => 'des-hazer',
 'diff-multi' => '(No {{PLURAL:$1|es amostrado un trokamiento intermedio echo|son amostrados $1 trokamientos intermedios echos}} por {{PLURAL:$2|un usador|$2 usadores}})',
 
 # Search results
-'searchresults' => 'Resultados de la búsquida',
-'searchresults-title' => 'Resultados de la búsquida de «$1»',
+'searchresults' => 'Resultados de la búxquida',
+'searchresults-title' => 'Resultados de la búxquida de «$1»',
 'notextmatches' => 'No se pudo topar en dinguna hoja.',
 'prevn' => '{{PLURAL:$1|$1}} de antes',
 'nextn' => '{{PLURAL:$1|$1}} venideras',
@@ -773,17 +823,17 @@ Leyenda: (act) = diferencias con la versión actual,
 'shown-title' => 'Amostrar $1 {{PLURAL:$1|resultado|resultados}} por hoja',
 'viewprevnext' => 'Ver ($1 {{int:pipe-separator}} $2) ($3).',
 'searchmenu-exists' => 'Egziste una oja yamada "[[:$1]]" en esta viki',
-'searchmenu-new' => "'''Krear la pajina «[[:$1]]» en esta viki!'''{{PLURAL:$2|0=|Tambien ver la pajina topado kon tu bushkida.|Tambier ver la resulta de tu bushkida.}}",
-'searchprofile-articles' => 'Pajinas de kontenido',
+'searchmenu-new' => "'''Criar la hoja «[[:$1]]» en esta viki!'''{{PLURAL:$2|0=|También ver la hoja topado kon tu búxquida.|Tambier ver la resulta de tu búxquida.}}",
+'searchprofile-articles' => 'Hojas de contènido',
 'searchprofile-project' => 'Hojas de ayudo y hojas de projeto',
 'searchprofile-images' => 'Multimedya',
 'searchprofile-everything' => 'Todo',
 'searchprofile-advanced' => 'Adelantado',
-'searchprofile-articles-tooltip' => 'Bushkar en $1',
-'searchprofile-project-tooltip' => 'Bushkar en $1',
-'searchprofile-images-tooltip' => 'Bushkar archivos',
-'searchprofile-everything-tooltip' => 'Bushkar en todo el kontenido (i mismo en las hojas de diskusyón)',
-'searchprofile-advanced-tooltip' => 'Buscar en espacios de nombres particůlares',
+'searchprofile-articles-tooltip' => 'Buxcar en $1',
+'searchprofile-project-tooltip' => 'Buxcar en $1',
+'searchprofile-images-tooltip' => 'Buxcar dosyas',
+'searchprofile-everything-tooltip' => 'Buxca en todo el contènido (y mismo en las hojas de diskusyón)',
+'searchprofile-advanced-tooltip' => 'Buxcar en espacios de nombres particòlares',
 'search-result-size' => '$1 ({{PLURAL:$2|1 biervo|$2 biervos}})',
 'search-result-category-size' => '{{PLURAL:$1|1 miembro|$1 miembros}} ({{PLURAL:$2|1 basho-kateggoria|$2 basho-kateggoria}}, {{PLURAL:$3|1 dossia|$3 dossias}})',
 'search-redirect' => '(direksión desde $1)',
@@ -795,7 +845,7 @@ Leyenda: (act) = diferencias con la versión actual,
 'searchrelated' => 'lisionado',
 'searchall' => 'todos',
 'showingresultsheader' => "{{PLURAL:$5|Resultado '''$1''' de '''$3'''|Resultados '''$1-$2''' de '''$3'''}} para '''$4'''",
-'search-nonefound' => 'No ay resultados que acumplan los criterios de la búsqueda.',
+'search-nonefound' => 'No ay resultados que acumplan los criterios de la búxquida.',
 'powersearch-legend' => 'Búsqueda adelantada',
 'powersearch-ns' => 'Busca en los espacios de nombres:',
 'powersearch-redir' => 'Mostra las redirecciones',
@@ -805,7 +855,8 @@ Leyenda: (act) = diferencias con la versión actual,
 
 # Preferences page
 'preferences' => 'Preferencias',
-'mypreferences' => 'Las mis preferensias',
+'mypreferences' => 'Preferencias',
+'prefs-edits' => 'Numero de edisyones:',
 'prefs-skin' => 'Vista',
 'skin-preview' => 'Previstear',
 'prefs-datetime' => 'Data i ora',
@@ -832,7 +883,7 @@ Leyenda: (act) = diferencias con la versión actual,
 'timezoneregion-pacific' => 'Oseano Pasifiko',
 'prefs-searchoptions' => 'Bushkar',
 'prefs-files' => 'Dosyas',
-'youremail' => 'Korreo elektroniko:',
+'youremail' => 'Letral:',
 'username' => '{{GENDER:$1|Nombre de usuario}}:',
 'yourrealname' => 'Nombre verdadero:',
 'yourlanguage' => 'Lengua:',
@@ -841,7 +892,7 @@ Leyenda: (act) = diferencias con la versión actual,
 'gender-male' => 'El redakto pajinas de viki',
 'gender-female' => 'Eya redakto pajinas de viki',
 'email' => 'Korreo elektroniko',
-'prefs-help-email' => 'El adreso de e-posta es menester para alimpiar la tu parola, si la olvidates',
+'prefs-help-email' => 'El adreso de korreo elektroniko es opsional, ma es menester para alimpiar la tu kontrasenya, si la olvidates',
 'prefs-help-email-others' => 'Endemas puedes eskojer si keres dar pueder a otros usadores de azer kontakto kon ti por modre de e-posta, a  traverso de un atamiento en tus ojas de usador i de diskusyon.',
 'prefs-help-email-required' => 'Se nesesita adreso de korreo elektroniko.',
 'prefs-info' => 'Informasyon basiko',
@@ -905,20 +956,20 @@ Leyenda: (act) = diferencias con la versión actual,
 'recentchanges-legend' => 'Opciones encima de los trocamientos frescos',
 'recentchanges-summary' => 'Perseguid en esta hoja, los trocamientos de alcabo realizados en la Viki.',
 'recentchanges-feed-description' => 'Perseguir los trocamientos más nuevos en el viki en este feed.',
-'recentchanges-label-newpage' => 'Este trokamiento krio una mueva ója',
+'recentchanges-label-newpage' => 'Este trocamiento crió una mueva hoja',
 'recentchanges-label-minor' => 'Esta es un trocamiento chiquitico',
 'recentchanges-label-bot' => 'Este trokamiento fue echo por un bot',
-'recentchanges-label-unpatrolled' => 'Estre trokamiento no esta akavidado',
+'recentchanges-label-unpatrolled' => 'Este trocamiento no está akavidado',
 'recentchanges-legend-plusminus' => "(''±123'')",
 'rcnotefrom' => "Debasho se amostran los trokamientos desde '''$2''' (amostrados fina <b>$1</b>)",
 'rclistfrom' => 'Mostra los trocamientos nuevos empeçando desde $1',
 'rcshowhideminor' => '$1 trocamientos chiquiticos',
 'rcshowhidebots' => '$1 bots',
-'rcshowhideliu' => '$1 usuarios enrējjistrados',
-'rcshowhideanons' => '$1 empleadores anonimes',
-'rcshowhidepatr' => '$1 trokamientos akavidados',
+'rcshowhideliu' => '$1 kullaneadores enrezhistrados',
+'rcshowhideanons' => '$1 kullaneadores anonimes',
+'rcshowhidepatr' => '$1 trocamientos akavidados',
 'rcshowhidemine' => '$1 mis ediciones',
-'rclinks' => 'Ver los dal cabo $1 trocamientos en los dal cabo $2 días.<br />$3',
+'rclinks' => 'Ver los dal cavo $1 trocamientos en los dal cavo $2 días.<br />$3',
 'diff' => 'dif',
 'hist' => 'ist',
 'hide' => 'Esconder',
@@ -933,10 +984,10 @@ Leyenda: (act) = diferencias con la versión actual,
 # Recent changes linked
 'recentchangeslinked' => 'Trocamientos conectados',
 'recentchangeslinked-feed' => 'Trocamientos conectados',
-'recentchangeslinked-toolbox' => 'Trocamientos relatados',
+'recentchangeslinked-toolbox' => 'Trocamientos atados',
 'recentchangeslinked-title' => 'Los trocamientos relacionados con "$1"',
-'recentchangeslinked-summary' => "Esto es la lista de los trocamientos de alcavo de las hojas que relatan á una hoja spēcifik (ou de los miembros de la katēggoría spēcifikada).
-Las hojas en tu [[Special:Watchlist|lista de akavidamiento]] son escritas '''con letras grexas'''.",
+'recentchangeslinked-summary' => "Esto es la lista de los trocamientos dalcavo de las hojas que relatan a una hoja particòlar (o de los miembros de la kategoría particòlar).
+Las hojas en tu [[Special:Watchlist|lista de akavidamiento]] son '''reforçadas'''.",
 'recentchangeslinked-page' => 'Nombre de la hoja',
 'recentchangeslinked-to' => 'Amostra los trocamientos freskos en lugar de la hoja indicada',
 
@@ -949,7 +1000,7 @@ Las hojas en tu [[Special:Watchlist|lista de akavidamiento]] son escritas '''con
 'filesource' => 'Fuente:',
 'filename-tooshort' => 'El nombre del archivo es muy kurto.',
 'savefile' => 'Guardar archivo',
-'uploadedimage' => 'subió «[[$1]]»',
+'uploadedimage' => 'suvió «[[$1]]»',
 
 # File backend
 'backend-fail-notexists' => 'El archivo $1 no egziste.',
@@ -958,7 +1009,7 @@ Las hojas en tu [[Special:Watchlist|lista de akavidamiento]] son escritas '''con
 # img_auth script messages
 'img-auth-nofile' => 'El archivo "$1" no egziste.',
 
-'license' => 'Lesensia:',
+'license' => 'Lecencia:',
 'license-header' => 'Lesensiamyénto',
 
 # Special:ListFiles
@@ -973,23 +1024,23 @@ Las hojas en tu [[Special:Watchlist|lista de akavidamiento]] son escritas '''con
 'listfiles-latestversion-no' => 'No',
 
 # File description page
-'file-anchor-link' => 'Archivo',
+'file-anchor-link' => 'Dosya',
 'filehist' => 'La istoria de la dosya',
-'filehist-help' => 'Klika encima de una data/ora para vel el arxivo de esta data.',
+'filehist-help' => 'Klika encima de una data/ora para vel la dosya desta data.',
 'filehist-revert' => 'aboltar',
 'filehist-current' => 'actual',
 'filehist-datetime' => 'Data/Ora',
 'filehist-thumb' => 'Minyatura',
 'filehist-thumbtext' => 'Minyatura de la versión á las $1',
 'filehist-nothumb' => 'Sin minyatura',
-'filehist-user' => 'Usuario',
+'filehist-user' => 'Kullaneador',
 'filehist-dimensions' => 'Dimensiones',
 'filehist-filesize' => 'El boy de la dosya',
 'filehist-comment' => 'Comentario',
 'filehist-missing' => 'No se topa el archivo',
 'imagelinks' => 'El uso del dosya',
-'linkstoimage' => '{{PLURAL:$1|La hoja venidera da link|Las hojas venideras dan link}} a este arxivo:',
-'nolinkstoimage' => 'Dinguna ója tiene atamientos a esta imej',
+'linkstoimage' => '{{PLURAL:$1|La hoja venidera da link|Las hojas venideras dan link}} a esta dosya:',
+'nolinkstoimage' => 'No ay hojas con atamientos a esta dosya.',
 'sharedupload' => 'Este arxivo es de $1 i puede ser usado por otros proyectos.',
 'sharedupload-desc-here' => 'Esta hoja es de $1 y puede ser usado por otros projetos.
 La descripción en su [$2 hoja de descripción del arxivo] está amostrada debaxo.',
@@ -1023,11 +1074,16 @@ La descripción en su [$2 hoja de descripción del arxivo] está amostrada debax
 'statistics' => 'Estatísticas',
 'statistics-articles' => 'Pajinas de kontenido',
 'statistics-pages' => 'Pajinas',
+'statistics-users-active' => 'Usuarios aktivos',
 
 'pageswithprop-submit' => 'Ir',
 
+'doubleredirects' => 'Redireksyones dobles',
+
 'brokenredirects-edit' => 'trocar',
+'brokenredirects-delete' => 'efasar',
 
+'withoutinterwiki' => 'Pajinas sin enlases de lenguas',
 'withoutinterwiki-submit' => 'Amostrar',
 
 # Miscellaneous special pages
@@ -1078,7 +1134,7 @@ La descripción en su [$2 hoja de descripción del arxivo] está amostrada debax
 # Special:LinkSearch
 'linksearch' => 'Bushkida de enlases eksternos',
 'linksearch-ok' => 'Bushkar',
-'linksearch-line' => 'Atamiento para $1 en la ója $2',
+'linksearch-line' => 'Atamiento para $1 en la hoja $2',
 
 # Special:ListUsers
 'listusers-submit' => 'Amostrar',
@@ -1117,9 +1173,7 @@ La descripción en su [$2 hoja de descripción del arxivo] está amostrada debax
 'watchlist' => 'Lista de akavidamiento',
 'mywatchlist' => 'Mi lista de akavidamientos',
 'watchlistfor2' => 'Para $1 $2',
-'addedwatchtext' => "La hoja «[[:$1]]» fue ajustada a tu [[Special:Watchlist|lista de escogidas]]. Los trocamientos venideros en esta hoja i en tu hoja de diskussión associada se van indicar aí, i la hoja va aparecer '''gordo''' en la hoja de [[Special:RecentChanges|trocamientos freskos]] para hazerla más kolay de detektar.
-
-Cuando queres eliminar la hoja de tu lista de escogidas, piza «Dexar de cudiar» en el menú.",
+'addedwatchtext' => 'La pajina "[[:$1]]" fue anyadido a tu [[Special:Watchlist|lista de escogidas]]. Los trocamientos venideros en esta pajina i en tu pajina de diskusyon assosiada va apareser ayi.',
 'removedwatchtext' => 'La hoja «[[:$1]]» fue eliminada de tu [[Special:Watchlist|lista de escogidas]].',
 'watch' => 'cudiar',
 'watchthispage' => 'Cudia esta hoja',
@@ -1141,20 +1195,22 @@ en forma turable, ansí como todo su istoria.
 Si puede ser, confirma que de verdad queres hazer esto, que estás entendiendo las
 resultados, i que lo estás haziendo de acorddo con las [[{{MediaWiki:Policy-url}}|Políticas]].',
 'actioncomplete' => 'Aksion kompleta',
-'actionfailed' => 'Aksiyon sin reushitá',
+'actionfailed' => 'Aksión sin reuşitá',
 'deletedtext' => '"$1" fue efassado.
 Mira $2 para un registro de los efassados nuevos.',
 'dellogpage' => 'Registro de efassados',
 'deletecomment' => 'Razón:',
 'deleteotherreason' => 'Otra razon/razon adisiyonal:',
 'deletereasonotherlist' => 'Otra razón',
-'deletereason-dropdown' => '* Motivos generales de efassamientos
-** La demanda del criador de la hoja
-** Violación de copyright
-** Vandalismo',
+'deletereason-dropdown' => '* Razones komunes de efassamientos
+** Spam
+** Vandalismo
+** Violasyon del derecho de otor
+** Demande del otor mizmo
+** Redireksyon rota',
 
 # Rollback
-'rollbacklink' => 'aboltar',
+'rollbacklink' => 'hazer aboltar',
 
 # Protect
 'protectlogpage' => 'Protecciones de las hojas',
@@ -1170,9 +1226,9 @@ Mira $2 para un registro de los efassados nuevos.',
 A continuación se mostran las opciones actuales de la hoja '''$1''':",
 'protect-cascadeon' => 'Esta hoja está guardada en momento porque está incluida en {{PLURAL:$1|la hoja venidera|las hojas venideras}}, que tienen activada la opción de protección en grados. Puedes trocar el nivel de protección de esta hoja, ma no va afectar a la protección en grados.',
 'protect-default' => 'Permitir todos los usuarios',
-'protect-fallback' => 'Tiene menester del permiso «$1»',
-'protect-level-autoconfirmed' => 'Bloquear usuarios nuevos y no registrados',
-'protect-level-sysop' => 'Sólo administradores',
+'protect-fallback' => 'Solo permitir usuarios kon permiso "$1"',
+'protect-level-autoconfirmed' => 'Solo permitir usuarios otokonfirmados',
+'protect-level-sysop' => 'Solo permitir administradores',
 'protect-summary-cascade' => 'con grados',
 'protect-expiring' => 'caduca el $1 (UTC)',
 'protect-cascade' => 'Protección en cascada - guardar todas las hojas incluidas en ésta.',
@@ -1196,12 +1252,12 @@ A continuación se mostran las opciones actuales de la hoja '''$1''':",
 # Namespace form on various pages
 'namespace' => 'Espacio de nombres:',
 'invert' => 'Invertir selección',
-'blanknamespace' => '(Principal)',
+'blanknamespace' => '(Prencipal)',
 
 # Contributions
-'contributions' => 'Ajustamientos {{GENDER:$1|del usador|de la usadora}}',
+'contributions' => 'Ajustamientos {{GENDER:$1|del kullaneador|de la kullaneadera}}',
 'contributions-title' => 'Ajustamientos {{GENDER:$1|del usuario|de la usuaria}} $1',
-'mycontris' => 'Mis dados',
+'mycontris' => 'Mis donos',
 'contribsub2' => 'Para {{GENDER:$3|$1}}($2)',
 'uctop' => '(korriente)',
 'month' => 'Desde el mes (i antes):',
@@ -1212,65 +1268,66 @@ A continuación se mostran las opciones actuales de la hoja '''$1''':",
 'sp-contributions-uploads' => 'suvidas',
 'sp-contributions-logs' => 'enrejistros',
 'sp-contributions-talk' => 'Diskusyón',
-'sp-contributions-search' => 'Buscar ajustamientos',
+'sp-contributions-search' => 'Buxcar ajustamientos',
 'sp-contributions-username' => 'Adreso de IP o nombre de usuario:',
 'sp-contributions-toponly' => "Amostrar solo revisiones d'alkavo",
-'sp-contributions-submit' => 'Bushkar',
+'sp-contributions-submit' => 'Buxcar',
 
 # What links here
-'whatlinkshere' => 'Atamientos a esta hoja',
+'whatlinkshere' => 'Hojas atadas',
 'whatlinkshere-title' => 'Hojas que dan link a "$1"',
 'whatlinkshere-page' => 'Hoja:',
 'linkshere' => "Las hojas venideras dan link a '''[[:$1]]''':",
 'nolinkshere' => "Dinguna ója tiene atamientos kon '''[[:$1]]'''",
 'isredirect' => 'Hoja redirigida',
 'istemplate' => 'inclusión',
-'isimage' => 'Atamiento de la dossia',
+'isimage' => 'atamiento de la dosya',
 'whatlinkshere-prev' => '{{PLURAL:$1|de antes|de antes $1}}',
 'whatlinkshere-next' => '{{PLURAL:$1|venidera|venideras $1}}',
-'whatlinkshere-links' => '← linkes',
+'whatlinkshere-links' => '← atamientos',
 'whatlinkshere-hideredirs' => '$1 redirecciones',
 'whatlinkshere-hidetrans' => '$1 inclusiones',
-'whatlinkshere-hidelinks' => '$1 linkes',
-'whatlinkshere-hideimages' => '$1 atamientos a imejes',
+'whatlinkshere-hidelinks' => '$1 atamientos',
+'whatlinkshere-hideimages' => '$1 atamientos a dosyas',
 'whatlinkshere-filters' => 'Filtres',
 
 # Block/unblock
 'blockip' => 'Bloquear usuario',
 'ipadressorusername' => 'Adreso de IP o nombre de usuario:',
 'ipbreason' => 'Razon:',
-'ipboptions' => '2 oras:2 hours,1 día:1 day,3 días:3 days,1 semana:1 week,2 semanas:2 weeks,1 mes:1 month,3 meses:3 months,6 meses:6 months,1 anyo:1 year,para siempre:infinite',
-'ipblocklist' => 'Usadores bloqueados',
+'ipboptions' => '2 oras:2 hours,1 día:1 day,3 días:3 days,1 semana:1 week,2 semanas:2 weeks,1 mes:1 month,3 meses:3 months,6 meses:6 months,1 año:1 year,para siempre:infinite',
+'badipaddress' => 'Adreso de IP invalido',
+'ipblocklist' => 'Usuarios blokeados',
 'blocklist-reason' => 'Razon',
 'ipblocklist-submit' => 'Bushkar',
 'infiniteblock' => 'para siempre',
 'blocklink' => 'blokar',
 'unblocklink' => 'quitar el bloko',
 'change-blocklink' => 'trocar el bloko',
-'contribslink' => 'donos',
+'contribslink' => 'kontribüsyones',
 'emaillink' => 'embiar korreo elektroniko',
-'blocklogpage' => 'Bloqueos de usuarios',
-'blocklogentry' => 'bloqueó a [[$1]] $3 durante un tiempo de $2',
+'blocklogpage' => 'Blokos de kullaneadores',
+'blocklogentry' => 'blokó a [[$1]] $3 durante un tiempo de $2',
 'unblocklogentry' => 'desbloqueó a "$1"',
-'block-log-flags-nocreate' => 'desactivada la creación de cuentos',
+'block-log-flags-nocreate' => 'desactivada la kreasyon de kuentos',
 'block-log-flags-hiddenname' => 'nombre de usuario eskondido',
 
 # Developer tools
 'lockedbyandtime' => '(por {{GENDER:$1|$1}} el $2 a la $3)',
 
 # Move page
-'movepagetext' => "Usando el formulario venidero se va renombrar una hoja, quitando todo su istoria a su nuevo nombre.
-El título de antes se va convertir en una redirección al nuevo título.
-Los linkes al antiguo título de la hoja no se van trocar.
-Asegúrate de no dexar [[Special:DoubleRedirects|redirecciones dobles]] o [[Special:BrokenRedirects|rotas]].
-Tú sos responsable de aranjjar los linkes de manera menesterosa.
-
-Acórdate que la hoja '''no''' va ser renombrada si ya egziste una hoja con esta nuevo título, a no ser que sea una hoja vazía o una redirección sin istoria.
-Esto siñifica que vas pueder renombrar una hoja a su título original si hazes un yerro, ma que no vas pueder sobrescribir una hoja que ya existe.
-
-'''¡Atansión!'''
-Este puede ser un trocamiento muy muy emportante e inesperado para una hoja popular;
-si puede ser, asegúrate de entender las resultados del lo que hazes antes de yir endelantre.",
+'movepagetext' => "Uzando el sigiente formulario va renombrar una pajina, kitando todo su istoria a su nuevo nombre.
+El titulo orijinal se va convertir en una redireksyon al muevo titulo.
+Puede aktualizar otomatikamente las redireksyones al titulo orijinal.
+Si eskoje no azerlo, asegurate de verifikar ke no ay  [[Special:DoubleRedirects|redireksyones dobles]] o [[Special:BrokenRedirects|rotas]].
+Tú sos responsable de asegurar ke los enlases funksyonan korrectamente.
+
+Nota ke la pajina '''no''' va ser renombrada si ya egziste una hoja con esta muevo título, a no ser que sea una redireksyon sin istoria.
+Esto sinyifica que vas pueder renombrar una pajina a su titulo orijinal si hazes un yerro, ma que no vas pueder sobreskrivir una pajina que ya existe.
+
+'''Aviso!'''
+Este puede ser un trocamiento muy muy emportante e inesperado para una pajina popular;
+asegurate de entender las resultados del lo que azes antes de ir endelantre.",
 'movepagetalktext' => "La hoja de diskussión associada, si egziste, va ser renombrada otomáticamente '''a menos que:'''
 *Esté renombrando la hoja entre espacios de nombres diferentes,
 *Una hoja de diskussión no vazía ya egziste con el nombre nuevo, o
@@ -1306,8 +1363,8 @@ Si puede ser, escoge otro nombre.',
 'allmessages-filter-submit' => 'Ir',
 
 # Thumbnails
-'thumbnail-more' => 'Engrandece',
-'thumbnail_error' => 'Yerro kriando la imej chika: $1',
+'thumbnail-more' => 'Engrandecer',
+'thumbnail_error' => 'Yerro kriando la minyatura: $1',
 
 # Special:Import
 'import-interwiki-submit' => 'Importar',
@@ -1315,60 +1372,60 @@ Si puede ser, escoge otro nombre.',
 'importnopages' => 'No ay pajinas para importar.',
 
 # Tooltip help for the actions
-'tooltip-pt-userpage' => 'Tu hoja de usador',
+'tooltip-pt-userpage' => 'Tu hoja de kullaneador',
 'tooltip-pt-mytalk' => 'Tu hoja de diskusyón',
 'tooltip-pt-preferences' => 'Mis preferencias',
 'tooltip-pt-watchlist' => 'La lista de los trocamientos acontècidos en las hojas akavidadas.',
-'tooltip-pt-mycontris' => 'La lista de tus àjustamientos',
+'tooltip-pt-mycontris' => 'La lista de tus donos',
 'tooltip-pt-login' => 'Te encorajamos de entrar ma no estás obligado',
-'tooltip-pt-logout' => 'Sal de tu cuento.',
+'tooltip-pt-logout' => 'Sal de tu cuento',
 'tooltip-ca-talk' => 'Diskusyón encima del artíkolo',
-'tooltip-ca-edit' => 'Puedes trocar esta hoja. Te rogamos, antes de enrejistrarla, echa una ojada en kullaneando el botón de previsteo',
-'tooltip-ca-addsection' => 'Empeça una nueva sección',
-'tooltip-ca-viewsource' => 'Esta hoja está guardada.
+'tooltip-ca-edit' => 'Puedes trocar esta hoja. Ma te rogamos para que eches una ojada (previsteo) antes de enrezhistrarla.',
+'tooltip-ca-addsection' => 'Empeça a un muevo kapítolo',
+'tooltip-ca-viewsource' => 'Esta hoja está guadrada.
 Puedes ver su manadero',
-'tooltip-ca-history' => 'Enderechamientos passados de esta hoja',
+'tooltip-ca-history' => 'Enderechamientos passados desta hoja',
 'tooltip-ca-protect' => 'Guardar esta hoja',
 'tooltip-ca-delete' => 'Efassar esta hoja',
 'tooltip-ca-move' => 'Taxirea (renombra) esta hoja',
 'tooltip-ca-watch' => 'Ajustar esta hoja a tu lista de akavidamientos',
-'tooltip-ca-unwatch' => 'Quita esta hoja de tu lista de escogidos',
-'tooltip-search' => 'Bushkar en {{SITENAME}}',
-'tooltip-search-go' => 'Si ay una hoja con este nombre egzakto, vate allá.',
+'tooltip-ca-unwatch' => 'Quita esta hoja de tu lista de escojidos',
+'tooltip-search' => 'Buxca en {{SITENAME}}',
+'tooltip-search-go' => 'Ir a la hoja con este nombre egzakto, si egziste.',
 'tooltip-search-fulltext' => 'Buxca este teksto en las hojas',
-'tooltip-p-logo' => 'Vate a la primera hoja',
-'tooltip-n-mainpage' => 'Vate a la primera hoja',
-'tooltip-n-mainpage-description' => 'Vate a la primera hoja',
-'tooltip-n-portal' => 'Encima del projeto, lo que puedes hazer y ánde topar todo',
-'tooltip-n-currentevents' => 'Jhaberes y acontècimientos de oy día',
-'tooltip-n-recentchanges' => 'Lista de los trocamientos muevos en el viki',
-'tooltip-n-randompage' => 'Carga una hoja por asardo',
-'tooltip-n-help' => 'Para saver mas',
-'tooltip-t-whatlinkshere' => 'La lista de todas las hojas del viki que se atan con esta hoja',
-'tooltip-t-recentchangeslinked' => 'Los trocamientos muevos en las hojas atadas con esta hoja',
+'tooltip-p-logo' => 'Vijita la primera hoja',
+'tooltip-n-mainpage' => 'Vijita la primera hoja',
+'tooltip-n-mainpage-description' => 'Vijita la primera hoja',
+'tooltip-n-portal' => 'Encima del projeto, lo que puedes hazer y ande topar todo',
+'tooltip-n-currentevents' => 'Jhaberes de oy día en ancho',
+'tooltip-n-recentchanges' => 'Lista de los trocamientos dalcavo en el viki',
+'tooltip-n-randompage' => 'Carga una hoja por azardo',
+'tooltip-n-help' => 'Ambézate y topa ayudo',
+'tooltip-t-whatlinkshere' => 'Una lista de todas las hojas del viki que tienen atamientos a esta hoja',
+'tooltip-t-recentchangeslinked' => 'Los trocamientos dalcavo de las hojas atadas a ésta',
 'tooltip-feed-rss' => 'Sindicación RSS de esta hoja',
 'tooltip-feed-atom' => "Fuente de Atom d'esta hoja",
 'tooltip-t-contributions' => 'Ver la lista de ajustamientos de este usuario',
 'tooltip-t-emailuser' => 'A este usuario, mándale una letra electrόnica (ímey)',
-'tooltip-t-upload' => 'Suve las dosyas por aquí',
+'tooltip-t-upload' => 'Suve dosyas',
 'tooltip-t-specialpages' => 'Lista de todas las hojas especiales',
-'tooltip-t-print' => 'Forma apropiada para imprimir esta hoja',
-'tooltip-t-permalink' => 'Atamiento permanente a este enderechamiento de la hoja',
-'tooltip-ca-nstab-main' => 'Ve el artíkolo de contènido',
-'tooltip-ca-nstab-user' => 'Ve la hoja de usuario',
+'tooltip-t-print' => 'La forma apropiada parâ imprimir esta hoja',
+'tooltip-t-permalink' => 'Atamiento permanente (fikso) a este enderechamiento de la hoja',
+'tooltip-ca-nstab-main' => 'Ve el artíkolo',
+'tooltip-ca-nstab-user' => 'Ver la pajina de usuario',
 'tooltip-ca-nstab-special' => 'Esta es una hoja especial, la hoja ya no se puede trocar',
 'tooltip-ca-nstab-project' => 'Ver la hoja del prodjekto',
 'tooltip-ca-nstab-image' => 'Ver la hoja de la dosya',
 'tooltip-ca-nstab-template' => 'Ve el şablón',
 'tooltip-ca-nstab-category' => 'Ve la hoja de categoría',
 'tooltip-minoredit' => 'Márcalo como un trocamiento chiquitico',
-'tooltip-save' => 'Guardar los trocamientos',
+'tooltip-save' => 'Guadrar los trocamientos',
 'tooltip-preview' => 'Que previzualize sus trocamientos, ¡si puede ser, que use esto antes de enregistrar!',
 'tooltip-diff' => 'Mostra los trocamientos que él/ella hizo en el texhto.',
 'tooltip-compareselectedversions' => 'Ve las diferencias entre las dos versiones escogidas de esta hoja.',
-'tooltip-watch' => 'Ajusta esta hoja a tu lista de escogidas',
-'tooltip-rollback' => '«Abolta» abolta todas los trocamientos del usador de alcavo, sólo en klikando una vez.',
-'tooltip-undo' => '«Des-hazer» abolta este trocamiento y la avre en el modo de previsteo. Permete ajustar una razón en el somario.',
+'tooltip-watch' => 'Ajusta esta hoja a tu lista de escojidas',
+'tooltip-rollback' => '«Hazer aboltar» haze aboltar todos los trocamientos del usador dalcavo, sólo en klikando una vez.',
+'tooltip-undo' => '«Des-hazer» abolta este trocamiento y lo avre en el modo de previsteo. Permete ajustar una razón en el somario.',
 'tooltip-summary' => 'Entrar un somaryo kurto',
 
 # Attribution
@@ -1386,7 +1443,7 @@ Puedes ver su manadero',
 'file-info-size' => '$1 × $2 píkseles; boy de la dosya: $3; tipo MIME: $4',
 'file-nohires' => 'No disponible a mayor resolución.',
 'svg-long-desc' => 'arxivo SVG, nominalmente $1 × $2 píkseles, boy del arxivo: $3',
-'show-big-image' => 'Archivo orijinal',
+'show-big-image' => 'Dosya orijinal',
 
 # Special:NewFiles
 'showhidebots' => '($1 bots)',
@@ -1421,12 +1478,12 @@ Puedes ver su manadero',
 'bad_image_list' => 'El formato es ansina:
 
 Sólo elementos de lista (liñas empeçando con *) se toman en konsidherasyón.
-El primer atamiento de cada liña deve de atarse con una dosya negra (la dosya que se quere blokar).
-Los atamientos venideros que están en la misma liña se konsidheran como eksepsiones (yaani hojas ande la dosya puede aparecer encaxada en la liña)',
+El primer atamiento de cada liña se deve de atar a una dosya negra (la dosya que se quere blokar).
+Los atamientos venideros que están en la misma liña se konsidheran como eksepsiones (hojas, ande la dosya puede aparecer en la liña, ande se puede kullânear la dosya).',
 
 # Metadata
 'metadata' => 'Metadatos',
-'metadata-help' => 'Este arxivo contiene enformación adicional (metadatos), probablemente ajustada por la cámara digital, el escáner o el programa usado para crearlo o digitalizarlo. Si el arxivo fue modificado desde su estado original, puede aver perdido algunos detalyos.',
+'metadata-help' => 'Esta dosya contiene mas información (metadatos), probablemente ajustada por la kamera dizhital, el eskáner o la proǵrama kullaneado para criarlo o dizhitalizarlo. Si la dosya fue trocada de su estado orizhinal, puede aver pèryido algunos detalyos.',
 'metadata-expand' => 'Mostra los detalyos ekstendidos',
 'metadata-collapse' => 'Esconder los detalyos ekstendidos',
 'metadata-fields' => 'Los campos de metadatos que se listan en este messaje se van a amostrar en la hoja de la deskripsión de la foto daínda cuando la tabla de metadatos está cerrada.
@@ -1486,7 +1543,7 @@ Los otros campos se van a guardar por defecto.
 'confirmemail' => 'Konfirmar adreso de korreo elektronika',
 'confirmemail_send' => 'Embiar el kodigo de konfirmasion.',
 'confirmemail_sent' => 'Konfirmasion de pósta embiada.',
-'confirmemail_success' => 'Su adreso de korreo elektronika a sido konfirmada. Agóra puedes registrarse e kolaborar en el wiki.',
+'confirmemail_success' => 'Su adreso de korreo elektronika a sido konfirmada. Agóra puedes [[Special:UserLogin|entrar]] e kolaborar en el wiki.',
 
 # Delete conflict
 'recreate' => 'Krear de muevo',
@@ -1587,7 +1644,7 @@ Los otros campos se van a guardar por defecto.
 'htmlform-yes' => 'Si',
 
 # New logging system
-'logentry-newusers-autocreate' => 'El cuento $1 fue crîado otomatika mente',
+'logentry-newusers-autocreate' => 'El cuento de usuario $1 fue {{GENDER:$2|kreado}} otomatikamente',
 'rightsnone' => '(dinguno)',
 
 # Feedback
index b0c8440..2617a17 100644 (file)
@@ -196,7 +196,6 @@ $messages = array(
 'tog-numberheadings' => 'Iwwerschrëften automatesch numeréieren',
 'tog-showtoolbar' => 'Ännerungstoolbar weisen',
 'tog-editondblclick' => 'Säite mat Duebelklick änneren',
-'tog-editsection' => "Linke fir d'Ännere vun eenzelnen Abschnitter weisen",
 'tog-editsectiononrightclick' => 'Eenzel Abschnitter mat Rietsklick änneren',
 'tog-showtoc' => 'Inhaltsverzeechnes weise bei Säite mat méi wéi dräi Iwwerschrëften',
 'tog-rememberpassword' => 'Meng Umeldung mat dësem Browser (fir maximal $1 {{PLURAL:$1|Dag|Deeg}}) verhalen',
@@ -1020,6 +1019,8 @@ Si gouf anscheinend geläscht.",
 'content-not-allowed-here' => '"$1"-Inhalt ass op der Säit [[$2]] net erlaabt',
 'editwarning-warning' => 'Wann Dir dës Säit verloosst kann dat dozou féieren datt Dir all Ännerungen, déi Dir gemaach hutt, verléiert.
 Wann Dir ageloggt sidd, kënnt Dir dës Warnung an der Sektioun "Änneren" vun Ären Astellungen ausschalten.',
+'editpage-notsupportedcontentformat-title' => 'Format vum Inhalt gëtt net ënnerstëtzt',
+'editpage-notsupportedcontentformat-text' => 'De Format vum Inhalt $1 gëtt net vum Modell vum Inhalt $2 ënnerstëtzt.',
 
 # Content models
 'content-model-wikitext' => 'Wikitext',
@@ -2358,7 +2359,7 @@ D'Läsche vu sou Säite gouf limitéiert fir ongewollte Stéierungen op {{SITENA
 'delete-warning-toobig' => "Dës Säit huet eng laang Versiounsgeschicht, méi wéi $1 {{PLURAL:$1|Versioun|Versiounen}}.
 D'Läschen dovu kann zu Stéierungen am Fonctionnement vun {{SITENAME}} féieren;
 dës Aktioun soll mat Virsiicht gemaach ginn.",
-'deleting-backlinks-warning' => "'''Opgepasst:''' Aner Säite linken op d'Säit déi Dir am Gaang sidd ze läschen.",
+'deleting-backlinks-warning' => "'''Opgepasst:''' Aner Säite linken op déi Säit déi Dir am Gaang sidd ze läschen oder déi säit Déi Dir am Gaang sidd ze läschen ass an aner Säiten agebonn.",
 
 # Rollback
 'rollback' => 'Ännerungen zrécksetzen',
@@ -2654,7 +2655,7 @@ Kuckt d'[[Special:BlockList|Spärlëscht]] fir déi aktuell Spären.",
 'range_block_disabled' => 'Dem Administrateur seng Fähegkeet fir ganz Adressberäicher ze spären ass ausser Kraaft.',
 'ipb_expiry_invalid' => "D'Dauer déi Dir uginn hutt ass ongülteg.",
 'ipb_expiry_temp' => 'Verstoppt Späre vu Benotzernimm solle permanent sinn.',
-'ipb_hide_invalid' => 'Dëse Benotzerkont kann net geläscht ginn; et ka sinn datt zevill Ännerunge vun deem Benotzer gemaach goufen.',
+'ipb_hide_invalid' => 'Dëse Benotzerkont kann net geläscht ginn; de Benotzer huet méi wéi {{PLURAL:$1|eng Ännerung|$1 Ännerunge}} gemaach.',
 'ipb_already_blocked' => '"$1" ass scho gespaart.',
 'ipb-needreblock' => "$1 ass scho gespaart. Wëllt Dir d'Parametere vun der Spär änneren?",
 'ipb-otherblocks-header' => 'Aner  {{PLURAL:$1|Spär|Spären}}',
@@ -3752,6 +3753,7 @@ Dir kënnt och [[Special:EditWatchlist|de Standard Editeur benotzen]].",
 'version-ext-colheader-description' => 'Beschreiwung',
 'version-ext-colheader-credits' => 'Auteuren',
 'version-license-title' => 'Lizenz fir $1',
+'version-credits-title' => 'E spezielle Merci fir $1',
 'version-poweredby-credits' => "Dës Wiki funktionéiert mat '''[https://www.mediawiki.org/ MediaWiki]''', Copyright © 2001-$1 $2.",
 'version-poweredby-others' => 'anerer',
 'version-poweredby-translators' => 'translatewiki.net Iwwersetzer',
index 503787f..6198405 100644 (file)
@@ -910,7 +910,7 @@ $messages = array(
 'categories' => 'Категорияр',
 
 # Special:LinkSearch
-'linksearch' => 'КЪецепатан элячIунар жугъурун',
+'linksearch' => 'Къецепатан элячӀунар жугъурун',
 'linksearch-ns' => 'Тlварарин генгвал:',
 'linksearch-ok' => 'Ахтармишун',
 'linksearch-line' => '$2-ай $1-аз элячlун',
index 0e0a733..76e2d35 100644 (file)
@@ -166,7 +166,6 @@ $messages = array(
 'tog-numberheadings' => 'Köpkes automatisch nummere',
 'tog-showtoolbar' => 'Laot edit toolbar zeen',
 'tog-editondblclick' => "Bewirk pagina's bie 'ne dobbelklik (JavaScript)",
-'tog-editsection' => 'Bewirke van secties via [bewirke] links',
 'tog-editsectiononrightclick' => "Secties bewirke mit 'ne rechtermoesklik op sectietitels (JavaScript nudig)",
 'tog-showtoc' => "Inhaudsopgaaf veur pagina's mit mie es 3 köpkes",
 'tog-rememberpassword' => 'Mien wachwaord onthouwe veur later sessies (hoegstens $1 {{PLURAL:$1|daag|daag}})',
index 495a996..e7a71b5 100644 (file)
@@ -25,7 +25,6 @@ $messages = array(
 'tog-numberheadings' => 'سربلگه خود شماره گر',
 'tog-showtoolbar' => 'نوار اوزار ويرايشت نشون بيه',
 'tog-editondblclick' => 'بلگيا نه وا دوبار پورنين ويرايشت بكيد',
-'tog-editsection' => 'ممكن بيئن ويرايشت بشخيا وا [ويرايشت]',
 'tog-editsectiononrightclick' => 'بهر ویرایشت نه وا راس کلیک کردن د بهر عنوانیا فعال کو',
 'tog-showtoc' => 'چیا مئن جدول نشو بیه',
 'tog-rememberpassword' => 'اومائن وا مئن منه د ای مرورگر د ویر داشتو(سی بیشترین$1{{PLURAL:$1|day|days}})',
@@ -146,7 +145,7 @@ $messages = array(
 'category-article-count' => '{{جمی:$2|ای دسه شومل بلگه نهاییه .| {{جمی:$1| بلگه هئ|$1 بلگیا هئن}} د ای دسه, خارج د $2 کل.}}',
 'category-article-count-limited' => 'نها {{جمی:$1|بلگه هئ|$1بلگیا هئن}} د دسه ایسنی .',
 'category-file-count' => '{{جمی:$2|ای دسه فقط شامل فایل نهایی هئ file.| نهایی {{جمی:$1|فایل هئ|$1 فایلیا هئن}} د ای دسه, وه در د کل $2 .}}',
-'category-file-count-limited' => ' {{جمی:$1|فایل هئ|1$فایلیا هئن}}نهایی هان د دسه ایسنی.',
+'category-file-count-limited' => ' {{جمی:$1|[جانیا هئ|1$جانیایا هئن}}نهایی هان د دسه ایسنی.',
 'listingcontinuesabbrev' => 'دماله',
 'index-category' => 'بلگيا سيائه دار',
 'noindex-category' => 'بلگيا بی سيائه',
@@ -213,7 +212,7 @@ $messages = array(
 'delete' => 'حذف كردن',
 'deletethispage' => 'ای بلگه نه حذف بكيد',
 'undeletethispage' => 'ای بلگه نه حذف نكيد',
-'undelete_short' => 'پاک نکو {{جمی:$1|یه گل ویرایشت|$1 ویرایشتیا}}',
+'undelete_short' => 'زنه کردن {{جمی:$1|یه گل ویرایشت|$1 ویرایشتیا}}',
 'viewdeleted_short' => 'بوینیت {{[جمی:$1|یه گل ویرایشت پاک بیه|$1ویرایشتیا پاک بیه}}',
 'protect' => 'حمايت بكيد',
 'protect_change' => 'آلشت بكيد',
@@ -255,7 +254,7 @@ $messages = array(
 'aboutsite' => 'دباره {{SITENAME}}',
 'aboutpage' => 'پروجه:دباره',
 'copyright' => 'محتوا د دسرس هئ سی $1 مر وه شلک هنی نوشته بوئه',
-'copyrightpage' => '{{ns:پروجه}}:کپی رایت',
+'copyrightpage' => '{{ان اس:پروجه}}:کپی رایت',
 'currentevents' => 'پيشومدل تازه باو',
 'currentevents-url' => 'پروجه:پيشومدل تازه باو',
 'disclaimers' => 'منكرون',
@@ -326,7 +325,12 @@ $1',
 
 # Main script and global functions
 'nosuchaction' => 'چنو كاری وجود ناره',
+'nosuchactiontext' => 'کاری که وا یو آر ال مشقص بیه معتور نئ.
+شایت شما یو آر ال نه دروس ننشتیته، یا یه گل هوم پیوند نادرست وارد بیه.
+وه شاید وه یه گل باگ د نرم افزار استفاده بیه وا {{نوم مالگه}} هشاره داشتوه.',
 'nosuchspecialpage' => 'چنو بلگه خاصی وجود ناره',
+'nospecialpagetext' => '<strong>شما سی یه گل بلگه نامعتور درحاست داشتیته.</strong>
+یه گل نوم گه سی  اعتوار بلگه یا بوئه د [[ویجه:بلگه یا ویجه|{{رقم:بلگه یا ویجه}}]] پیدا با.',
 
 # General errors
 'error' => 'خطا',
@@ -339,10 +343,13 @@ $1',
 'laggedslavemode' => 'زنهار:بلگه شايت شومل روزامديا تازه باو نبوئه',
 'readonly' => 'جاگه دونسمنيا بسه بيه',
 'enterlockreason' => 'دلیل قلف کردن نه بنیست،یه وختی سی وا کردن قلف د ویر داشتویت.',
-'missing-article' => 'پاگا داده نتونه بلگه ای با پیدا بکه بجوره.که نومش $1 و $2 هئ.
+'readonlytext' => 'پایگا دونسمنیا ایسه سی دئن ورودی یا تازه یا آلشتگریا هنی قلف بیه،شایت سی منن معمولی پایگا دونسمنی نها وه که ورئرده وه حالت عادیش.
+مدیری که ونه قلف کرده ونه گوته:$1',
+'missing-article' => 'پاگا دونمسمنی نتونه بلگه ای با پیدا بکه بجوره.که نومش $1 و $2 هئ.
 معمولند یه سی یه که فرخ ویرگار رئته دش بیه پاک بیه.',
 'missingarticle-rev' => '(دوواره ديئن#: $1)',
 'missingarticle-diff' => '(فرخ: $1، $2)',
+'readonly_lag' => 'ای پاگا دونسمنی قلف بیه تا اوسه که سرور پایگا دونسمنیا وه مینجاون برسه.',
 'internalerror' => 'خطا داخلی',
 'internalerror_info' => 'خطا داخلی:$1',
 'fileappenderrorread' => 'نبوئه $1 نه اوسه که پیوست بوئه بحونیت.',
@@ -356,13 +363,19 @@ $1',
 'unexpected' => 'ارزایشت ناحاسته: "$1"="$2".',
 'formerror' => 'خطا:نبوئه فرم وه مو بئيت',
 'badarticleerror' => 'ای انجوم دئنی د ای بلگه انجوم نگره.',
+'cannotdelete' => 'بلگه یا فایل$1 نبوئه پاک با.
+شایت یه ایسه وا کسی هنی پاک بیه.',
 'cannotdelete-title' => 'نبوئه بلگه $1 حذف بو',
+'delete-hook-aborted' => 'پاک بیئن وا قلاو جلوگری بیه.
+هیچ توضیئ سیش نئ.',
+'no-null-revision' => 'سی بلگه$1 دوواره خنثی دیئن راس بکید',
 'badtitle' => 'موضو گن',
 'badtitletext' => 'عنوان بلگه حاسته بیه معتور نی،یا  یه گل مئن زونی یا مئن ویکی عنوان غلطه.
 یه شایت شومل یکی با یا بیشتر کاراکتریا نبوئه سی ای موضوعیا استفاده بوئن',
 'viewsource' => 'سرچشمه نه بوينيت',
 'viewsource-title' => 'سرچشمه $1 بوينيت',
 'actionthrottled' => 'عمل جلوگئری بیه',
+'protectedpagetext' => 'دای بلگه نبوئه ویرایشت یا کاریا هنی بکید',
 'viewsourcetext' => 'شما تونیت سرچشمه ای بلگه نه بوینیت و دش ورداریت:',
 'viewyourtext' => 'شما تونیت سرچشمه ویرایشتیا تونه ای د بلگه بوینیت و دشو ورداریت',
 'mycustomcssprotected' => 'شما حق ناریت ای بلگه سی اس اس نه ویرایشت بکید',
@@ -421,6 +434,7 @@ $1',
 'createacct-emailoptional' => 'نشونی ايميل',
 'createacct-email-ph' => 'نوم نشون ايميلتونه وارد بكيت',
 'createacct-another-email-ph' => 'يه گل ايميل وارد بكيت',
+'createaccountmail' => 'د یه گل پاسورد موقتیه بختکی استفاده بکید و ونه سی یه گل نشونی ایمیل ویجه بفرسنیت',
 'createacct-realname' => 'نوم راستكی(مژبوری نيئ)',
 'createaccountreason' => 'دليل',
 'createacct-reason' => 'دليل',
@@ -442,9 +456,14 @@ $1',
 'nocookiesnew' => 'حساو کاروری راس بی،اما شما وامئن نیامایئته.{{نوم مالگه}} د کوکیا سی اومائن د سیستم کاروریا استفاده می که.کوکیا شما د کار افتائه.لطفن وا کارشو بونیت، اوسه وا نوم کاروری تازه و پسورد هنی بیایت وا مئن.',
 'nocookieslogin' => '{{نوم مالگه}} د کوکیا سی وامئن اومائن کاروریا استفاده می که. کوکیا شما د کار افتائه.
 لطف بکید د کارشو بونیت و دوواره تلاش بکید.',
+'nocookiesfornew' => 'حساو کاروری راس نبیه، سی یه ایما نتونیم سرچشمه ونه مئکم بکیم.
+مطمئن بوئیت که کوکیا فعال بینه، ای بلگه نه د نو سوار بکید و د نو تلاش بکید.',
 'noname' => 'شما یه گل نوم کاروری خو ناریت',
 'loginsuccesstitle' => 'اومائن د سيستم موفق بی',
 'loginsuccess' => 'شما ایسه وارد بیته {{SITENAME}} د دعنوان "$1".\'',
+'nosuchuser' => 'چنی کاروری و نوم  "$1" نئیش.
+نوم کاروری وه حرفیا حساس هئ.
+روشت نیسنن تونه وارسی بکید،یا [[ویجه:وامین اومائن کارور/ثوت نام کردن|یه گل حساو تازه راس بکید]].',
 'nosuchusershort' => 'چنو کاروری وا ای نوم $1 نی ئیش.
 نیسنن تونه دوواره نئری بکیتو',
 'nouserspecified' => 'شما باید یه نوم کارور اختصاص بئیتو',
@@ -467,6 +486,8 @@ $1',
 'accountcreated' => 'حساو راس بی',
 'createaccount-title' => 'حساو راس کرده سی  {{SITENAME}}',
 'usernamehasherror' => 'نوم کاربری نتونه شومل نیسه یا هش بوئه',
+'login-throttled' => 'شما ایسنی فره سی وامین اومائن تلاش کردیته.
+$1 لطفن سی تلاش هنی صبر بکید',
 'login-abort-generic' => 'اومائن وامین تو شکست حرد-شکست حرده',
 'loginlanguagelabel' => 'زون:$1',
 
@@ -587,14 +608,27 @@ $1',
 'editingsection' => 'د حال ویرایشت$1(بشخ)',
 'editingcomment' => 'د حال ویرایشت$1(بشخ تازه)',
 'editconflict' => 'تضاد د ویرایشت:$1',
+'explainconflict' => 'داوسه که شما شرو د ویرایشت ای بلگه کردیته، یه نفر هنی ای بلگه نه آلشت دئه.
+راساگه روئی متن بلگه متن نه چی یه که وجود داشتوه د ور میئره.
+آلشتیا شما د متن هاری نشو دئه هئ.
+شما با آلشتیاتونه د متن که هئش یکی بکید.
+فقط متنی که ها د رو د وختی که شما"{{رقم:ذخیره گوتار}}" نه گزارشت می کید ذخیره بوئه',
 'yourtext' => 'متن شما',
+'storedversion' => 'دوواره دیئن انبار بیه.',
 'yourdiff' => 'فرخيا',
 'templatesused' => '{{جمی:$1|قالو|قالویا}}د ای بلگه استفاده بیه:',
+'templatesusedpreview' => '{{جمی:$1|قالو|قالویا}}استفاده بیه د ای پیش سیل:',
+'templatesusedsection' => '{{جمی:$1|قالو|قالویا}} استفاده بیه د ای بخش:',
 'template-protected' => '(حمايت بيه)',
 'template-semiprotected' => '(نيم-حفاظت بيه)',
 'hiddencategories' => 'ای بلگه يه اندوم د{{PLURAL:$1|1 hidden category|$1 hidden categories}}: هئ',
+'nocreatetext' => '{{نوم مالگه}} سی راس کردن بلگه یا تازه محدود بیه.
+شما تونید روئیت وادما و بلگه ای که هئیش ویرایشت بکید ، یا [[ویجه:وامین اومائن کارور|بیایت وامین یا یه گل حساو بسازیت]].',
+'nocreate-loggedin' => 'شما حق ناریت  که بلگه یا تازه نه راس بکید.',
 'sectioneditnotsupported-title' => 'ویرایشت بخش حمایت نبوئه',
+'sectioneditnotsupported-text' => 'ویرایشت بشقی د ای بلگه نئیش.',
 'permissionserrors' => 'خطا اجازه دئین',
+'permissionserrorstext' => 'شما حق ناریت ونه انجوم بیئت, سی{{جمی:$1|دلیل|دلیلیا}} نهایی:',
 'permissionserrorstext-withaction' => 'شما سی $2 اجازه ناریت
 سی دمال کردن{{PLURAL:$1|reason|reasons}}:',
 'recreate-moveddeleted-warn' => "'''زنهار شما بلگه ای که وادما پاک بیه هنی راس کردیته'''
@@ -602,9 +636,16 @@ $1',
 پاک بیئن و جمشت سی ای بلگه سی راحتی تو فراهم بیه:",
 'moveddeleted-notice' => 'ای بلگه پاک بیه.
 پاک بین و جمشت ای بلگه سی سرچشمه دئین فراهم بیه',
+'log-fulllog' => 'دیئن همه پهرستنومه یا',
 'edit-conflict' => 'مخالفت نه ویرایشت بکید',
 'postedit-confirmation' => 'ویرایشتتو ذخیره بی',
+'edit-already-exists' => 'نبوئه یه گل بلگه تازه راس بکید.
+وه هئیش.',
 'defaultmessagetext' => 'متن پیغوم پیش فرض',
+'content-failed-to-parse' => 'د یک تیچیسن چیا مئن $2 د مدل $1:$3',
+'invalid-content-data' => 'دنسمنی مینونه نامعتور',
+'content-not-allowed-here' => ' مینونه"$1" سی بلگه [[$2]] اجازه نه دئه بیه',
+'editpage-notsupportedcontentformat-title' => 'شلک مینونه دماگری نبیه',
 
 # Content models
 'content-model-wikitext' => 'ويكی متن',
@@ -618,12 +659,14 @@ $1',
 'post-expand-template-argument-warning' => 'زنهار ای بلگه شومل حداقل یه قالو سی چک چنه یه که انازه فره گپه.
 گپسنیا پاک بینه.',
 'post-expand-template-argument-category' => 'بلگه شومل قالو چک چنیا د بین رئته',
+'parser-template-loop-warning' => 'حلقه قالو کشف بیه:[[$1]]',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'نبوئه حساو راس بکید',
 
 # History pages
 'viewpagelogs' => 'سی ای بلگه بوینتو.',
+'nohistory' => 'هیچ ویرگار ویرایشتی د ای بلگه نئ.',
 'currentrev' => 'آخرین دوواره دیئن',
 'currentrev-asof' => 'آخرين دووار ديئن چی $1',
 'revisionasof' => 'دوواره ديئن $1',
@@ -642,45 +685,89 @@ $1',
 'history-show-deleted' => 'فقط پاك بيه',
 'histfirst' => 'قديمي تري',
 'histlast' => 'تازه تري',
+'historysize' => '({{جمی:$1|1 بایت|$1 بایتیا}})',
 'historyempty' => '(حالی)',
 
 # Revision feed
 'history-feed-title' => 'ویرگار دوواره دیئن',
+'history-feed-description' => 'دوواره دیئن ویرگار سی بلگه د ویکی',
 'history-feed-item-nocomment' => '$1 د
 $2',
+'history-feed-empty' => 'بلگه حاسته بیه وجود ناره.
+شایت وه د ویکی پاک بیه، یا نومش آلشت بیه.
+سی بلگیا مرتوط تازه [[ویجه:پی جوری|پی جوری د ویکی]] کوششت بکید.',
 
 # Revision deletion
+'rev-deleted-comment' => '(ویرایشت چکسته جا وه جا بیه)',
 'rev-deleted-user' => '(نوم کاروری جا وه جا بیه)',
+'rev-deleted-event' => '(انجوم گر پهرستنومه جا وه جا بیه)',
+'rev-deleted-user-contribs' => '[نوم کاروری یا نشونی آی پی جا وه جا بیه - چیا قام بیه د ور هوم یاریانه ویرایشت بکید]',
 'rev-delundel' => 'آلشت وضئيت ديئن',
 'rev-showdeleted' => 'نشو دائن',
+'revisiondelete' => 'پاک کردن/زنه کردن وانئریا',
+'revdelete-no-file' => 'فایل مشقص بیه وجود ناره.',
 'revdelete-show-file-submit' => 'هری',
+'revdelete-selected' => "'''{{جمی:$2|وانیری انتخاو بیه|وانیریا انتخاو بیه}} د[[:$1]]:'''",
+'revdelete-hide-text' => 'متن دوواره دیئن',
+'revdelete-hide-image' => 'چی یا مئن فایل قام کو',
+'revdelete-hide-name' => 'آرمون و انجوم گر نه قام بکید',
 'revdelete-hide-comment' => 'چکسه نه ویرایشت بکید',
+'revdelete-hide-user' => 'نوم کاروری ویرایشتگر/نشونی آی پی',
 'revdelete-radio-same' => 'آلشت نکید',
 'revdelete-radio-set' => 'قام بیه',
 'revdelete-radio-unset' => 'دیینی',
+'revdelete-unsuppress' => 'محدودیتیانه د وانیریا امباربیه جا وه جا بکید',
 'revdelete-log' => 'دلیل:',
+'revdelete-submit' => 'سی {{جمی:$1|وانیری|وانیریا}} انتخاو بیه وه کار بوریتو',
+'revdelete-success' => "'''دیئن وانیری وه خوئی وه هنگوم بی.'''",
+'revdelete-failure' => "'''دیئن وانیری وه خوئی وه هنگوم نبی:'''$1",
 'revdel-restore' => 'آلشت وضئيت ديئن',
 'pagehist' => 'ويرگار بلگه',
 'deletedhist' => 'ویرگار پاک بیه',
 'revdelete-otherreason' => 'دلیل هنی:',
 'revdelete-reasonotherlist' => 'دلیل هنی',
 'revdelete-edit-reasonlist' => 'دلیلیا پاک کردنه نه ویرایشت بکید',
+'revdelete-offender' => 'نیسنه وانیری:',
 
 # History merging
+'mergehistory' => 'ویرگاریا بلگه نه یکی بکید',
+'mergehistory-header' => 'ای بلگه وه شما اجازه می ئه که وانیریانه ویرگار سرچشمه بلگه نه د یه گل بلگه تازه سریک سازی بکید.
+مطمئن بویت که ای آلشت د لحاظ ویرگاری د مین بلگه موندگار هئ.',
+'mergehistory-box' => 'دوواره دیئن دوبلگه ای نه سر یک سازی کو:',
 'mergehistory-from' => 'بلگه سرچشمه:',
 'mergehistory-into' => 'بلگه مقصد:',
+'mergehistory-list' => 'ویرگار ویرایشت سر یک سازی بیئنی',
+'mergehistory-go' => 'ویرایشتیایی که سریک سازی بوئن نشو بیئه',
+'mergehistory-submit' => 'سر یک سازی دوواره دیئنیا',
+'mergehistory-empty' => 'هیپ دوواره دیئنی نبوئه یکی سازی بوئه.',
+'mergehistory-success' => '$3 {{جمی:$3|وانیری|وانیریا}} د [[:$1]] وه خوئی د [[:$2]] سریک سازی بی.',
+'mergehistory-fail' => 'سریک سازی ویرگار انجوم نبوئه، لطفن پینیاریا زمون و بلگه نه د نو وارسی بکید.',
+'mergehistory-no-source' => 'سرچشمه بلگه $1 وجود ناره.',
+'mergehistory-no-destination' => 'بلگه مقصد $1 وجود ناره.',
+'mergehistory-invalid-source' => 'نوم ون بلگه سرچشمه با معتور بوئه.',
+'mergehistory-invalid-destination' => 'نوم ون بلگه سرچشمه با معتور بوئه.',
+'mergehistory-autocomment' => ' [[:$1]]وا[[:$2]] یکی بیه',
+'mergehistory-comment' => ' [[:$1]]وا[[:$2]] یکی بیه:$3',
+'mergehistory-same-destination' => 'سرچشمه و بلگه یا مقصد نبوئه یکی بوئن',
 'mergehistory-reason' => 'دليل:',
 
 # Merge log
+'mergelog' => 'سریک سازی پهرستنومه',
+'pagemerge-logentry' => ' [[$1]] وا [[$2]] سریک سازی بی (وانیریا که د $3 فره تر هئن)',
 'revertmerge' => 'بی لوئه',
 
 # Diffs
 'history-title' => 'دوواره دیئن ویرگار$1',
+'difference-title' => 'فرخ مینجا وانیریا "$1"',
+'difference-title-multipage' => 'فرخ مینجا بلگه یا "$1" و "$2"',
+'difference-multipage' => '(فرخ مینجا بلگه یا)',
 'lineno' => 'خط $1:',
 'compareselectedversions' => 'دوبار دیئنیایی که انتخاو بینه مقایسه بکیتو',
+'showhideselectedversions' => 'شلک دیئن وانیریا انتخاو بیه نه آلشت بکید',
 'editundo' => 'رد كردن',
 'diff-empty' => '(بی فرق)',
 'diff-multi' => '({{جمی:$1|یه گل دوواره دیئن مینجایی|$1مینجا دوواره دیئنیا}} وا {{جمی:$2|یه کارور|$2 کاروریا}} نشو دئه نی)',
+'diff-multi-manyusers' => '({{جمی:$1|یه گل وانیری مینجاگرته|$1وانیریا مینجا گرته}} بیشتر د $2 {{جمی:$2|کارور|کاروریا}} نشو دئه نبیه)',
 
 # Search results
 'searchresults' => 'نتيجه يا پی جوری',
@@ -690,7 +777,7 @@ $2',
 'nextn' => 'نيايی {{PLURAL:$1|$1}}',
 'prevn-title' => 'پيشتر $1 {{PLURAL:$1|نتيجه|نتيجيا}}',
 'nextn-title' => 'نيايی $1 {{PLURAL:$1|نتيجه|نتيجيا}}',
-'shown-title' => 'نشون دئن $1 {{PLURAL:$1|نتيجه|نتيجه}} سی هر بلگه',
+'shown-title' => 'نشون دئن $1 {{جمی:$1|نتيجه|نتيجه}} سی هر بلگه',
 'viewprevnext' => 'ديئن ($1 {{int:pipe-separator}} $2) ($3)',
 'searchmenu-exists' => "'''ایچه بلگه ای هئ وه نوم\"[[:\$1]]\" که ها د ای ویکی'''",
 'searchmenu-new' => "'''ای بلگه نه راس كو \"[[:\$1]]\" د ای  ويكي!'''",
@@ -704,18 +791,23 @@ $2',
 'searchprofile-images-tooltip' => 'بگرد سی فايليا',
 'searchprofile-everything-tooltip' => 'همه محتوا نه پی جوری كو (شاملا بلگيا چك چنه)',
 'searchprofile-advanced-tooltip' => 'نوم جايا نوم ديار بگرد',
-'search-result-size' => '$1 ({{PLURAL:$2|بی واچه يل|واچه تكی|واچه يل|$2 واچه يل|$2 واچه}})',
-'search-result-category-size' => '{{جمی:$1|1 اندوم|$1 اندومیا}} ({{جمی:$2|1 زیردسه|$2 زیردسه یا}}, {{جمی:$3|1 فایل|$3 فایلیا}}',
+'search-result-size' => '$1 ({{جمی:$2|بی واچه يل|واچه تكی|واچه يل|$2 واچه يل|$2 واچه}})',
+'search-result-category-size' => '{{جمی:$1|1 اندوم|$1 اندومیا}} ({{جمی:$2|1 زیردسه|$2 زیردسه یا}}, {{جمی:$3|1 جانیا|$3 جانیایا}}',
 'search-redirect' => '(ورگشتن $1)',
 'search-section' => '(بشق $1)',
+'search-file-match' => '(یکی کردن مینونه جانیا)',
 'search-suggest' => 'منظورت يه بی:$1',
+'search-interwiki-caption' => 'پروجه یا خوئر',
+'search-interwiki-default' => '$1 نتیجه یا:',
 'search-interwiki-more' => '(بیشتر)',
 'search-relatedarticle' => 'مرتوط',
+'searcheverything-enable' => 'همه نوم جايا نوم ديار بگرد',
 'searchrelated' => 'مرتوط',
 'searchall' => 'همه',
 'showingresultsheader' => "{{PLURAL:$5|نتيجه '''$1''' د'''$3'''|نتيجه يا '''$1 - $2''' د'''$3'''}} سيli'''$4'''",
 'search-nonefound' => 'هیژ نتیجه یی سی پی جست تو مطاوقت نکرده',
 'powersearch-legend' => 'پی جوری پیشبرده',
+'powersearch-ns' => 'نوم جايا نوم ديار بگرد:',
 'powersearch-togglelabel' => 'چك كردن:',
 'powersearch-toggleall' => 'همه',
 'powersearch-togglenone' => 'هيش كوم',
@@ -732,20 +824,28 @@ $2',
 'prefs-personal' => 'پروفایل کارور',
 'prefs-rc' => 'آلشتیا تازه باو',
 'prefs-watchlist' => 'سیل برگ',
+'prefs-watchlist-days' => 'روزیا نه د سیل برگ نشو دئه بو:',
+'prefs-watchlist-edits-max' => 'فره تری شماره:1000',
 'prefs-misc' => 'شيوسن',
 'prefs-resetpass' => 'پاسورد نه آلشت بكيت',
 'prefs-changeemail' => 'نشونی ایمیل تو نه آلشت بکید',
+'prefs-setemail' => 'يه گل ايميل بنیت',
+'prefs-rendering' => 'شلک و ری',
 'saveprefs' => 'ذخيره كردن',
 'prefs-editing' => 'د حالت ويرايشت',
 'rows' => 'رديفيا:',
 'columns' => 'ستينا:',
 'searchresultshead' => 'پی جوری',
 'stub-threshold-disabled' => 'د كار ونن',
+'recentchangesdays' => 'روزیا آلشتیا تازه باو نه نشو بیه:',
+'recentchangesdays-max' => 'فره ترین $1 {{جمی:$1|روز|روزیا}}',
+'prefs-help-recentchangescount' => 'یه شامل آلشتیا تازه،ویرگاریا بلگه و پهرستنومه یا هئ.',
 'savedprefs' => 'ویجه گیا هنی تو ذخیره بیه.',
 'timezonelegend' => 'وخت راساگه',
 'localtime' => 'وخت ولاتی:',
 'timezoneuseserverdefault' => 'وخت راساگه',
 'servertime' => 'وخت سرور:',
+'guesstimezone' => 'وا جاگرد پر بوئه',
 'timezoneregion-africa' => 'افرقا',
 'timezoneregion-america' => 'امركا',
 'timezoneregion-antarctica' => 'قطو هار ونه',
@@ -756,16 +856,22 @@ $2',
 'timezoneregion-europe' => 'اوروپا',
 'timezoneregion-indian' => 'جهوناو هند',
 'timezoneregion-pacific' => 'جهوناو آروم',
+'allowemail' => 'ایمیل سی کاروریا هنی فعال کو',
 'prefs-searchoptions' => 'پی جوری',
 'prefs-namespaces' => 'نوم جایا',
 'default' => 'پيش فرض',
 'prefs-files' => 'فايلا',
 'prefs-emailconfirm-label' => 'مئکم کردن ایمیل:',
 'youremail' => 'ايميل:',
+'username' => '{{جنس:$1|نوم کاروری}}:',
+'uid' => '{{جنس:$1|کارور}}آی دی:',
+'prefs-memberingroups' => '{{جنس:$2|اندوم}}  {{جمی:$1|گرویا|گرویا}}:',
 'prefs-registration' => 'موقع ثوت نام:',
 'yourrealname' => 'نوم راستكی:',
 'yourlanguage' => 'زون:',
+'yourvariant' => 'محتوا آلشتگر زون:',
 'yournick' => 'امضا تازه:',
+'yourgender' => 'شما بیشتر میهایت که چه جوری گوته بوئه؟',
 'gender-unknown' => 'مه میهام چی یی نموئم',
 'gender-male' => 'وه(پیا) بلگه یا ویکی نه ویرایشت می که',
 'gender-female' => 'وه(زئنه)بلگه یا ویکی نه ویرایشت می که',
@@ -777,10 +883,23 @@ $2',
 'prefs-info' => 'دونسمنیا اولیه',
 'prefs-i18n' => 'جهون ولاتمنی',
 'prefs-signature' => 'امضا',
+'prefs-dateformat' => 'شلک وخت',
+'prefs-advancedediting' => 'گزینه یا عمومی',
 'prefs-editor' => 'ويرايشتگر',
 'prefs-preview' => 'پیش سیل',
+'prefs-advancedrc' => 'گزینه یا پیشکرده',
+'prefs-advancedrendering' => 'گزینه یا پیشکرده',
+'prefs-advancedsearchoptions' => 'گزینه یا پیشکرده',
+'prefs-advancedwatchlist' => 'گزینه یا پیشکرده',
+'prefs-displayrc' => 'گزینه یا نه نشو بیه',
+'prefs-displaysearchoptions' => 'گزینه یا نه نشو بیه',
+'prefs-displaywatchlist' => 'گزینه یا نه نشو بیه',
 'prefs-diffs' => 'فرخیا',
 
+# User preference: email validation using jQuery
+'email-address-validity-valid' => 'نشونی ایمیل دیار بیه خوئه',
+'email-address-validity-invalid' => 'یه گل نشونی ایمیل خو وارد بکید',
+
 # User rights
 'userrights-user-editname' => 'نوم كاروری ته وارد كو',
 'editusergroup' => 'ویرایشت گرویا کاروری',
@@ -788,6 +907,9 @@ $2',
 'saveusergroups' => 'ذخیره کرد گرویا کاروری',
 'userrights-groupsmember' => 'اندوم:',
 'userrights-reason' => 'دليل:',
+'userrights-no-interwiki' => 'شما سی ویرایشت حقوق کارور د ویکی یا هنی دسرسی ناریت.',
+'userrights-nodatabase' => 'پاگا دونسمنی $1 یا نیئش یا د ولاتنشین نئ.',
+'userrights-notallowed' => 'شما سی اضاف کردن  حقوق کارور یا ورداشتنش دسرسی ناریت.',
 'userrights-changeable-col' => 'گرویایی که شما تونیت ویرایشت بکید',
 'userrights-unchangeable-col' => 'گرویایی که شما نتونیت ویرایشت بکید',
 
@@ -805,26 +927,80 @@ $2',
 'group-sysop-member' => '{{جنس:$1|مدیر}}',
 'group-bureaucrat-member' => '{{جنس:$1|بروکرات}}',
 
+'grouppage-user' => '{{ns:project}}:کاروریا',
+'grouppage-bot' => '{{ns:project}}:بوت یا',
+'grouppage-bureaucrat' => '{{ns:project}}:دیوونداریا',
+
 # Rights
 'right-read' => 'حنن بلگیا',
 'right-edit' => 'ویرایشت بلگیا',
+'right-move' => 'بلگه یا جا وه جا کو',
+'right-move-subpages' => 'بلگه یا و زیر بلگه یا شونه جا وه جا کو',
+'right-move-rootuserpages' => 'بلگه یا ریشه ای کارور نه جا وه جا کو',
+'right-movefile' => 'فایلیا نه جا وه جا کو',
+'right-upload' => 'سوار کردن فايلا',
+'right-upload_by_url' => 'سوار کرد فایلیا د یو آر ال',
+'right-writeapi' => 'د نیسنن ای پی آی استفاده بکید',
 'right-delete' => 'بلگیا نه پاک کو',
+'right-browsearchive' => 'بلگه یا پاک بیه نه پی جوری کو',
+'right-undelete' => 'ای بلگه نه حذف نكيد',
+'right-suppressionlog' => 'دیئن پهرستنومه یا خصوصی',
+'right-unblockself' => 'خوشه قلف نکید',
+'right-editinterface' => 'راوط کارور نه ویرایشت کو',
+'right-editusercssjs' => 'فایلیا جاوا اسکریپت و سی اس اس کاروریا هنی نه ویرایشت کو',
+'right-editusercss' => 'فایلیا سی اس اس کاروریا هنی نه ویرایشت کو',
+'right-edituserjs' => 'فایلیا جاوا اسکریپت کاروریا هنی نه ویرایشت کو',
+'right-editmyusercss' => 'فایلیا سی اس اس کارور خوتو نه ویرایشت کو',
+'right-editmyuserjs' => 'فایلیا جاوا اسکریپت کارور خوتو نه ویرایشت کو',
+'right-viewmywatchlist' => 'سیل برگ خوتونه بوینیت',
+'right-viewmyprivateinfo' => 'دونسمنیا شصقی خوتونه بوینیت(چی نشونی ایمیل،نوم راستکی)',
+'right-editmyprivateinfo' => 'دونسمنیا شصقی خوتونه ویرایشت بکید(چی نشونی ایمیل،نوم راستکی)',
+'right-importupload' => 'دئن بلگه یا د یه گل جانیا سوار بیه',
+'right-siteadmin' => 'پاگا دونسمنی نه قلف بکید یا نکید',
+'right-sendemail' => 'سی کاروریا هنی ایمیل کل بکید',
+'right-passwordreset' => 'پاسورد ایمیلیا د نو دئه بیه نه بوینیت',
 
 # Special:Log/newusers
 'newuserlogpage' => 'راس بیه وا کارور',
+'newuserlogpagetext' => 'یه پهرستنومه راس بیئن کارور هئ.',
+
+# User rights log
+'rightslogtext' => 'یه پهرستنومه آلشتیا حقوق کارور هئ.',
 
 # Associated actions - in the sentence "You do not have permission to X"
 '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-upload_by_url' => 'ای فایله نه د یو آر ال سوار بکید',
+'action-writeapi' => 'د نیسنن ای پی آی استفاده بکید',
 'action-delete' => 'ای بلگه نه پاک کو',
 'action-deleterevision' => 'ای بازدئین پاک کو',
+'action-deletedhistory' => 'ویرگار پاک بیه ای بلگه نه بوینیت',
+'action-browsearchive' => 'بلگه یا پاک بیه نه پی جوری بکید',
 'action-undelete' => 'ای بلگه نه پاک نکو',
+'action-suppressionlog' => 'ای پهرستنومه خصوصی نه بوینیت',
+'action-block' => 'ای کارور نه د ویرایشت کردن منع کو',
+'action-protect' => 'ریترازیا حفاظت د ای بلگه نه آلشت بکید',
+'action-import' => 'بلگه یا نه د ویکی هنی وارد بکید',
+'action-importupload' => 'بلگه یا نه د فایل سوار بیه وارد بکید',
+'action-siteadmin' => 'پاگا دونسمنی نه قلف بکید یا نکید',
 'action-sendemail' => 'ایمیلیانه کل کو',
+'action-editmywatchlist' => 'سیل برگ خوتونه ویرایشت بکید',
+'action-viewmywatchlist' => 'سیل برگ خوتونه بوینیت',
+'action-viewmyprivateinfo' => 'دونسمنیا خوتونه بوینیت',
+'action-editmyprivateinfo' => 'دونسمنیا شصقی خوتونه ویرایشت بکید',
 
 # Recent changes
 'nchanges' => '$1 {{جمی:$1|آلشت|آلشتیا}}',
+'enhancedrc-since-last-visit' => '$1 {{جمی:$1|د آخری دیئن}}',
 'enhancedrc-history' => 'ويرگار',
 'recentchanges' => 'تغيريا تازه',
 'recentchanges-legend' => 'گزينه يا آلشتيا تازه',
@@ -833,6 +1009,7 @@ $2',
 'recentchanges-label-minor' => 'يه ويرايشت كؤچكيه',
 'recentchanges-label-bot' => 'ای ويرايشت نه يه بوت انجوم ديئه',
 'recentchanges-label-unpatrolled' => 'ای ويرايشت هنی تيه واداشت نبيه',
+'recentchanges-legend-newpage' => '(همچنو بوینیت [[ویجه:بلگیا تازه|نوم گه بلگیا تازه]])',
 'rcnotefrom' => 'د هار آلشتیا د $2 هیئن(د بال د $1 نشون دئه بیه)',
 'rclistfrom' => 'آلشتیا تازه ایی که وا $1 شرو بیه نشونش بئه',
 'rcshowhideminor' => 'ويرايشتيا کؤچک $1',
@@ -849,12 +1026,18 @@ $2',
 'minoreditletter' => 'م',
 'newpageletter' => 'ن',
 'boteditletter' => 'ب',
+'number_of_watching_users_pageview' => '[$1 دینه {{جمی:$1|کارور|کاروریا}}]',
+'rc_categories' => 'دسه یا نه محدود کو(وا "|" جگا بوئن',
 'rc_categories_any' => 'هرکوم',
+'rc-change-size-new' => '$1 {{جمی:$1|بایت|بایتیا}} نها آلشت',
+'newsectionsummary' => '/* $1 */ بخش تازه',
 'rc-enhanced-expand' => 'جزيات نشون بيئه',
 'rc-enhanced-hide' => 'جزياته قام كو',
+'rc-old-title' => 'ذاتا چی "$1" راس بیه',
 
 # Recent changes linked
 'recentchangeslinked' => 'تغيريا مرتبط',
+'recentchangeslinked-feed' => 'آلشتیا مرتبط',
 'recentchangeslinked-toolbox' => 'تغيريا مرتبط',
 'recentchangeslinked-title' => 'آلشتيا مرتوط وا $1',
 'recentchangeslinked-summary' => 'ای نوم گه تازه د بلگیایی که وا بلگیا ویجه هوم پیوند بینه آلشت بیه(یا سی اندومیا دسه بنی بیه)
@@ -865,24 +1048,86 @@ $2',
 # Upload
 'upload' => 'بلم گير كردن فايلا',
 'uploadbtn' => 'سوار کردن فایل',
+'reuploaddesc' => 'سوار کردن نه رد بکید و د ورئردیت جابلگ سوارکرد',
 'uploadnologin' => 'وارد نبیه',
+'uploadnologintext' => 'لطفن $1 سی سوارکرد جانیایا.',
 'uploaderror' => 'خطا د سوار کردن',
+'uploadlog' => 'پهرستنومه سوارکرد',
 'uploadlogpage' => 'سوارکرد',
 'filename' => 'نوم فایل',
 'filedesc' => 'چكسته',
 'fileuploadsummary' => 'چکسه',
+'filereuploadsummary' => 'آلشتیا فایل:',
 'filesource' => 'سرچشمه:',
+'uploadedfiles' => 'جانیایا سواربیه',
+'badfilename' => 'نوم جانیا د "$1" آلشت بیه.',
+'empty-file' => 'فایلی که دئی ته حالی بیه.',
+'file-too-large' => 'فایلی که دئی ته فره گپ بی.',
+'filename-tooshort' => 'نوم فایل فره کؤچکه.',
+'illegal-filename' => 'نوم فایل اجاره ندئه بیه.',
+'unknown-error' => 'یه گل خطا نادیار ری ون کرده.',
+'savefile' => 'جانیا نه ذخیره کو',
 'uploadedimage' => 'سوارکرد"[[$1]]"',
+'overwroteimage' => 'یه گل نسقه تازه د "[[$1]]" سوار بیه',
+'uploaddisabled' => 'سوار کردن د کار نئ.',
+'copyuploaddisabled' => 'سوار کردن وا یو آر ال د کار نئ.',
+'uploadfromurl-queued' => 'سوارکرد تو ها د گئ.',
+'uploaddisabledtext' => 'سوار کرد فایلیا د کار نئ.',
 'upload-source' => 'سرچشمه فایل',
+'sourcefilename' => 'سرچشمه نوم جانیا:',
+'sourceurl' => 'سرچشمه يو آر ال:',
+'destfilename' => 'نوم فایل مقصد:',
+'watchthisupload' => 'ای جانیا نه بوینیت',
+'upload-success-subj' => 'سوار کرد خوش سرانجوم',
+'upload-success-msg' => 'سوارکرد شما سی [$2] خوو بی.وه د ایچه هئش:[[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'مشگل د سوارکردن',
+'upload-failure-msg' => 'یه گل مشلگل د سوارکردتو سی [$2] بی:$1',
+
+'upload-proto-error' => 'پروتکل نادروس',
+'upload-file-error' => 'خطا مینونه',
+'upload-misc-error' => 'خطا سوار کرد ناشناخته',
+'upload-unknown-size' => 'انازه نادیار',
+'upload-copy-upload-invalid-domain' => 'ورداشتن سوارکردیا د ای پوشگئر د دسرس نئ.',
+
+# File backend
+'backend-fail-notexists' => 'فایل $1 وجود ناره.',
+'backend-fail-delete' => 'نبوئه جانیا $1 پاک بوئه',
+'backend-fail-describe' => 'نبوئه گپ دونسمنیا سی جانیا"$1" آلشت بوئه.',
+'backend-fail-store' => 'نبوئه جانیا "$1" د "$2" امبار بوئه.',
+'backend-fail-move' => 'نبوئه جانیا "$1" د "$2" جا وه جا بوئه',
+'backend-fail-opentemp' => 'نبوئه جانیا موقتی وا بوئه.',
+'backend-fail-writetemp' => 'نبوئه د جانیا موقتی چی بنیسیت.',
+'backend-fail-read' => 'نبوئه جانیا"$1" حنه بوئه.',
+
+# Lock manager
+'lockmanager-fail-closelock' => 'نبوئه قلف جانیا سی "$1" بسه بوئه.',
+'lockmanager-fail-openlock' => 'نبوئه قلف جانیا سی "$1" وا بوئه.',
+
+# Special:UploadStash
+'uploadstash-refresh' => 'نومه گه جانیایا نه د نو تازه کو',
 
 # img_auth script messages
 'img-auth-accessdenied' => 'دسرسی منع بی',
+'img-auth-nofile' => 'فایل $1 وجود ناره.',
+
+# HTTP errors
+'http-invalid-url' => 'یو آر ال نامعتور:$1',
+'http-read-error' => 'خطا د حنن اچ تی تی پی.',
+
+# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
+'upload-curl-error28' => 'تموم بیئن مئلت سی سوار کرد',
 
 'license' => 'ليانس دار بيئن',
 'license-header' => 'د شكل ليسانس دار بيئن',
+'nolicense' => 'هیچی انتخاو نبیه',
+'license-nopreview' => '(پیش سیل د دسرس نئ)',
+'upload_source_file' => '(یه گل فایل د انجومیار تو)',
 
 # Special:ListFiles
+'listfiles-summary' => 'ای بلگه یا ویجه همه جانیایا سوار بیه نه نشو می ئین.',
+'listfiles_search_for' => 'پی جوری سی نوم رسانه:',
 'imgfile' => 'فايل',
+'listfiles' => 'نوم گه فایل',
 'listfiles_thumb' => 'بن کلکی',
 'listfiles_date' => 'تاريخ',
 'listfiles_name' => 'نوم',
@@ -904,49 +1149,114 @@ $2',
 'filehist-datetime' => 'ويرگار/وخت',
 'filehist-thumb' => 'عسگ كؤچك بيه',
 'filehist-thumbtext' => 'كؤچك كردن سی  نسقه چی $1',
+'filehist-nothumb' => 'هیچ بن کلیکی نئ',
 'filehist-user' => 'كارور',
 'filehist-dimensions' => 'بعديا',
 'filehist-filesize' => 'انازه فایل',
 'filehist-comment' => 'نظر',
+'filehist-missing' => 'گم بیئن جانیا',
 'imagelinks' => 'استفاده د فايل',
 'linkstoimage' => 'دمال بيه {{PLURAL:$1|ديس ونيا بلگه|$1 ديس ون بلگيا}} دای فایل:',
 'nolinkstoimage' => 'ایچه هیژ بلگه ای سی هوم پیوند بیئن وا ای فایل نی',
+'morelinkstoimage' => ' [[ویجه:چه هوم پیوندی ها ایچه/$1|هوم پیوندیا هنی]]سی ای فایل بونیت.',
+'sharedupload' => 'ای جانیا که د $1 هئ شایت د پروجه یا هنی استفاده بیه.',
 'sharedupload-desc-here' => 'فایلی که د $1 شایت د مئن پروجیا هنی استفاده بیه.
 توضی دباره[$2 file description page] د هار نشو دئئه بیه',
+'filepage-nofile' => 'چنو فایلی وا ای نوم نئ.',
+'uploadnewversion-linktext' => 'یه گل نسقه تازه د ای جانیا سوار بکید',
+'shared-repo-from' => 'د $1',
+
+# File reversion
+'filerevert-comment' => 'دليل:',
+'filerevert-submit' => 'ورگنین',
 
 # File deletion
+'filedelete' => '$1 پاک کو',
+'filedelete-legend' => 'فایل نه پاک کو',
 'filedelete-comment' => 'دليل:',
 'filedelete-submit' => 'پاك كردن',
+'filedelete-success' => '$1 پاک بیه.',
+'filedelete-nofile' => "'''$1''' وجود ناره.",
+'filedelete-otherreason' => 'دلیل هنی:',
+'filedelete-reason-otherlist' => 'دليل هنی',
+'filedelete-edit-reasonlist' => 'دلیلیا پاک کردنه نه ویرایشت بکید',
+'filedelete-maintenance-title' => 'نبوئه ای فایل پاک بوئه',
 
 # MIME search
+'mimesearch' => 'پی جوری ام آی ام ای',
 'download' => 'گرتن',
 
+# Unwatched pages
+'unwatchedpages' => 'بلگه یا ندئیه بیه',
+
 # Unused templates
+'unusedtemplates' => 'قالویا وه کار نبرده بیه.',
 'unusedtemplateswlh' => 'هوم پیوندیا هنی',
 
 # Random page
 'randompage' => 'بلگه بختكی',
 
 # Random page in category
+'randomincategory' => 'بلگه بختی د ای دسه',
+'randomincategory-invalidcategory' => '"$1"  نوم دسه معتوری نئ.',
+'randomincategory-nopages' => 'هیچ بلگه ای د ای  [[:دسه نئ:$1|$1]] دسه.',
 'randomincategory-selectcategory-submit' => 'رو',
 
 # Statistics
 'statistics' => 'آماريا',
+'statistics-header-pages' => 'بلگه آماریا',
+'statistics-header-edits' => 'آماریا نه ویرایشت بکید',
+'statistics-header-views' => 'آماریا نه بوینیت',
+'statistics-header-users' => 'آماریا کارور',
+'statistics-header-hooks' => 'آماریا هنی',
+'statistics-articles' => 'بلگه یا مینونه',
 'statistics-pages' => 'بلگیا',
+'statistics-files' => 'جانیا یا سوار بیه',
+'statistics-views-total' => 'همه نه بوینیت',
+'statistics-views-peredit' => 'هر ویرایشت نه بوینیت',
 'statistics-users-active' => 'کاروریا کارکو',
+'statistics-mostpopular' => 'بلگه یایی که بیشتر دیئه بینه',
 
 'pageswithprop-submit' => 'رو',
 
 'brokenredirects-edit' => 'ویرایشت',
 'brokenredirects-delete' => 'پاك كردن',
 
+'withoutinterwiki' => 'بلگه یایی که هوم پیوند زون نارن',
 'withoutinterwiki-legend' => 'پیشون',
 'withoutinterwiki-submit' => 'نشون دائن',
 
 # Miscellaneous special pages
-'nbytes' => '$1{{PLURAL:$1|كلی|بايت|بايت}}',
+'nbytes' => '$1{{جمی:$1|كلی|بايت|بايت}}',
+'ncategories' => '{{جمی:$1|دسه|دسه يا}}',
+'ninterwikis' => '$1 {{جمی:$1|مئن ویکی|مئن ویکیا}}',
+'nlinks' => '$1 {{جمی:$1|هوم پیوند|هوم پیوندیا}}',
 'nmembers' => '$1 {{PLURAL:$1|اندوم|اندوميا}}',
+'nmemberschanged' => '$1 → $2 {{جمی:$2|اندوم|اندومیا}}',
+'nviews' => '$1 {{جمی:$1|دیئن|دیئنیا}}',
+'nimagelinks' => '$1 {{جمی:$1|بلگه|بلگيا}} استفاده بیه',
+'ntransclusions' => '$1 {{جمی:$1|بلگه|بلگيا}} استفاده بیه',
+'lonelypages' => 'بلگه یا تک منه',
+'uncategorizedpages' => 'بلگه یا دسه بنی نبیه',
+'uncategorizedcategories' => 'دسه یا دسه بنی نبیه',
+'uncategorizedimages' => 'فایلیا دسه بنی نبیه',
+'uncategorizedtemplates' => 'قالویا دسه بنی نبیه',
+'unusedcategories' => 'دسه یا استفاده نبیه',
+'unusedimages' => 'فایلیا استفاده نبیه',
+'popularpages' => 'بلگه یا حاستنی',
+'wantedcategories' => 'بلگه یا حاستنی',
+'wantedpages' => 'بلگه یا حاستنی',
+'wantedfiles' => 'فایلیا حاستنی',
+'wantedtemplates' => 'قالویا حاستنی',
+'mostlinked' => 'بلگه یا که بیشتر هوم پیوند بینه',
+'mostlinkedcategories' => 'دسه یایی که بیشتر هوم پیوند بیه',
+'mostlinkedtemplates' => 'قالویایی که بیشتر هوم پیوند بینه',
+'mostcategories' => 'بلگه یا که بیشتر دسه بنی بینه',
+'mostimages' => 'فایلیایی که بیشتر هوم پیوند بینه',
 'prefixindex' => 'همه بلگيا وا پيشون',
+'shortpages' => 'بلگه یا کؤچک',
+'longpages' => 'بلگه یا گپ',
+'protectedpages' => 'بلگه یا حفاظت بيه',
 'usercreated' => '{{جنسیت:$3|راس بیه}}د $1 at $2',
 'newpages' => 'بلگيا نو',
 'move' => 'جاوه جا بوئيت',
@@ -960,6 +1270,7 @@ $2',
 
 # Special:Log
 'log' => 'نیسنن رخ ونیا',
+'all-logs-page' => 'همه پهرستنومه یا عمومی',
 
 # Special:AllPages
 'allpages' => 'همه بلگيا',
@@ -967,6 +1278,8 @@ $2',
 $2',
 'allarticles' => 'همه بلگيا',
 'allpagessubmit' => 'رو',
+'allpagesbadtitle' => 'عنوان بلگه حاسته بیه معتور نی،یا  یه گل مئن زونی یا مئن ویکی عنوان غلطه.
+یه شایت شومل یکی با یا بیشتر کاراکتریا نبوئه که سی ای موضوعیا استفاده بوئن',
 
 # Special:Categories
 'categories' => 'دسه يا',
@@ -984,6 +1297,8 @@ $2',
 'watchlist' => 'سیل برگ',
 'mywatchlist' => 'سیل برگ',
 'watchlistfor2' => 'سي $1 $2',
+'watchnologin' => 'وارد نبیه',
+'watchnologintext' => 'شما سی آلشت دئن سیل برگتو با [[ویجه:وامین اومائن کارور|وامین اومائه]]',
 'watch' => 'سيل كردن',
 'unwatch' => 'ديه نبيه',
 'watchlist-details' => '{{جمی:$1|$1 بلگه|$1 بلگیا}} د سیل برگتو هیش بلگه قسه کردن نی .',
@@ -994,17 +1309,32 @@ $2',
 'actioncomplete' => 'عملكرد كامل بيه',
 'actionfailed' => 'عملكرد شكست حرده',
 'dellogpage' => 'لاگ پاك كردن',
+'deletionlog' => 'پهرستنومه پاک بیئن',
 
 # Rollback
 'rollbacklink' => 'ورگشتن',
 
+# Edit tokens
+'sessionfailure-title' => 'شکست حردن نشینگه',
+
 # Protect
 'protectlogpage' => 'حفاظت کردن',
 'protectedarticle' => 'حفاظت بيه [[$1]]',
+'modifiedarticleprotection' => 'ریتراز حفاظت د "[[$1]]" آلشت بیه',
+'protect-title' => 'ریتراز حفاظت د "$1" آلشت بیه',
+'restriction-type' => 'دسرسی:',
+
+# Restrictions (nouns)
+'restriction-upload' => 'سوار کرد',
+
+# Restriction levels
+'restriction-level-all' => 'هر ریترازی',
 
 # Undelete
 'undeletelink' => 'بوين/دوواره آماده با',
 'undeleteviewlink' => 'ديئن',
+'cannotundelete' => 'زنه کردن انجوم نبی:$1',
+'undelete-error-short' => 'خطا پاک نبیئن جانیا:$1',
 
 # Namespace form on various pages
 'namespace' => 'نوم جا:',
@@ -1060,20 +1390,37 @@ $2',
 'block-log-flags-nocreate' => 'حساو راس کردن عاجز بیه.',
 
 # Move page
+'movenotallowed' => 'شما وه جا وه جا کردن بلگه دسرسی ناریت',
+'movenotallowedfile' => 'شما وه جا وه جا کردن جانیایا دسرسی ناریت',
 'movelogpage' => 'جاوه جا کردن',
 'revertmove' => 'لرستن',
 
 # Export
 'export' => 'وه صحرا ديئن بلگيا',
+'export-download' => 'ذخیره کردن جانیا',
 
 # Namespace 8 related
 'allmessagesname' => 'نوم',
 'allmessagesdefault' => 'سفارشت متنی پيش فرض',
+'allmessages-language' => 'زون:',
 
 # Thumbnails
 'thumbnail-more' => 'گپ كردن',
+'filemissing' => 'گم بیئن جانیا',
 'thumbnail_error' => 'خطا د راس بیئن بن کلئکی:$1',
 
+# Special:Import
+'import-upload-filename' => 'نوم جانیا:',
+'import-comment' => 'ویر و باور:',
+'importcantopen' => 'نبوئه جانیا دئه بیه نه وا بکید',
+'importnofile' => 'هیچ جانیا دئه بیه ای سوار نبیه.',
+'import-upload' => 'سوار کرد دونسمنیا ایکس ام ال',
+'import-token-mismatch' => 'کمبود د دونسمنیا نشینگه.
+لطفن هنی کوششت بکید.',
+
+# Import log
+'importlogpage' => 'پهرستنومه دئن',
+
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'بلگه كارورتو',
 'tooltip-pt-mytalk' => 'بلگه قسه كردن شما',
@@ -1081,6 +1428,7 @@ $2',
 'tooltip-pt-watchlist' => 'نوم نوشت د بلگه يايی كه شما آلشتاشونه پيگئری  ميكيد',
 'tooltip-pt-mycontris' => 'يه گل د هومياريا شما',
 'tooltip-pt-login' => 'توصيه بو كه وارد بوئين، اما مجبوری ني',
+'tooltip-pt-anonlogin' => 'توصيه بو كه وارد بوئين، اما مجبوری ني',
 'tooltip-pt-logout' => 'د سيستم دراومائن',
 'tooltip-ca-talk' => 'قسه دباره محتوا بلگه',
 'tooltip-ca-edit' => 'شما تونيد ای  بلگه نه ويرايشت بكيد. لطف بكيد د دگمه پيش ديئن پيش د ذخيره كردن استفاده بكيد',
@@ -1126,11 +1474,22 @@ $2',
 'tooltip-diff' => 'آلشتیا نه که شما د ای متن راس کردیته نشو بیئه',
 'tooltip-compareselectedversions' => 'فرخیا مینجا دو تا د دو بار دیئن ای بلگه نه بوینیت',
 'tooltip-watch' => 'ای بلگه نه د سیل برگتو اضاف بکید',
+'tooltip-upload' => 'شرو د سوار کرد',
 'tooltip-rollback' => '"ورگشتن" لرستن د حالت اول  سی ای بلگه  که سی  يه كه هومياری  نيايی اصلاح بيه وا يه پورنسن',
 'tooltip-undo' => 'انجوم نگرتن ای ویرایشت ورگن و همه فرمیا ویرایشت تانه که حالت پیش سیل واکو.یه اجازه میئه سی اضاف کردن یه دلیل د چکسته.',
 'tooltip-summary' => 'يه چكسته كؤچك وارد بكيد',
 'interlanguage-link-title' => '$1-$2',
 
+# Info page
+'pageinfo-language' => 'بلگه مینونه زون',
+'pageinfo-category-files' => 'شماره جانیایا',
+
+# Patrol log
+'patrol-log-page' => 'پهرستنومه گشتن',
+
+# Image deletion
+'filedeleteerror-short' => 'خطا پاک نبیئن جانیا:$1',
+
 # Browsing diffs
 'previousdiff' => '← ويرايشت كۈهنه تر',
 'nextdiff' => 'ويرايشت تازه تر',
@@ -1141,6 +1500,12 @@ $2',
 'svg-long-desc' => 'اس وی جی فايل.نومنا $1 $2 پيكسل',
 'show-big-image' => 'فایل اصلی',
 
+# Special:NewFiles
+'newimages' => 'عسگدونی جانیایا تازه',
+'newimages-summary' => 'ای بلگه یا ویجه همه جانیایا سوار بیه نه نشو می ئین.',
+'newimages-label' => 'نوم جانیا(یا بشقی د وه):',
+'sp-newimages-showfrom' => 'جانیایا تازه نه که $2 ، $2 شرو بینه نشو بیه',
+
 # Bad image list
 'bad_image_list' => 'دونسمنديانه وه ای شلگ وارد بكيت:
 
@@ -1165,6 +1530,20 @@ $2',
 *جی پی اس گپ حالت
 *جی پی اس همه حالت',
 
+# Exif tags
+'exif-datetime' => 'آلشت دئن وخت و دمون جانیا',
+'exif-usercomment' => 'ویر و باوریا کارور',
+'exif-relatedsoundfile' => 'جانیا دنگ دار مرتوط',
+'exif-filesource' => 'سرچشمه جانیا',
+'exif-jpegfilecomment' => 'ویر و باور فایل پی ان جی',
+'exif-languagecode' => 'زون',
+'exif-pngfilecomment' => 'ویر و باور فایل جی پی ان جی',
+'exif-giffilecomment' => 'ویر و باور فایل جی آی اف',
+
+# Pseudotags used for GPSAltitudeRef
+'exif-gpsaltitude-above-sealevel' => '$1 {{جمی:$1|متر|متریا}} وارؤ د ریتراز دریا',
+'exif-gpsaltitude-below-sealevel' => '$1 {{جمی:$1|متر|متریا}} وارؤ د ریتراز دریا',
+
 # 'all' in various places, this might be different for inflected languages
 'watchlistall2' => 'همه شو',
 'namespacesall' => 'همه شو',
@@ -1178,8 +1557,22 @@ $2',
 # Core parser functions
 'duplicate-defaultsort' => 'زنهار کلیت پیش فرض جور بیه $2 تازه ای یا کلید پیش فرض جوربیه $1 رد بیه.',
 
+# Special:Version
+'version-ext-license' => 'ليسانس',
+'version-ext-colheader-version' => 'نسقه',
+'version-ext-colheader-license' => 'ليسانس',
+'version-ext-colheader-credits' => 'نیسنه یا',
+
+# Special:Redirect
+'redirect-file' => 'نوم جانیا',
+
+# Special:FileDuplicateSearch
+'fileduplicatesearch-filename' => 'نوم جانیا:',
+
 # Special:SpecialPages
 'specialpages' => 'بلگيا ويجه',
+'specialpages-group-changes' => 'آلشتیا تازه و پهرستنومه یا',
+'specialpages-group-media' => 'گزارشتیا رسانه و سوارکردیا',
 
 # External image whitelist
 'external_image_whitelist' => 'یه خط نه ول بکید چی وه<pre>',
@@ -1187,4 +1580,16 @@ $2',
 # Special:Tags
 'tag-filter' => 'فيلتر [[Special:Tags|Tag]]:',
 
+# API errors
+'api-error-badaccess-groups' => 'شما سی سوار کرد جانیایا د ای ویکی اجازه ناریت.',
+'api-error-copyuploaddisabled' => 'سوار کردن وا یو آر ال دی ای سرور غیرفعال بیه.',
+'api-error-filename-tooshort' => 'نوم جانیا فره کؤچکه.',
+'api-error-illegal-filename' => 'نوم جانیا اجازه دئه نئ.',
+'api-error-mustbeloggedin' => 'شما سی سوارکردن فایلیا با بیایت وامین',
+
+# Special:ExpandTemplates
+'expand_templates_remove_comments' => 'جا وه جا بیئن ویر و باوریا',
+
+# Unknown messages
+'uploadinvalidxml' => 'ایکس ام الی که سوار بیه نبوئه نوتیج با.',
 );
index d2460db..811e66d 100644 (file)
@@ -196,7 +196,6 @@ $messages = array(
 'tog-numberheadings' => 'Automatiškai numeruoti skyrelius',
 'tog-showtoolbar' => 'Rodyti redagavimo įrankinę (JavaScript)',
 'tog-editondblclick' => 'Puslapių redagavimas dvigubu spustelėjimu (JavaScript)',
-'tog-editsection' => 'Įjungti skyrelių redagavimą naudojant nuorodas [taisyti]',
 'tog-editsectiononrightclick' => 'Įjungti skyrelių redagavimą paspaudus skyrelio pavadinimą dešiniuoju pelės klavišu (JavaScript)',
 'tog-showtoc' => 'Rodyti turinį, jei puslapyje daugiau nei 3 skyreliai',
 'tog-rememberpassword' => 'Prisiminti prisijungimo informaciją šioje naršyklėje (daugiausiai $1 {{PLURAL:$1|dieną|dienas|dienų}})',
index 7dfdc40..7a91997 100644 (file)
@@ -64,7 +64,6 @@ $messages = array(
 'tog-numberheadings' => 'Automātiski numurēt virsrakstus',
 'tog-showtoolbar' => 'Rādīt rediģēšanas rīkjoslu',
 'tog-editondblclick' => 'Atvērt lapu rediģēšanai ar dubultklikšķi',
-'tog-editsection' => 'Rādīt sadaļām izmainīšanas saiti "[labot]"',
 'tog-editsectiononrightclick' => "Atvērt sadaļas rediģēšanas lapu, uzklikšķinot ar labo peles pogu uz sadaļas virsraksta (izmanto ''JavaScript'')",
 'tog-showtoc' => 'Parādīt satura rādītāju (lapām, kurās ir vairāk par 3 virsrakstiem)',
 'tog-rememberpassword' => 'Atcerēties manu lietotājvārdu pēc pārlūka aizvēršanas (ne vairāk kā $1 {{PLURAL:$1|diena|dienas}}).',
@@ -82,7 +81,7 @@ $messages = array(
 'tog-shownumberswatching' => 'Rādīt uzraudzītāju skaitu',
 'tog-oldsig' => 'Pašreizējais paraksts:',
 'tog-fancysig' => 'Vienkāršs paraksts (bez automātiskās saites)',
-'tog-uselivepreview' => "Lietot tūlītējo priekšskatījumu (izmanto ''JavaScript''; eksperimentāla iespēja)",
+'tog-uselivepreview' => 'Lietot tūlītējo priekšskatījumu (eksperimentāla iespēja)',
 'tog-forceeditsummary' => 'Atgādināt man, ja kopsavilkuma ailīte ir tukša',
 'tog-watchlisthideown' => 'Paslēpt manus labojumus uzraugāmo lapu sarakstā',
 'tog-watchlisthidebots' => 'Paslēpt botu labojumus uzraugāmo lapu sarakstā',
@@ -322,8 +321,9 @@ $1',
 'ok' => 'Labi',
 'retrievedfrom' => 'Saturs iegūts no "$1"',
 'youhavenewmessages' => 'Tev ir $1 (skatīt $2).',
-'newmessageslinkplural' => '{{PLURAL:$1|jauns vēstījums|jauni vēstījumi}}',
-'newmessagesdifflinkplural' => '{{PLURAL:$1|pēdējā izmaiņa|pēdējās izmaiņas}}',
+'youhavenewmessagesmanyusers' => 'Jums ir $1 no daudziem lietotājiem ($2).',
+'newmessageslinkplural' => '{{PLURAL:$1|jauns vēstījums|999=jauni vēstījumi}}',
+'newmessagesdifflinkplural' => '{{PLURAL:$1|pēdējā izmaiņa|999=pēdējās izmaiņas}}',
 'youhavenewmessagesmulti' => 'Tev ir jauns ziņojums: $1',
 'editsection' => 'labot',
 'editold' => 'labot',
@@ -374,6 +374,8 @@ Derīgo īpašo lapu saraksts atrodas te: [[Special:SpecialPages|{{int:specialpa
 # General errors
 'error' => 'Kļūda',
 'databaseerror' => 'Datu bāzes kļūda',
+'databaseerror-text' => 'Datu bāzes vaicājuma kļūda.
+Iespējams, tā ir programmatūras kļūda.',
 'databaseerror-textcl' => 'Datu bāzes vaicājuma kļūda.',
 'databaseerror-query' => 'Vaicājums: $1',
 'databaseerror-function' => 'Funkcija: $1',
@@ -515,7 +517,7 @@ Lūdzu, izvēlieties citu vārdu.',
 Tajā jābūt vismaz {{PLURAL:$1|1 zīmei|$1 zīmēm}}.',
 'password-name-match' => 'Tava parole nedrīkst būt tāda pati kā tavs lietotājvārds.',
 'password-login-forbidden' => 'Šī lietotājvārda un paroles izmantošana ir aizliegta.',
-'mailmypassword' => 'Atsūtīt man jaunu paroli',
+'mailmypassword' => 'Atiestatīt paroli',
 'passwordremindertitle' => 'Jauna pagaidu parole no {{SITENAME}}s',
 'passwordremindertext' => 'Kads (iespejams, Tu pats, no IP adreses $1)
 ludza, lai nosutam Tev jaunu {{SITENAME}} ($4) paroli.
@@ -798,6 +800,7 @@ Tā jau eksistē.',
 'content-not-allowed-here' => '"$1" saturs nav atļauts lapā [[$2]]',
 'editwarning-warning' => 'Atstājot šo lapu tu zaudēsi izdarītās izmaiņas. 
 Ja esi pieteicies, jūs vari atspējot šo brīdinājumu savās izvēlēs sadaļā "rediģēšana"',
+'editpage-notsupportedcontentformat-title' => 'Satura formāts nav atbalstīts',
 
 # Content models
 'content-model-wikitext' => 'vikiteksts',
@@ -897,8 +900,8 @@ Sīkāku informāciju var atrast [{{fullurl:{{#Special:Log}}/delete|page={{FULLP
 'revdelete-hide-user' => 'Autora lietotājvārds/IP adrese',
 'revdelete-hide-restricted' => 'Paslēpt datus arī no administratoriem',
 'revdelete-radio-same' => '(nemainīt)',
-'revdelete-radio-set' => '',
-'revdelete-radio-unset' => '',
+'revdelete-radio-set' => 'Slēpts',
+'revdelete-radio-unset' => 'Redzams',
 'revdelete-suppress' => 'Paslēpt datus arī no administratoriem',
 'revdelete-unsuppress' => 'Atcelt ierobežojumus atjaunotajām versijām',
 'revdelete-log' => 'Iemesls:',
@@ -1038,7 +1041,7 @@ Pagaidām vari meklēt, izmantojot Google vai Yahoo.
 'prefs-email' => 'E-pasta uzstādījumi',
 'prefs-rendering' => 'Izskats',
 'saveprefs' => 'Saglabāt',
-'restoreprefs' => 'Atjaunot noklusētos uzstādījumus',
+'restoreprefs' => 'Atjaunot noklusētos uzstādījumus (visās sadaļās)',
 'prefs-editing' => 'Rediģēšana',
 'rows' => 'Rindiņu skaits:',
 'columns' => 'Simbolu skaits rindiņā:',
@@ -1287,7 +1290,7 @@ Ja tu izvēlies to norādīt, tas tiks izmantots, lai identificētu tavu darbu (
 'rclistfrom' => 'Parādīt jaunas izmaiņas kopš $1',
 'rcshowhideminor' => '$1 maznozīmīgos',
 'rcshowhidebots' => '$1 botus',
-'rcshowhideliu' => '$1 reģistrētos',
+'rcshowhideliu' => '$1 reģistrēti lietotāji',
 'rcshowhideanons' => '$1 anonīmos',
 'rcshowhidepatr' => '$1 pārbaudītie labojumi',
 'rcshowhidemine' => '$1 manus',
@@ -1696,6 +1699,7 @@ Katrā rindiņā ir saites uz pirmo un otro pāradresācijas lapu, kā arī pirm
 'protectedpages' => 'Aizsargātās lapas',
 'protectedpages-indef' => 'Tikai bezgalīgas aizsardzības',
 'protectedpages-cascade' => 'Tikai kaskādes aizsardzības',
+'protectedpages-noredirect' => 'Paslēpt pāradresācijas',
 'protectedtitles' => 'Aizsargātie nosaukumi',
 'protectedtitlesempty' => 'Pagaidām nevienas lapas nosaukums nav aizsargāts ar šiem paraametriem.',
 'listusers' => 'Lietotāju uzskaitījums',
@@ -1934,6 +1938,7 @@ Papildinformācija:
 'delete-edit-reasonlist' => 'Izmainīt dzēšanas iemeslus',
 'delete-toobig' => 'Šai lapai ir liela izmaiņu hronoloģija, vairāk nekā $1 {{PLURAL:$1|versija|versijas}}.
 Šādu lapu dzēšana ir atslēgta, lai novērstu nejaušus traucējumus {{grammar:lokatīvs|{{SITENAME}}}}.',
+'deleting-backlinks-warning' => "'''Brīdinājums:''' uz lapu, ko grasies izdzēst, ved saites no citām lapām.",
 
 # Rollback
 'rollback' => 'Novērst labojumus',
@@ -2561,7 +2566,7 @@ $1',
 'file-nohires' => 'Augstāka izšķirtspēja nav pieejama.',
 'svg-long-desc' => 'SVG fails, definētais izmērs $1 × $2 pikseļi, faila izmērs: $3',
 'svg-long-error' => 'Nederīgs SVG fails: $1',
-'show-big-image' => 'Pilnā izmērā',
+'show-big-image' => 'Sākotnējais fails',
 'show-big-image-preview' => 'Šī priekšskata izmērs: $1.',
 'show-big-image-other' => '{{PLURAL:$2|Cits izmērs|Citi izmēri}}: $1.',
 'show-big-image-size' => '$1 × $2 pikseļi',
@@ -3046,7 +3051,7 @@ Var arī lietot [[Special:EditWatchlist|standarta izmainīšanas lapu]].',
 'version-hooks' => 'Aizķeres',
 'version-hook-name' => 'Aizķeres nosaukums',
 'version-version' => '(Versija $1)',
-'version-license' => 'Licence',
+'version-license' => 'MediaWiki licence',
 'version-poweredby-credits' => "Šis viki darbojas ar '''[https://www.mediawiki.org/ MediaWiki]''' programmatūru, autortiesības © 2001-$1 $2.",
 'version-poweredby-others' => 'citi',
 'version-poweredby-translators' => 'translatewiki.net tulkotāji',
@@ -3208,7 +3213,7 @@ Var arī lietot [[Special:EditWatchlist|standarta izmainīšanas lapu]].',
 
 # Limit report
 'limitreport-title' => 'Parsētāja profilēšanas dati:',
-'limitreport-postexpandincludesize-value' => '$1/$2 baiti',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|baits|baiti}}',
 'limitreport-templateargumentsize' => 'Veidnes argumenta izmērs',
 'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|baits|baiti}}',
 
index 2dce02c..c2515ab 100644 (file)
@@ -161,7 +161,6 @@ $messages = array(
 'tog-numberheadings' => '生章數',
 'tog-showtoolbar' => '多寶列見(JavaScript)',
 'tog-editondblclick' => '纂頁雙擊(JavaScript)',
-'tog-editsection' => '纂段擊鏈',
 'tog-editsectiononrightclick' => '纂段右擊標(JavaScript)',
 'tog-showtoc' => '四章見目',
 'tog-rememberpassword' => '符節通越(達至$1日)',
index 84664d9..4a32e41 100644 (file)
@@ -39,7 +39,6 @@ $messages = array(
 'tog-numberheadings' => 'शीर्षक स्वयं-क्रमांकित करू',
 'tog-showtoolbar' => 'संपादन ओजारपेटी देखाऊ (जावास्क्रीप्ट)',
 'tog-editondblclick' => 'दू बेर क्लीक कए पन्ना संपादित करू (जावास्क्रीप्ट)',
-'tog-editsection' => '[संपादित करू] श्रृंखला द्वारा विभाग संपादनक आज्ञा दिअ',
 'tog-editsectiononrightclick' => 'ऐ खण्डक सम्पादन खण्डक शीर्षकेँ दहिन क्लिक कऽ सम्भव (जावास्क्रिप्ट चाही)',
 'tog-showtoc' => 'अनुक्रम देखाऊ (जाहि पृष्ठ पर तीनसँ बेशी विभाग होए)',
 'tog-rememberpassword' => 'ऐ गवेषकपर हमर कूटशब्द (बेशीसं बेशी $1 {{PLURAL:$1|दिन धरि| कएक दिन धरि}}) मोन राखू',
index e45a247..108ac26 100644 (file)
@@ -481,8 +481,8 @@ Aja kelalen ngowaih [[Special:Preferences|preferensi {{SITENAME}}]] Rika.',
 'createacct-another-submit' => 'Gawe akun liyane',
 'createacct-benefit-heading' => '{{SITENAME}} kuwe digawe nang wong kaya Rika.',
 'createacct-benefit-body1' => '{{PLURAL:$1|suntingan|suntingan}}',
-'createacct-benefit-body2' => '{{PLURAL:$1|kaca|kaca}}',
-'createacct-benefit-body3' => '{{PLURAL:$1|kontributor|kontributor}} anyaran',
+'createacct-benefit-body2' => '{{PLURAL:$1|kaca}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|kontributor}} anyaran',
 'badretype' => 'Tembung sandhi sing Rika lebokna ora gathuk.',
 'userexists' => 'Jeneng panganggo sing dilebokna uwis ana sing nganggo.
 Monggo pilih jeneng liyane.',
@@ -515,7 +515,7 @@ Monggo dijajal sepisan maning.',
 'passwordtooshort' => 'Tembung sandhi kuwe paling ora cacahe {{PLURAL:$1|1 karakter|$1 karakter}}.',
 'password-name-match' => 'Tembung sandhi Rika kudu sejen karo jeneng panganggone Rika.',
 'password-login-forbidden' => 'Jeneng panganggo lan tembung sandhi kiye ora olih dienggo.',
-'mailmypassword' => 'Imelna tembung sandhi anyar',
+'mailmypassword' => 'Tembung sandhi di-reset',
 'passwordremindertitle' => 'Tembung sandi anyar temporer kanggo {{SITENAME}}',
 'passwordremindertext' => 'Ana wong (ndeyane Rika dhewek, sekang alamat IP $1) sing njaluk
 tembung sandhi anyar kanggo {{SITENAME}} ($4). Tembung sandhi sawetara nggo panganggo 
@@ -532,7 +532,7 @@ terusna baen nggunakna tembung sandhine Rika sing lawas.',
 Monggoo mlebu log maning seuwise Rika nampa imel kuwe.',
 'blocked-mailpassword' => "Alamat IP-ne Rika diblokir sekang panyuntingan, mulane kuwe Rika ora olih nganggo fungsi pèngetan tembung sandhi kanggo ''mencegah penyalahgunaan''.",
 'eauthentsent' => 'Pesen imel konfirmasi wis dikirim maring alamat imele Rika.
-Rika kudu ngetutna instruksi nang imel kuwe mau nggo mastekna nek alamat kuwe pancen imele Rika dhewek. {{SITENAME}} ora bakal ngaktifna fitur imel angger langkah kiye durung dilakokna.',
+Sedurunge imel liyane teyeng dikirim maring akun kuwe, Rika kudu ngetutna instruksi nang imel kuwe, nggo mastekna nek alamat kuwe pancen imele Rika dhewek.',
 'throttled-mailpassword' => 'Sawijining imel kanggo mbalekna tembung sandhi wis dikirim, jroning {{PLURAL:$1|jam|$1 jam}} pungkasan kiye.
 Kanggo nyegah salah-guna, mung siji imel tembung sandi thok sing teyeng dikirim saben {{PLURAL:$1|jam|$1 jam}}.',
 'mailerror' => 'Kasalahan dong ngirim imel: $1',
@@ -677,7 +677,7 @@ Kiye ndeyan anu uwis dipindah utawa dibusek dong Rika lagi ndeleng kaca kiye.',
 'accmailtitle' => 'Tembung sandhi wis dikirim.',
 'accmailtext' => "Tembung sandhi acak kanggo [[User talk:$1|$1]] wis digawe lan dikirim maring $2.
 
-Tembung sandhi kanggo akun anyarkiye teyeng diganti nang kaca ''[[Special:ChangePassword|ganti tembung sandhi]]'' seuwise mlebu log.",
+Tembung sandhi kanggo akun anyar kiye teyeng diganti nang kaca ''[[Special:ChangePassword|ganti tembung sandhi]]'' seuwise mlebu log.",
 'newarticle' => '(Anyar)',
 'newarticletext' => "Rika ngetutna pranala maring kaca sing durung ana.
 Kanggo nggawe kaca kuwe,molai baen ngetik nang kotak nang ngisor kiye (deleng [[{{MediaWiki:Helppage}}|kaca pitulung]] kanggo informasi lewih detil).
@@ -834,18 +834,18 @@ Rinciane teyeng ditemokna nang [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAG
 'revdelete-no-file' => 'Berkas sing dituju ora ana.',
 'revdelete-show-file-confirm' => 'Apa rika wis mantep arep ndeleng revisi sing wis dibusek nggone berkas "<nowiki>$1</nowiki>" sekang tanggal $2 jam $3?',
 'revdelete-show-file-submit' => 'Ya',
-'revdelete-selected' => "'''{{PLURAL:$2|Revisi kepilih|Revisi kepilih}} sekang '''$1''''''",
+'revdelete-selected' => "'''{{PLURAL:$2|Revisi kepilih}} sekang [[:$1]]:'''",
 'logdelete-selected' => "'''{{PLURAL:$1|Log kepilih|Log kepilih}} kanggo:'''",
 'revdelete-legend' => 'Atur watesan',
-'revdelete-hide-text' => 'Umpetna tèks revisi',
+'revdelete-hide-text' => 'Tèks revisi',
 'revdelete-hide-image' => 'Umpetna isi berkas',
 'revdelete-hide-name' => 'Umpetna tindakan lan target',
-'revdelete-hide-comment' => 'Umpetna ringkesan suntingan',
-'revdelete-hide-user' => 'Umpetna jeneng panganggo/alamat IP penyunting',
+'revdelete-hide-comment' => 'ringkesan suntingan',
+'revdelete-hide-user' => 'Jeneng panganggo/alamat IP penyunting',
 'revdelete-hide-restricted' => 'Uga umpetna data sekang pangurus lan panganggo liyané',
 'revdelete-radio-same' => '(aja diowahi)',
-'revdelete-radio-set' => 'Ya',
-'revdelete-radio-unset' => 'Ora',
+'revdelete-radio-set' => 'Umpetna',
+'revdelete-radio-unset' => 'Keton',
 'revdelete-suppress' => 'Uga umpetna data sekang pangurus lan panganggo liyané',
 'revdelete-unsuppress' => 'Busak watesan nang revisi sing dibalèkna',
 'revdelete-log' => 'Alesan:',
@@ -975,11 +975,10 @@ Ningen Rika kudu eling nek indeks Google kanggo {{SITENAME}} bisa baen isine anu
 'prefs-email' => 'Opsi imel',
 'prefs-rendering' => 'Tampilan',
 'saveprefs' => 'Simpen',
-'restoreprefs' => 'Balekna kabeh setelan gawane',
+'restoreprefs' => 'Balekna kabeh setelan gawane (nang kabeh bagiyan)',
 'prefs-editing' => 'Panyuntingan',
 'rows' => 'Baris:',
 'searchresultshead' => 'Goleti',
-'resultsperpage' => 'Hasil saben kaca:',
 'stub-threshold' => 'Ambang wates kanggo format <a href="#" class="stub">pranala rintisan</a> (bita):',
 'stub-threshold-disabled' => 'Dinonaktifna',
 'recentchangesdays' => 'Jumlah dina sing ditidokna nang Owahan anyar:',
@@ -1004,7 +1003,7 @@ Ningen Rika kudu eling nek indeks Google kanggo {{SITENAME}} bisa baen isine anu
 'timezoneregion-indian' => 'Samodra Hindia',
 'timezoneregion-pacific' => 'Samodra Pasifik',
 'allowemail' => 'Aktifna fitur nggo nampa imel sekang pangganggo liyane',
-'prefs-searchoptions' => 'Pilihan panggoletan',
+'prefs-searchoptions' => 'Goleti',
 'prefs-namespaces' => 'Bilik jeneng',
 'defaultns' => 'Utawa goleti nang bilik jeneng kiye:',
 'default' => 'baku',
@@ -1016,9 +1015,10 @@ Ningen Rika kudu eling nek indeks Google kanggo {{SITENAME}} bisa baen isine anu
 Pambalikan kiye ora teyeng dibatalna.',
 'prefs-emailconfirm-label' => 'Konfirmasi imel:',
 'youremail' => 'Imel:',
-'username' => 'Jeneng panganggo:',
-'uid' => 'ID panganggo:',
-'prefs-memberingroups' => 'Anggota {{PLURAL:$1|klompok|klompok-klompok}}:',
+'username' => '{{GENDER:$1|Jeneng panganggo}}:',
+'uid' => '{{GENDER:$1|ID panganggo}}:',
+'prefs-memberingroups' => '{{GENDER:$2|Anggota}} 
+{{PLURAL:$1|klompok|klompok-klompok}}:',
 'prefs-registration' => 'Wektu régistrasi:',
 'yourrealname' => 'Jeneng asli:',
 'yourlanguage' => 'Basa:',
index ce2d03f..7b22cf9 100644 (file)
@@ -221,15 +221,14 @@ $messages = array(
 # User preference toggles
 'tog-underline' => 'Hanipika ny rohy:',
 'tog-justify' => 'Hanitsy ny andiany',
-'tog-hideminor' => "Hanitsika ny fanovana madinika ao amin'ny fanovana farany",
-'tog-hidepatrolled' => "Hanitrika ny fanovana voaara-maso ao amin'ny fanovana farany",
+'tog-hideminor' => "Hanitsika ny fiovana madinika ao amin'ny fiovana farany",
+'tog-hidepatrolled' => "Hanitrika ny fiovana voaara-maso ao amin'ny fiovana farany",
 'tog-newpageshidepatrolled' => "Hanitsika ny pejy voaara-maso ao amin'ny pejy vaovao",
 'tog-extendwatchlist' => 'Hanitatra ny lisitra fanaraham-pejy mba haneho ny fanovana rehetra fa tsy ny vaovao indrindra fotsiny',
-'tog-usenewrc' => "Hamondrona ny fanovana araky ny pejy ao amin'ny fanovana farany ary ao amin'ny lisitry ny pejy arahana",
+'tog-usenewrc' => "Hampivondrona ny fiovana araky ny pejy ao amin'ny fiovana farany ary ao amin'ny lisitry ny pejy arahana",
 'tog-numberheadings' => 'Asio laharany ny lohateny',
 'tog-showtoolbar' => 'Haneho ny toolbar fanovana',
 'tog-editondblclick' => "Hanova pejy amin'ny alalan'ny tsindrim-boalavo roa misesy",
-'tog-editsection' => "Ataovy mety ny fanovana fizaràna amin'ny alalan'ny rohy [hanova]",
 'tog-editsectiononrightclick' => "Hampiasa ny fanovana fizarana amin'ny tsindry havanana eo amin'ny lohatenim-pizarana.",
 'tog-showtoc' => "Asehoy ny fanoroan-takila (ho an'ny pejy misy lohateny mihoatra ny 3)",
 'tog-rememberpassword' => "Tadidio ny tenimiafiko eto amin'ity solosaina ity (mandritry ny andro $1 fara-fahabetsany){{PLURAL:}}",
@@ -493,8 +492,8 @@ Mitaky version $1-n'i MediaWiki",
 'youhavenewmessages' => 'Manana $1 ($2).',
 'youhavenewmessagesfromusers' => "Manana $1 avy amin'ny mpikambana {{PLURAL:$3|hafa|$3}} ($2).",
 'youhavenewmessagesmanyusers' => "Manana $1 avy amin'ny mpikambana maro ($2).",
-'newmessageslinkplural' => '{{PLURAL:$1|hafatra iray|hafatra maro}}',
-'newmessagesdifflinkplural' => 'fanovana farany{{PLURAL:$1}}',
+'newmessageslinkplural' => '{{PLURAL:$1|hafatra iray |hafatra maro}} vaovao',
+'newmessagesdifflinkplural' => 'fiovana {{PLURAL:$1|farany|999=farany}}',
 'youhavenewmessagesmulti' => "Manana hafatra vaovao ianao eo amin'ny $1.",
 'editsection' => 'hanova',
 'editold' => 'hanova',
@@ -588,8 +587,7 @@ Tsy nanome fanazavana.",
 'badtitletext' => "Tsy mety io anaram-pejy nangatahinao io na tsy misy n'inon'inona na rohy dikan-teny vahiny misy diso tsipelina.",
 'perfcached' => "Ao amin'ny voatakona ireo data manaraka ireo ary mety tsy voavao. $1{{PLURAL:}} ihany no isan'ireo zavatra voatahiry ao amin'ny voatakona",
 'perfcachedts' => "Ao amin'ny voatakona (cache) ny data aseho, ary tamin'ny $1 izy no navaozina farany. $4{{PLURAL:}} no isan'ny valim-pikarohana ao amin'ilay voatakona.",
-'querypage-no-updates' => "Tsy nalefa ny ''mise à jour'' (update) hoan'ity pejy ity.
-Mety tsy misy fifandraisana amin'ny zavamisy ankehitriny ny zavamisy ao anatin'ity pejy ity..",
+'querypage-no-updates' => "Amin'izao fotoana izao dia tsy havaozina ny votoatin'ity pejy ity. Noho izany dia tsy mitaratra ny tena zava-misy ny votoatiny ato.",
 'viewsource' => 'Hijery fango',
 'viewsource-title' => "Hijery ny fangon'i $1",
 'actionthrottled' => 'Tao voafetra',
@@ -623,7 +621,7 @@ Ny antony nomen\'ny mpandrindra nanidy azy: "$3".',
 'invalidtitle-knownnamespace' => 'Lohateny tsy miady amin\'ny fepetra miaraka amin\'ny anaram-balam-pejy "$2" ary soratra "$3"',
 'invalidtitle-unknownnamespace' => 'Lohateny tsy ekena miaraka amin\'ny laharana anaran-tsehatra $1 ary soratra "$2"',
 'exception-nologin' => 'Tsy tafiditra',
-'exception-nologin-text' => "Mila tafiditra eo amin'ilay wiki vao afaka manao ilay tao.",
+'exception-nologin-text' => '[[Special:Userlogin|Midira]]  mba hahafahanao manao ilay asa na hahafahanao mijery ity pejy ity',
 
 # Virus scanner
 'virus-badscanner' => "Diso : Tsy fantatray ny mpitady virus ''$1''",
@@ -671,7 +669,7 @@ Mila manaiky cookies ianao raha te hiditra amin'ny {{SITENAME}}.",
 'gotaccount' => "Efa manana kaonty? '''$1'''.",
 'gotaccountlink' => 'Midira',
 'userlogin-resetlink' => "Adinonavo ve ny antsipihan'ny fidiranao ?",
-'userlogin-resetpassword-link' => 'Hamerina ny tenimiafinao',
+'userlogin-resetpassword-link' => 'Hadino ny tenimiafina?',
 'helplogin-url' => 'Help:Fidirana',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Fanoroana mikasika ny fidirana]]',
 'userlogin-createanother' => 'Hamorona kaonty hafa',
@@ -720,7 +718,7 @@ Marino tsara raha mahazo mametraka cookie ao amin'ny kompioteranao ny sehata, di
 Farafahakeliny tokony hisy litera $1 ny tenimiafina.',
 'password-name-match' => 'Tsy maintsy samihafa ny solonanaranao sy ny tenimiafinao tompoko.',
 'password-login-forbidden' => 'Norarana ny fampiasana io anaram-pikambana ary io tenimiafina io.',
-'mailmypassword' => 'Alefaso imailaka ny tenimiafiko',
+'mailmypassword' => 'Hamerina ny tenimiafina',
 'passwordremindertitle' => "Fampatsiahivana tenimiafina avy amin'i {{SITENAME}}",
 'passwordremindertext' => 'Nisy olona, izay ianao ihany angamba, avy tamin\'ny adiresy IP $1, nangataka
 ny handefasanay tenimiafina vaovao ho an\'ny sehatra {{SITENAME}} ao amin\'ny
@@ -1096,19 +1094,18 @@ Ao aorian'ny fivelarana, mety namoaka valy lava loatra angamba izy, ary tsy namp
 'currentrev' => 'Votoatiny ankehitriny',
 'currentrev-asof' => "Endrika tamin'ity $1 ity",
 'revisionasof' => "Endrik'io pejy io tamin'ny $1",
-'revision-info' => "Santiônan'i $1 nataon'i $2",
-'previousrevision' => '←Votoatiny antitra kokoa',
-'nextrevision' => 'Fanovana vao haingana→',
-'currentrevisionlink' => 'Endrika-ny ankehitriny',
+'revision-info' => "Endrika tamin'ny $1 nataon'i $2",
+'previousrevision' => '← Endrika tranainy kokoa',
+'nextrevision' => 'Endrika vaovao kokoa →',
+'currentrevisionlink' => 'Endrika farany indrindra',
 'cur' => 'ank',
 'next' => 'manaraka',
 'last' => 'farany',
 'page_first' => 'voalohany',
 'page_last' => 'farany',
-'histlegend' => "
-Fifidianana ny votoatiny hampitahaina: mariho eo anilan'ny versions hampitahaina dia tsindrio ny bokotra Entrée na ny bokotra etsy ambany.<br />
-Tadidio: (ank) = fampitahana amin'ny votoatin'ny pejy ankehitriny,
-(farany) = fampitahana amin'ny version talohan'ity, M = fanovana madinika",
+'histlegend' => "Fisafidianana ny votoatiny hohampitahaina: Mario ny bokotra radiôn'ny fiovana hampitahazay ary tsintrio ny bokotra fanekena amin'ny faram-pejy<br />
+Maribolana: '''(ank)''' = fampitahana amin'ny votoatin'ny pejy ankehitriny,
+'''(farany)''' = fampitahana amin'ny version talohan'ity, M = fanovana madinika",
 'history-fieldset-title' => 'Karohy ny tantara',
 'history-show-deleted' => 'Voafafa ihany',
 'histfirst' => 'antitra indrindra',
@@ -1131,23 +1128,23 @@ Mitadiava amin'ny '''[[Special:Search|fiasàna fitadiavina]]''' mba hitady ny pe
 'rev-deleted-user-contribs' => "[anaram-pikambana na adiresy IP voafafa - fanovana nasitria teo amin'ny fandraisan'anjara modification]",
 'rev-deleted-text-permission' => "'''Voafafa''' ny santiônan'ity pejy ity.
 Mety misy ny antsipirihany angamba ny [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAME}}}} laogy momban'ny famafàna pejy].",
-'rev-deleted-text-unhide' => "Ity santiônan'ity pejy ity dia '''voafafa'''.
+'rev-deleted-text-unhide' => "Ity versionan'ity pejy ity dia '''voafafa'''.
 Hita ao amin'ny [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} laogim-pamafana] ny antsipirihany.
-Afaka [$1 mijery ilay santiôna] ianao raha tianao.",
-'rev-suppressed-text-unhide' => "'''Nofafana''' ity santiônam-pejy ity.
+Afaka [$1 mijery ilay versiona] ianao raha tianao.",
+'rev-suppressed-text-unhide' => "'''Nofafana''' ity versiom-pejy ity.
 Azo jerena ao amin'ny [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} laogim-pamafana] ny antsipirihany.
 Azonao [$1 jerena foana ilay santiôna] raha tianao.",
-'rev-deleted-text-view' => "'''Nofafana''' ity santiônam-pejy ity.
+'rev-deleted-text-view' => "'''Nofafana''' ity versiom-pejy ity.
 Azonao jerena ity santiôna voafafa ity ; misy antsipirihany ao amin'ny [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} laogim-pamafana].",
-'rev-suppressed-text-view' => "'''Nofafana''' ity santiônam-pejy ity.
-Azonao jerena ilay santiôna voafafa ; ny antsipirihany dia ao amin'ny [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} laogim-pamafana].",
+'rev-suppressed-text-view' => "'''Nofafana''' ity versiom-pejy ity.
+Azonao jerena ilay versiona voafafa ; ny antsipirihany dia ao amin'ny [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} laogim-pamafana].",
 'rev-deleted-no-diff' => "Tsy afaka mijery anio diff io ianao satria misy santôna '''voafafa''' ao aminy.
 Mety any amin'ny [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAME}}}} laogy momban'ny famafàna pejy] ny antsipirihany.",
 'rev-suppressed-no-diff' => "Tsy azo jerenao io diff io satria '''voafafa''' ny iraika amin'ny reviziônany.",
 'rev-deleted-unhide-diff' => "Nisy '''voafafa''' ny iraika amin'ny reviziôna an'ity diff ity.
 Ny antsipirihany dia mety hita ao amin'ny [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} laogin'ny famafana].
 [$1 Azonao jerena foana ilay diff] raha tianao.",
-'rev-suppressed-unhide-diff' => "Nisy '''voafafa''' ny iraika amin'ny santiôna an'ity diff ity.
+'rev-suppressed-unhide-diff' => "Nisy '''voafafa''' ny iraika amin'ny versiona an'ity diff ity.
 Ny antsipirihany dia mety hita ao amin'ny [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} laogin'ny famafana].
 [$1 Azonao jerena foana ilay diff] raha tianao.",
 'rev-deleted-diff-view' => "Nisy '''voafafa''' ny iraika amin'ny reviziôna an'ity diff ity.
@@ -1157,17 +1154,17 @@ Azonao jerena foana ny mijery ny [{{fullurl:{{#Special:Log}}/delete|page={{FULLP
 Azonao jerena ilay diff ; ao amin'ny [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} tatitry ny famafana] ny antsipirihany.",
 'rev-delundel' => 'aseho/asitrika',
 'rev-showdeleted' => 'aseho',
-'revisiondelete' => 'Hamafa na hamerina santiôna',
-'revdelete-nooldid-title' => 'Santiôna tanjona tsy mameno fetra.',
-'revdelete-nooldid-text' => 'Tsy voalazanao ny santiôna tanjona hanaovana ity tao ity, 
+'revisiondelete' => 'Hamafa na hamerina versiona',
+'revdelete-nooldid-title' => 'versiona tanjona tsy azo ekena.',
+'revdelete-nooldid-text' => 'Tsy voalazanao ny versiona tanjona hanaovana ity tao ity, 
 tsy misy ilay izy, na ny santiôna ankehitriny no andramana asitrika.',
 'revdelete-no-file' => 'Tsy misy ilay rakitra hofafàna.',
 'revdelete-show-file-confirm' => "Tapa-kevitra hamafa ny ''revision''-n'i rakitra <nowiki>$1</nowiki> tamin'ny $2 tamin'ny $3 ve ianao ?",
 'revdelete-show-file-submit' => 'Eny',
 'revdelete-selected' => "'''{{PLURAL:$2|Votoatiny nosafidiana|Votoatiny nosafidiana}}n'i '''[[:$1]]''' :'''",
 'logdelete-selected' => "'''{{PLURAL:$1||}}Laogy voafidy :'''",
-'revdelete-text' => "'''Mbola ao amin'ny laogy ny santiôna voafafa, fa tsy afaka jeren'ny vahoaka ny lahatsoratra ao aminy.'''
-Afaka mijery ny lahatsoratra nasitrika sy mamerina azy ny mpandrindra hafa ny {{SITENAME}} amin'ity interface ity, raha tsy misy \"restriction\" hafa koa.",
+'revdelete-text' => "'''Mbola ho ao amin'ny laogim-pejy ary ao amin'ny logy ny versiona ary zava-nitranga voaesotra, fa tsy ho hitan'ny mason'ny vahoaka ny votoatin'izy ireo.'''
+Mbola afaka jeren'ireo mpandrindran'i {{SITENAME}} foana ny votoatiny voafina  ary azony atao ho hitan'ny vahoaka indray ilay izy amin'ny alalan'ity pejy fanaovan-tsafidy ity, raha tsy misy fepetra apetraka.",
 'revdelete-confirm' => 'Amafiso eto ny hevitrao raha hanao io ianao, raha azonao sary an-tsaina ny mety ho vokany, ary raha araka ny [[{{MediaWiki:Policy-url}}|fepetra mihatra]] ny zavatra ataonao.',
 'revdelete-suppress-text' => "Ny famafàna pejy dia ampiasaina rehefa :
 * Misy information tsy sarababem-bahoaka tsy metimety
@@ -1183,11 +1180,11 @@ Afaka mijery ny lahatsoratra nasitrika sy mamerina azy ny mpandrindra hafa ny {{
 'revdelete-radio-set' => 'Eny',
 'revdelete-radio-unset' => 'Tsia',
 'revdelete-suppress' => "Manitrika ny votoatiny ho an'ny mpandrindra",
-'revdelete-unsuppress' => "Hanala ny fepetra eo amin'ny santiôna naverina",
+'revdelete-unsuppress' => "Hanala ny fepetra eo amin'ny versiona naverina",
 'revdelete-log' => 'Antony :',
-'revdelete-submit' => "Ahàtra amin'ny santiôna nofidiana {{PLURAL:$1}}",
-'revdelete-success' => "'''Voaova soa aman-tsara ny fahitana ny santiôna.'''",
-'revdelete-failure' => "'''Ny fisehon'ity santiôna ity dia tsy afaka natao update'''
+'revdelete-submit' => "Hampiharina amin'ny versiona nofidiana {{PLURAL:$1}}",
+'revdelete-success' => "'''Voaova soa aman-tsara ny fahitana ny versiona.'''",
+'revdelete-failure' => "'''Ny fisehon'ity versiona ity dia tsy afaka natao update'''
 $1",
 'logdelete-success' => "'''Voaova soa aman-tsara ny fisehon'ny tatitr’asa.'''",
 'logdelete-failure' => "'''Tsy afaka novaina ny fisehon'ny tatitr’asa'''
@@ -1230,9 +1227,7 @@ Marino raha manohy ny tantaram-pejy ity asa ity.",
 'mergehistory-go' => 'Hijery ny fanovàna mety hatsonika',
 'mergehistory-submit' => 'atsonika ny version',
 'mergehistory-empty' => 'tsy misy version azo hatambarana',
-'mergehistory-success' => "$3 version{{PLURAL:$3||s}} de [[:$1]] fusionnée{{PLURAL:$3||s}} dans [[:$2]].
-
-$3 santiôna{{PLURAL:}} natsonika tamin'ny [[:$2]]",
+'mergehistory-success' => "{{PLURAL:$3|}}Versiona $3 an'i [[:$1]] no natsonika tamin'ny [[:$2]]",
 'mergehistory-fail' => "Tsy afaka manatambatra ny tantara(n'asa). Avereno checheo ny pejy sy ny daty.",
 'mergehistory-no-source' => "Tsy misy ny pejy avy amin'ny $1.",
 'mergehistory-no-destination' => 'Tsy misy ilay pejy tanjona $1.',
@@ -1251,12 +1246,12 @@ $3 santiôna{{PLURAL:}} natsonika tamin'ny [[:$2]]",
 
 # Diffs
 'history-title' => "Tantaran'ny endrik'i « $1 »",
-'difference-title' => "$1 : Fahasamihafan'ny santiôna roa",
+'difference-title' => "$1 : Fahasamihafan'ny versiona roa",
 'difference-title-multipage' => 'Fahasamihafan\'ny pejy "$1" ary "$2"',
 'difference-multipage' => "(Fahasamihafan'ny pejy)",
-'lineno' => 'Andalana $1:',
+'lineno' => 'Andalana faha-$1:',
 'compareselectedversions' => 'Ampitahao ireo version voafidy',
-'showhideselectedversions' => 'Aseho/asitrika ireo ny santiôna nofidiana',
+'showhideselectedversions' => 'Aseho/asitrika ireo ny versiona voasafidy',
 'editundo' => 'esory',
 'diff-empty' => '(Tsy misy mahasamihafa)',
 'diff-multi' => "({{PLURAL:$1|Famerenana tokana|Famerenana $1}} nataon'ny {{PLURAL:$2|mpikambana iray|mpikambana $2}} tsy miseho)",
@@ -1350,7 +1345,7 @@ $3 santiôna{{PLURAL:}} natsonika tamin'ny [[:$2]]",
 'recentchangesdays' => "Isa ny andro ho ampiseho eo amin'ny fanovàna farany",
 'recentchangesdays-max' => '($1 andro{{PLURAL:$1||}} fara-faha betsany)',
 'recentchangescount' => "Isan'ny fanovana haseho (tsipalotra) :",
-'prefs-help-recentchangescount' => 'Misy ny fanovana farany, ny tantaram-pejy ary ny laogy',
+'prefs-help-recentchangescount' => 'Misy ny fiovana farany, ny tantaram-pejy ary ny laogy',
 'savedprefs' => 'Voatahiry ny mombamomba anao.',
 'timezonelegend' => "Faritr'ora :",
 'localtime' => 'Ora an-toerana',
@@ -1504,7 +1499,7 @@ Tsy haseho ny adiresy imailakao rehefa manoratra any aminao ny mpikambana hafa."
 'right-deletelogentry' => "Hamafa ary hamerina iditra manokana ao amin'ny laogy.",
 'right-deleterevision' => 'Mamafa ny version manokana-na pejy iray',
 'right-deletedhistory' => 'Mijery ny tantaram-pejy voafafa fa tsy lahatsorany',
-'right-deletedtext' => "Mijery ny lahatsoratra voafafa sy ny fampitahana anelanelan'ny santiôna voafafa",
+'right-deletedtext' => "Mijery ny lahatsoratra voafafa sy ny fampitahana anelanelan'ny versiona voafafa",
 'right-browsearchive' => 'Mitady pejy voafafa',
 'right-undelete' => 'Mamerina pejy voafafa',
 'right-suppressrevision' => "Mandinika sy mamerina ny version asitrika amin'ny mpandrindra",
@@ -1536,7 +1531,7 @@ Tsy haseho ny adiresy imailakao rehefa manoratra any aminao ny mpikambana hafa."
 'right-importupload' => 'mampiditra na manafatra pejy avy amina rakitra iray',
 'right-patrol' => "Manamarina ny fanovan'ny hafa",
 'right-autopatrol' => 'Manamarika ny fanovany efa nomarihana',
-'right-patrolmarks' => "Mijery ny mariky ny fanamarihana any amin'ny fanovana farany",
+'right-patrolmarks' => "Mijery ny mariky ny fanamarihana any amin'ny fiovana farany",
 'right-unwatchedpages' => 'Mijery ny lisitry ny pejy tsy arahina',
 'right-mergehistory' => 'Manatsonika ny tantaram-pejy',
 'right-userrights' => "Manova ny fahefan'ny mpikambana",
@@ -1599,7 +1594,7 @@ Tsy haseho ny adiresy imailakao rehefa manoratra any aminao ny mpikambana hafa."
 'nchanges' => '{{PLURAL:$1|fanovana|fanovana}} $1',
 'enhancedrc-since-last-visit' => '$1 ({{PLURAL:$1|hatry ny famangiana farany}})',
 'enhancedrc-history' => 'tantara',
-'recentchanges' => 'Fanovana farany',
+'recentchanges' => 'Fiovana farany',
 'recentchanges-legend' => 'Safidy ny fanovàna farany',
 'recentchanges-summary' => "Jereo eto amin'ity pejy ity izay vao niova vao haingana teto amin'ity wiki ity.",
 'recentchanges-noresult' => "Tsy misy fanovana miady amin'ny fepe-potoana napetraka.",
@@ -1734,7 +1729,7 @@ Raha mbola te-hampiditra io rakitra io foana ianao, miverena any aoriana ary mam
 'uploadwarning-text' => "Ovay ny fanoritan' ilay rakitra ary andrao fanindroany.",
 'savefile' => 'Tehirizo ny rakitra',
 'uploadedimage' => 'tonga ny rakitra"[[$1]]"',
-'overwroteimage' => "nampiditra santiôna vaovao an'ny « [[$1]] »",
+'overwroteimage' => 'nampiditra versiona vaovao ny «[[$1]]»',
 'uploaddisabled' => 'Miala tsiny! Tsy azo atao ny mandefa rakitra.',
 'copyuploaddisabled' => "Tsy alefa ny fandefasan-drakitra amin'ny alalan'ny URL.",
 'uploadfromurl-queued' => 'Ao am-piandrasana ny fandefasan-drakitrao.',
@@ -1933,19 +1928,19 @@ Mety tia hanova ny famisavisany ianao any amin'ny [$2 pejy famisavisana rakitra]
 'filerevert-defaultcomment' => "Voaverina ny santiônan'ny $1 tamin'ny $2",
 'filerevert-submit' => 'Hamerina',
 'filerevert-success' => "Naverina tamin' [$4 ny santiôn'ny $2 tamin'ny $3] i '''[[Media:$1|$1]]'''",
-'filerevert-badversion' => "An-toerana, tsy misy santiôna nialoha io rakitra io miankina amin'ny daty voatoro.",
+'filerevert-badversion' => "An-toerana, tsy misy versiona nialoha io rakitra io miankina amin'ny daty voatoro.",
 
 # File deletion
 'filedelete' => 'Hamafa $1',
 'filedelete-legend' => 'Fafao ilay rakitra',
 'filedelete-intro' => "Ampamafana ny rakitra '''[[Media:$1|$1]]''' ianao miaraka amin'ny tantarany rehetra.",
-'filedelete-intro-old' => "Am-pamafana ny santiôna '''[[Media:$1|$1]]''' tamin'ny [$4 $2 tamin'ny $3] ianao.",
+'filedelete-intro-old' => "Am-pamafana ny versiona '''[[Media:$1|$1]]''' tamin'ny [$4 $2 tamin'ny $3] ianao.",
 'filedelete-comment' => 'Antony :',
 'filedelete-submit' => 'Hamafa',
 'filedelete-success' => "voafafa '''$1'''.",
 'filedelete-success-old' => "Voafafa ny santiônan'ny '''[[Media:$1|$1]]''' tamin'ny $2 tamin'ny $3.",
 'filedelete-nofile' => "Tsy misy '''$1'''.",
-'filedelete-nofile-old' => "Tsy nisy santiôna voatahirin'i '''$1''' miaraka amin'ny mahasamihafa naseho.",
+'filedelete-nofile-old' => "Tsy nisy versiona voatahirin'i '''$1''' miaraka amin'ny mahasamihafa naseho.",
 'filedelete-otherreason' => 'Antony fanampiny :',
 'filedelete-reason-otherlist' => 'Antony hafa',
 'filedelete-reason-dropdown' => '* Antom-pamafàna rakitra miasa matetika
@@ -2248,15 +2243,15 @@ na tsy maniry handray imailaka avy amin'ny mpikambana hafa izy.",
 'unwatch' => 'Aza arahana intsony',
 'unwatchthispage' => 'Aza arahana intsony',
 'notanarticle' => 'Tsy votoatim-pejy ity pejy ity',
-'notvisiblerev' => 'Voafafa ilay santiôna',
+'notvisiblerev' => 'Voafafa ilay versiona farany nataom-pikambana hafa',
 'watchlist-details' => "Pejy $1{{PLURAL:}} ao amin'ny lisitry ny pejy arahanao, tsy isaina ny pejin-dresaka.",
 'wlheader-enotif' => "Alefa ny fampilazana amin'ny mailaka.",
 'wlheader-showupdated' => "Aseho '''sorabaventy''' ny pejy niova taorian'ny famangianao azy farany.",
-'watchmethod-recent' => 'fanamarinana ny fanovana farany hahitana pejy arahana',
-'watchmethod-list' => 'fanamarinana ny pejy arahana ahitana fanovana farany',
+'watchmethod-recent' => 'fanamarinana ny fiovana farany hahitana pejy arahana',
+'watchmethod-list' => 'fanamarinana ny pejy arahana hahitana fiovana vao haingana',
 'watchlistcontains' => "Ao amin'ny pejy arahanao dia ahitana pejy $1{{PLURAL:}}.",
 'iteminvalidname' => "Olana amin'ny zavatra « $1 » : tsy ara-dalàna ny anarana...",
-'wlnote' => "Eo ambany dia ahitana ny  {{PLURAL:$1|fanovana farany indrindra|ny fanovana ''$1'' farany}} natao tanatin'ny adin'ny {{PLURAL:$2|iray|'''$2'''}}, nanomboka ny $3, $4.",
+'wlnote' => "Eo ambany dia ahitana ny {{PLURAL:$1|fiovana farany indrindra|ny fiovana ''$1'' farany}} natao tanatin'ny adin'ny {{PLURAL:$2|iray|'''$2'''}}, nanomboka ny $3, $4.",
 'wlshowlast' => 'Haneho ny $1 ora farany, ny $2 andro farany na $3',
 'watchlist-options' => 'Safidy ny lisitry ny pejy arahana',
 
@@ -2331,8 +2326,8 @@ Jereo amin\'ny $2 ny lisitry ny famafana pejy faramparany.',
 ** Tsi-fanajana ny zom-pamorona
 ** Fandotoana",
 'delete-edit-reasonlist' => 'Hanova ny antony amafana pejy',
-'delete-toobig' => 'Ity pejy  ity dia manana tantaram-panovana be, mihoatra ny santiôna {{PLURAL:$1}} $1.
-Ny famafana ireo pejy ireto dia voafetra mba tsy hikorontana {{SITENAME}}.',
+'delete-toobig' => "Ity pejy ity dia manana tantaram-panovana lava be, izany hoe manana versiona {{PLURAL:$1}} $1.
+Noferana mba tsy hikorontana ny fandehanan'i {{SITENAME}} ny famafana ireo pejy ireo.{{PLURAL:$1|}}",
 'delete-warning-toobig' => "Lava be mihitsy ny tantaram-piovan'ity pejy ity, mihoatra santiôna $1{{PLURAL:}}.
 Mety hitondra fikorontanana ao amin'ny banky angon'i {{SITENAME}} ny famafana azy ;
 ataovy am-pitandremana ity tao ity.",
@@ -2343,15 +2338,15 @@ ataovy am-pitandremana ity tao ity.",
 'rollbacklink' => 'foano',
 'rollbacklinkcount' => 'hamoana fanovana{{PLURAL:$1}} $1',
 'rollbackfailed' => "Tsy voaverina amin'ny teo aloha",
-'cantrollback' => "Tsy afaka iverenana ny fanovana; ny mpanova farany ihany no tompon'ny pejy.",
-'alreadyrolled' => "Tsy afaka foanana ny fanovana ny pejy « [[:$1]] » nataon'i [[User:$2|$2]] ([[User talk:$2|Dinika]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]])
+'cantrollback' => "Tsy afaka iverenana ny fiovana; ny mpanova farany ihany no tompon'ny pejy.",
+'alreadyrolled' => "Tsy afaka foanana ny fiovan'ny pejy « [[:$1]] » nataon'i [[User:$2|$2]] ([[User talk:$2|Dinika]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]])
 
-Efa nataon'i [[User:$3|$3]] ([[User talk:$3|dinika]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]) ny fanovana farany.",
+Efa nataon'i [[User:$3|$3]] ([[User talk:$3|dinika]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]) ny fiovana farany.",
 'editcomment' => "Toy izao no fanamarihana momba io fanovana io: \"''\$1''\".",
 'revertpage' => "Voafafa ny fanovana ny [[Special:Contributions/$2|$2]] ([[User talk:$2|Dinika]]); voaverina amin'ny votoatiny teo aloha nataon'i [[User:$1|$1]]",
 'revertpage-nouser' => "Manala ny fanovana (nataom-pikambana voaafina), miverina any amin'ny filaza faran'i  [[User:$1|$1]]",
-'rollback-success' => "Fanalàna ny fanovana nataon'i $1 ;
-miverina any amin'ny santiôna farany nataon'i $2.",
+'rollback-success' => "Fanesorana ny fiovana nataon'i $1 ;
+fiverenana amin'ny fiovana farany nataon'i $2.",
 
 # Edit tokens
 'sessionfailure-title' => 'Tsi-fetezaka mikasika ny kaonty idirana',
@@ -2429,12 +2424,12 @@ Ity ny réglage ny pejy '''$1''' :",
 # Undelete
 'undelete' => 'Jereo ny pejy voafafa',
 'undeletepage' => 'Hijery sy hamerina ny pejy efa voafafa',
-'undeletepagetitle' => "'''Ahitana ny santiôna voafafan'i [[:$1|$1]] ity lisitra manaraka.'''",
+'undeletepagetitle' => "'''Ahitana ny versiona voafafan'i [[:$1|$1]] ity lisitra manaraka.'''",
 'viewdeletedpage' => 'Hijery ny pejy efa nofafana',
 'undeletepagetext' => "Ireto pejy ireto dia efa voafafa nefa mbola voatahiry ao amin'ny tahiry ihany,
 ary mbola afaka averina, mandra-pifafan'ny tahiry. Mety ho voafafa matetitetika
 ihany ny tahiry {{PLURAL:$1}}.",
-'undelete-fieldset-title' => 'Hamerina ny santiôna',
+'undelete-fieldset-title' => 'Hamerina versiona',
 'undeleterevisions' => "{{PLURAL:$1|fanovana|fanovana}} $1 voatahiry any amin'ny arsiva",
 'undeletehistory' => "
 Raha averinao ity pejy ity dia hiverina hiaraka aminy koa ny tantaran'ny
@@ -2442,10 +2437,10 @@ fanovana rehetra natao taminy. Raha efa misy pejy mitondra io anarana io
 noforonina taorian'ny namafana azy, dia hitambatra amin'ny tantaran'io
 pejy vaovao io ny tantaran'ity pejy voafafa ity, fa tsy ho voafafa akory.",
 'undeletehistorynoadmin' => "Efa voafafa io lahatsoratra io. Ny antony namafana azy dia io miseho ambangovangony eo ambany eo io, miaraka amin'ny fampahalalana antsipirihany momba ny mpikambana nikitika io pejy io talohan'ny namafana azy. Ny votoatin'ny pejy izay efa nofafana ireo dia ny mpitantana ihany no afaka mahita azy ankehitriny.",
-'undelete-revision' => "Santiôna voafafa an'i $1 (santiôna tamin'ny $4 tamin'ny $5) nataon'i $3 :",
-'undeleterevision-missing' => "Santiôna diso na tsy misy.
+'undelete-revision' => "Versiona voafafa an'i $1 (versiona tamin'ny $4 tamin'ny $5) nataon'i $3:",
+'undeleterevision-missing' => "Versiona diso na tsy misy.
 Mety rohy tsy izy no anananao, na mety voafafa na naverina tamin'ny tahiry ilay santiôna.",
-'undelete-nodiff' => 'Tsy nahitana santiôna nialoha.',
+'undelete-nodiff' => 'Tsy nahitana versiona nialoha.',
 'undeletebtn' => 'Avereno!',
 'undeletelink' => 'Topi-maso/averina',
 'undeleteviewlink' => 'hijery',
@@ -2474,7 +2469,7 @@ Mety efa naverina angamba izy io.",
 'undelete-error-long' => 'Nisy tsi-fetezana nitranga teo am-pamerenana ilay rakitra :
 
 $1',
-'undelete-show-file-confirm' => "Tapa-kevitra ny hamafa ny santiôna voafafan'ny rakitra <nowiki>$1</nowiki> tamin'ny $2 tamin'ny $3 ve ianao ?",
+'undelete-show-file-confirm' => "Tapa-kevitra ny hamafa ny versiona voafafan'ny rakitra <nowiki>$1</nowiki> tamin'ny $2 tamin'ny $3 ve ianao ?",
 'undelete-show-file-submit' => 'Eny',
 
 # Namespace form on various pages
@@ -2488,7 +2483,7 @@ $1',
 'contributions' => "Fandraisan'anjaran'ny mpikambana{{GENDER:$1}}",
 'contributions-title' => "Fandraisan'anjaran'i $1",
 'mycontris' => "Fandraisan'anjara",
-'contribsub2' => "Ho an'ny $1 ($2)",
+'contribsub2' => "Ho an'i {{GENDER:$3|$1}} ($2)",
 'nocontribs' => "Tsy misy fanovana mifanaraka amin'ireo critères ireo.",
 'uctop' => '(ankehitriny)',
 'month' => "Tamin'ny volana (sy teo aloha) :",
@@ -2509,7 +2504,7 @@ Aseho eo ambany ny laogim-panakanana mba hampahalala anao :",
 Aseho eo ambany ny iditra farany ao amin'ny laogim-panakanana  mba hampahalala :",
 'sp-contributions-search' => "Hikaroka fandraisan'anjara",
 'sp-contributions-username' => 'Adiresy IP na anaram-pikambana :',
-'sp-contributions-toponly' => 'Fanovana izay farany eo ihany no aseho',
+'sp-contributions-toponly' => 'Fiovana izay farany ihany no aseho',
 'sp-contributions-submit' => 'Hikaroka',
 
 # What links here
@@ -2750,15 +2745,12 @@ Anarana hafa omena.",
 
 # Export
 'export' => 'Hamoaka pejy',
-'exporttext' => "Afaka manondrana ny lahatsoratra miaraka amin'ny tantaram-panovana ny pejy na vondrom-pejy maromaro ianao.
-Aoriana dia mety hafaran'ny wiki iray mandeha amin'ny rindrankajy MediaWiki izany, na dia mbola tsy afaka
-atao aza izany amin'izao fotoana izao.
+'exporttext' => "Afaka mamoaka lahatsoratra ary tantaram-piovana amin'ny pejy tokana, na vondrom-pejy mifonona anaty XML ianao.
+Azo ampidirina amy wiki hafa izany amin'ny alalan'ny [[Special:Import|pejy fanafarana]].
 
-Ny fomba fanondranana pejy dia, manomeza lohateny izay na maromaro eto amin'ny boaty ety ambany eto, lohateny iray isaky ny andalana,
-ary safidio na ny votoatiny ankehitriny ihany no ilainao na miaraka amin'ny endriky ny pejy rehetra taloha, sy hoe ny votoatiny ankehitriny
-miampy fampahalalana momba ny fanovana farany fotsiny ve sa miaraka amin'ny tantaran'ny fanovana rehetra.
+Raha hamoaka pejy iray dia atso tsohy eo amin'ny boaty eo ambany ny lohatenin'ny pejinao, andalana iray isaky ny pejy, ary ataovy ny safidy: maka ny tantaram-piovany, na ny fiovana farany ihany.
 
-Etsy amin'ny toerana farany dia afaka mampiasa rohy ihany koa ianao, ohatra [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] ho an'ny [[{{MediaWiki:Mainpage}}]].",
+Ho an'ny tranga voalaza farany, dia azonao ampaisaina ny rohy, ohatra [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] ho an'ny pejy \"[[{{MediaWiki:Mainpage}}]]\".",
 'exportall' => 'Hamoaka ny pejy rehetra',
 'exportcuronly' => "Ny votoatiny ankehitriny ihany no haondrana fa tsy miaraka amin'ny tantarany iray manontolo",
 'exportnohistory' => "
@@ -2820,7 +2812,7 @@ Ho voasoratra ao amin'ny [[Special:Log/import|laogim-pampidirana]] ny tao rehetr
 'import-upload-filename' => 'Anaran-drakitra :',
 'import-comment' => 'Resaka :',
 'importstart' => 'Am-pampidirana ny pejy…',
-'import-revision-count' => '$1 santiôna{{PLURAL:$1||}}',
+'import-revision-count' => 'Versiona $1{{PLURAL:$1||}}',
 'importnopages' => 'Tsy misy pejy ho ampidirana.',
 'importfailed' => "Tsy fetezan' ilay fampidirana : <nowiki>$1</nowiki>",
 'importunknownsource' => "Karazana tsy fantatra an'ilay fango ho ampidirina",
@@ -2839,7 +2831,7 @@ Singam-botoatiny fotsiny no nalefa.',
 Tsy hita ny rakitra miserana.',
 'import-parse-failure' => 'Tsy fetezana teo am-pandinihana ny XML ho ampidirina',
 'import-noarticle' => 'Tsy misy pejy ho ampidirina !',
-'import-nonewrevisions' => 'Efa nampidirina taloha daholo ny santiôna rehetra.',
+'import-nonewrevisions' => 'Efa nampidirina taloha daholo ny versiona rehetra.',
 'xml-error-string' => "$1 eo amin'ny andininy faha $2, tsanganana faha $3 (oktety $4) : $5",
 'import-upload' => 'Fandrefasana data XML',
 'import-token-mismatch' => 'Very ny fampahalalàna momba ny kaonty.
@@ -2958,8 +2950,8 @@ Mamerina ny version taloha io asa io ary afaka manometraka ny antony anatin'ny a
 'spamprotectiontext' => "Voasakan'ny sivana mpiaro amin'ny spam ny pejy saika hotahirizinao. Mety ho anton'izany ny fisian'ny rohy mankany amin'ny sehatra ivelan'ity wiki ity.",
 'spamprotectionmatch' => "Izao teny izao: $1 ; no nanaitra ny sivana mpiaro amin'ny spam",
 'spambot_username' => "Fanadiovana ny spam amin'i MediaWiki.",
-'spam_reverting' => "Famerenana an'ilay santiôna farany tsy misy ny rohy mankany amin'ny $1",
-'spam_blanking' => "Voafotsy ny santiôna misy ny rohy mankany amin'ny $1",
+'spam_reverting' => "Famerenana an'ilay versiona farany tsy misy ny rohy mankany amin'ny $1",
+'spam_blanking' => "Voafotsy ny versiona misy ny rohy mankany amin'ny $1",
 
 # Info page
 'pageinfo-title' => 'Fampahalalana ho an\'i "$1"',
@@ -2982,7 +2974,7 @@ Mamerina ny version taloha io asa io ary afaka manometraka ny antony anatin'ny a
 'pageinfo-firstuser' => 'Mpamorona ilay pejy',
 'pageinfo-firsttime' => 'Daty namoronana ilay pejy',
 'pageinfo-lastuser' => 'Mpanova farany',
-'pageinfo-lasttime' => "Datin'ny fanovana farany",
+'pageinfo-lasttime' => 'Daty niovàna farany',
 'pageinfo-edits' => "Isa manontolon'ny fanovana",
 'pageinfo-authors' => "Isa manontolon'ny mpandray anjara",
 'pageinfo-recent-edits' => "Fanovana vao haingana (natao tanatin'ny $1)",
@@ -3007,8 +2999,8 @@ Mamerina ny version taloha io asa io ary afaka manometraka ny antony anatin'ny a
 'markaspatrolleddiff' => 'Marihana ho voamarina',
 'markaspatrolledtext' => 'Marihana ho hita sy voatsara',
 'markedaspatrolled' => 'Voamarina',
-'markedaspatrolledtext' => "Ny santiôna voafidy an'ny [[:$1]] dia voamarika ho voamarina.",
-'rcpatroldisabled' => "Tsy nalefa ny fanamarinana ao amin'ny fanovana farany.",
+'markedaspatrolledtext' => "Nomarihana ho voamarina ny versiona voafidy an'ny [[:$1]].",
+'rcpatroldisabled' => "Tsy nalefa ny fanamarinana ao amin'ny fiovana farany.",
 'rcpatroldisabledtext' => 'Tsy atao ankehitriny ny fanamarinana ny pejy novaina farany.',
 'markedaspatrollederror' => 'Tsy afaka marihana ho voamarina',
 'markedaspatrollederrortext' => 'Tsy maintsy misafidy santiôna iray ianao mba hahafahanao manamarika azy ho voamarina.',
@@ -3019,7 +3011,7 @@ Mamerina ny version taloha io asa io ary afaka manometraka ny antony anatin'ny a
 # Patrol log
 'patrol-log-page' => "Laogin'ny fanovana voamarina",
 'patrol-log-header' => "Ity dia laogy mikasikan'ny fanovana voamarina.",
-'log-show-hide-patrol' => "$1 ny laogy mikasikan'ny santiôna voamarina",
+'log-show-hide-patrol' => "$1 ny laogy mikasikan'ny versiona voamarina",
 
 # Image deletion
 'deletedrevision' => "Fanovana an'i $1 taloha voafafa.",
@@ -3033,8 +3025,8 @@ $1',
 'filedelete-archive-read-only' => "Ny petra-drakitra fitehirizana « $1 » dia tsy afaka ovain'ny lohamilina.",
 
 # Browsing diffs
-'previousdiff' => '← Ilay fampitahana teo arina',
-'nextdiff' => 'fampitahana manaraka →',
+'previousdiff' => '← Fiovana taloha',
+'nextdiff' => 'Fiovana manaraka →',
 
 # Media information
 'mediawarning' => "'''Fampitandremana''': Mety misy renifango manao ratsy io karazan-drakitra io.
@@ -3048,7 +3040,7 @@ Raha alefanao ilay izy, mety ho simban'io renifango io ny solosainao.",
 'file-nohires' => 'Tsy misy sary lehiba noho io.',
 'svg-long-desc' => 'rakitra SVG, habe $1 × $2 teboka, habe : $3',
 'svg-long-error' => 'Rakitra SVG tsy ekena : $1',
-'show-big-image' => "Hijery ny tena haben'ny sary",
+'show-big-image' => 'Rakitra niaviana',
 'show-big-image-preview' => "Haben'ny topi-maso: $1.",
 'show-big-image-other' => 'Habe hafa: $1{{PLURAL:$2}}',
 'show-big-image-size' => '$1 × $2 teboka',
@@ -3142,8 +3134,8 @@ Tokony sary tsy misy na sary tsy izy ny rohy voalohany anaty andalana iray .
 'exif-software' => 'Rindrankajy nampiasaina',
 'exif-artist' => 'Mpaka azy',
 'exif-copyright' => 'Mpanana ilay copyright',
-'exif-exifversion' => 'Santiôna EXIF',
-'exif-flashpixversion' => 'Santiôna FlashPix',
+'exif-exifversion' => 'Versiona EXIF',
+'exif-flashpixversion' => 'Versiona FlashPix',
 'exif-colorspace' => 'Valan-doko',
 'exif-pixelydimension' => 'Haavon-tsary',
 'exif-pixelxdimension' => 'Halala-tsary',
@@ -3444,7 +3436,7 @@ Azonao atao ihany koa ny [[Special:EditWatchlist/raw|manova ilay lisitra amin'ny
 'duplicate-defaultsort' => '\'\'\'Tandremo\'\'\' : manitsaka ny sort key taloha "$1" ilay sort key ankehitriny "$2".',
 
 # Special:Version
-'version' => 'Santiôna',
+'version' => 'Versiona',
 'version-extensions' => 'Fanitarana nampidirina',
 'version-specialpages' => 'Pejy manokana',
 'version-variables' => 'Miova',
@@ -3455,7 +3447,7 @@ Azonao atao ihany koa ny [[Special:EditWatchlist/raw|manova ilay lisitra amin'ny
 'version-poweredby-others' => 'hafa',
 'version-software' => 'Rindrankahy voapetraka',
 'version-software-product' => 'Vokatra',
-'version-software-version' => 'Santiôna',
+'version-software-version' => 'Versiona',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Hitady rakitra mitovy endrika',
@@ -3473,7 +3465,7 @@ Azonao atao ihany koa ny [[Special:EditWatchlist/raw|manova ilay lisitra amin'ny
 'specialpages-group-maintenance' => 'laogy hikojakojana',
 'specialpages-group-other' => 'Pejy manokana hafa',
 'specialpages-group-login' => 'Hiditra / hisoratra anarana',
-'specialpages-group-changes' => 'Fanovana farany sy laogy',
+'specialpages-group-changes' => 'Fiovana farany sy laogy',
 'specialpages-group-media' => 'Laogy sy fampidirana rakitra media.',
 'specialpages-group-users' => 'Mpikambana sy satany',
 'specialpages-group-highuse' => 'Pejy ampiasaina mafy',
@@ -3514,8 +3506,8 @@ Azonao atao ihany koa ny [[Special:EditWatchlist/raw|manova ilay lisitra amin'ny
 'comparepages' => 'Hampitaha pejy',
 'compare-page1' => 'Pejy 1',
 'compare-page2' => 'Pejy 2',
-'compare-rev1' => 'Santiôna 1',
-'compare-rev2' => 'Santiôna 2',
+'compare-rev1' => 'Versiona 1',
+'compare-rev2' => 'Versiona 2',
 'compare-submit' => 'Ampitahao',
 
 # Database error messages
index cbf7d05..fbd86e1 100644 (file)
@@ -364,7 +364,6 @@ $messages = array(
 'tog-numberheadings' => 'Нумерирај ги заглавијата',
 'tog-showtoolbar' => 'Прикажи алатник за уредување',
 'tog-editondblclick' => 'Уредување на страници при двоен стисок',
-'tog-editsection' => 'Овозможи уредување на заглавија преку врските [уреди]',
 'tog-editsectiononrightclick' => 'Уредување на заглавија со десно копче од глушецот на нивниот наслов',
 'tog-showtoc' => 'Покажи содржина (за страници со повеќе од 3 заглавија)',
 'tog-rememberpassword' => 'Запомни ме на овој прелистувач (највеќе до $1 {{PLURAL:$1|ден|дена}})',
@@ -926,6 +925,8 @@ $2',
 'retypenew' => 'Повторете ја новата лозинка:',
 'resetpass_submit' => 'Поставете лозинка и најавете се',
 'changepassword-success' => 'Вашата лозинка е успешно сменета!',
+'changepassword-throttled' => 'Имате премногу обиди за најава за кратко време.
+Почекајте $1 пред да се обидете повторно.',
 'resetpass_forbidden' => 'Лозинките не може да се менуваат',
 'resetpass-no-info' => 'Мора да сте најавени ако сакате да имате директен пристап до оваа страница.',
 'resetpass-submit-loggedin' => 'Смени лозинка',
@@ -984,6 +985,8 @@ $2
 'changeemail-password' => 'Вашата лозинка на {{SITENAME}}:',
 'changeemail-submit' => 'Смени е-пошта',
 'changeemail-cancel' => 'Откажи',
+'changeemail-throttled' => 'Имате премногу обиди за најава за кратко време.
+Почекајте $1 пред да се обидете повторно.',
 
 # Special:ResetTokens
 'resettokens' => 'Врати одново шифри',
@@ -1180,6 +1183,7 @@ $2
 'template-semiprotected' => '(полузаштитен)',
 'hiddencategories' => 'Оваа страница припаѓа на {{PLURAL:$1|1 скриена категорија|$1 скриени категории}}:',
 'edittools' => '<!-- Овој текст ќе се прикаже под обрасците за уредување и подигање. -->',
+'edittools-upload' => '-',
 'nocreatetext' => '{{SITENAME}} ја има ограничено можноста за создавање нови страници.
 Можете да се вратите назад и да уредувате постоечка страница или [[Special:UserLogin|најавете се или создајте нова корисничка сметка]].',
 'nocreate-loggedin' => 'Немате дозвола да создавате нови страници.',
@@ -1210,6 +1214,8 @@ $2
 'content-not-allowed-here' => 'Содржините од моделот „$1“ не се допуштени на страницата [[$2]]',
 'editwarning-warning' => 'Ако ја напуштите страницата ќе ги изгубите сите промени кои сте ги направиле.
 Ако сте најавени, можете да го исклучите ова предупредување во одделот „Уредување“ во вашите нагодувања.',
+'editpage-notsupportedcontentformat-title' => 'Форматот на содржината не е поддржан',
+'editpage-notsupportedcontentformat-text' => 'Форматот $1 is не е поддржан од содржинскиот модел $2.',
 
 # Content models
 'content-model-wikitext' => 'викитекст',
@@ -1458,6 +1464,7 @@ $1",
 'search-result-score' => 'Релевантност: $1%',
 'search-redirect' => '(пренасочување $1)',
 'search-section' => '(пасус $1)',
+'search-file-match' => '(се совпаѓа со содржината на податотеката)',
 'search-suggest' => 'Дали мислевте на: $1',
 'search-interwiki-caption' => 'Збратимени проекти',
 'search-interwiki-default' => 'Најдено на $1:',
@@ -2584,7 +2591,7 @@ $UNWATCHURL
 'delete-warning-toobig' => 'Оваа страница има долга историја на уредување, преку $1 {{PLURAL:$1|ревизија|ревизии}}.
 Бришењето може да предизвика проблеми при работењето на базата на податоци на {{SITENAME}};
 продолжете доколку сте сигруни дека треба тоа да го сторите.',
-'deleting-backlinks-warning' => "'''Предупредување:''' До страницата што сакате да ја избришете водат други страници.",
+'deleting-backlinks-warning' => "'''Предупредување:''' До страницата што сакате да ја избришете водат други страници или се превметнуваат во неа.",
 
 # Rollback
 'rollback' => 'Отповикај промени',
@@ -2891,7 +2898,7 @@ $1',
 'range_block_disabled' => 'Администраторската можност да блокираат IP групи е исклучена.',
 'ipb_expiry_invalid' => 'Погрешен рок на истекување.',
 'ipb_expiry_temp' => 'Скриените блокирања на корисникот мора да бидат перманентни.',
-'ipb_hide_invalid' => 'Ð\9eваа Ñ\81меÑ\82ка Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ñ\81е Ð¿Ð¾Ñ\82иÑ\81не; Ð¼Ð¾Ð¶ÐµÐ±Ð¸ Ð¸Ð¼Ð° Ð¿Ñ\80емногÑ\83 Ñ\83Ñ\80едÑ\83ваÑ\9aа.',
+'ipb_hide_invalid' => 'Ð\9eваа Ñ\81меÑ\82ка Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ñ\81е Ð¿Ð¾Ñ\82иÑ\81не; Ð¸Ð¼Ð° {{PLURAL:$1|повеÑ\9cе Ð¾Ð´ ÐµÐ´Ð½Ð¾ Ñ\83Ñ\80едÑ\83ваÑ\9aе|пÑ\80екÑ\83 $1 Ñ\83Ñ\80едÑ\83ваÑ\9aа}}..',
 'ipb_already_blocked' => '„$1“ е веќе блокиран',
 'ipb-needreblock' => '$1 е веќе блокиран. Дали сакате да направите промена?',
 'ipb-otherblocks-header' => '{{PLURAL:$1|Друго блокирање|Други блокирања}}',
@@ -3230,6 +3237,7 @@ $2',
 'print.css' => '/* Тука поставениот CSS ќе се применува во верзијата за печатење */',
 'noscript.css' => '/* Тука поставениот CSS се однесува на корисниците што имаат оневозможено JavaScript */',
 'group-autoconfirmed.css' => '/* Тука поставениот CSS ќе се применува само на автопотврдените корисници */',
+'group-user.css' => '/* Тука поставениот CSS ќе се применува само врз регистрираните корисници */',
 'group-bot.css' => '/* Тука поставениот CSS ќе се применува само врз ботовите */',
 'group-sysop.css' => '/* Тука поставениот CSS ќе се применува само врз системските оператори */',
 'group-bureaucrat.css' => '/* Тука поставениот CSS ќе се применува само врз бирократите */',
@@ -3241,6 +3249,7 @@ $2',
 'modern.js' => '/* Било која Јава скрипта поставена овде ќе биде вчитана за сите корисници што го користат рувото Современо */',
 'vector.js' => '/* Тука поставениот JavaScript  ќе им се вчитува на корисниците што го користат рувото „Векторско“ */',
 'group-autoconfirmed.js' => '/* Тука поставениот JavaScript  ќе им се вчитува само на автопотврдените корисници */',
+'group-user.js' => '/* Тука поставениот JavaScript  ќе им се вчитува само на регистрираните корисници */',
 'group-bot.js' => '/* Тука поставениот JavaScript  ќе им се вчитува само на ботовите */',
 'group-sysop.js' => '/* Тука поставениот JavaScript  ќе им се вчитува само на системските оператори */',
 'group-bureaucrat.js' => '/* Тука поставениот JavaScript  ќе им се вчитува само на бирократите */',
@@ -4165,12 +4174,13 @@ $5
 
 # Special:Version
 'version' => 'Верзија',
-'version-extensions' => 'Ð\98нÑ\81Ñ\82алиÑ\80ани додатоци',
+'version-extensions' => 'Ð\92оÑ\81поÑ\81Ñ\82авени додатоци',
 'version-specialpages' => 'Специјални страници',
 'version-parserhooks' => 'Парсерски куки',
 'version-variables' => 'Променливи',
 'version-antispam' => 'Спречување на спам',
 'version-skins' => 'Рува',
+'version-api' => 'Прилози',
 'version-other' => 'Друго',
 'version-mediahandlers' => 'Ракувачи со мултимедијални содржини',
 'version-hooks' => 'Куки',
@@ -4200,7 +4210,7 @@ $5
 МедијаВики се нуди со надеж дека ќе биде од корист, но БЕЗ БИЛО КАКВА ГАРАНЦИЈА; дури и без подразбраната гаранција за ПРОДАЖНА ВРЕДНОСТ или ПОГОДНОСТ ЗА ДАДЕНА ЦЕЛ. За повеќе информации, погледајте ја ГНУ-овата општа јавна лиценца.
 
 Заедно со програмов треба да имате добиено [{{SERVER}}{{SCRIPTPATH}}/COPYING примерок од ГНУ-овата општа јавна лиценца]; ако немате добиено примерок, пишете на Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA или [//www.gnu.org/licenses/old-licenses/gpl-2.0.html прочитајте ја тука].',
-'version-software' => 'Ð\98нÑ\81Ñ\82алиÑ\80ана програмска опрема',
+'version-software' => 'Ð\92оÑ\81поÑ\81Ñ\82авена програмска опрема',
 'version-software-product' => 'Производ',
 'version-software-version' => 'Верзија',
 'version-entrypoints' => 'URL-а на влезните точки',
@@ -4468,4 +4478,6 @@ $5
 'expand_templates_generate_rawhtml' => 'Прикажувај сиров HTML',
 'expand_templates_preview' => 'Преглед',
 
+# Unknown messages
+'uploadinvalidxml' => 'Не можев да го парсирам XML-от што се наоѓа во подигнатата податотека.',
 );
index f686417..4519785 100644 (file)
@@ -365,7 +365,6 @@ $messages = array(
 'tog-numberheadings' => 'ഉപവിഭാഗങ്ങൾക്ക് ക്രമസംഖ്യ കൊടുക്കുക',
 'tog-showtoolbar' => 'തിരുത്തൽ റ്റൂൾബാർ  പ്രദർശിപ്പിക്കുക',
 'tog-editondblclick' => 'താളുകളിൽ ഇരട്ട ക്ലിക്ക് ചെയ്യുമ്പോൾ തിരുത്താനനുവദിക്കുക',
-'tog-editsection' => '[തിരുത്തുക] എന്ന കണ്ണിയുപയോഗിച്ച് ഉപവിഭാഗങ്ങൾ തിരുത്താനനുവദിക്കുക',
 'tog-editsectiononrightclick' => 'ഉപവിഭാഗങ്ങളുടെ തലക്കെട്ടിൽ റൈറ്റ് ക്ലിക്ക് ചെയ്യുന്നതു വഴി തിരുത്താനനുവദിക്കുക',
 'tog-showtoc' => 'ഉള്ളടക്കപ്പട്ടിക പ്രദർശിപ്പിക്കുക (മൂന്നിൽ കൂടുതൽ ഉപശീർഷകങ്ങളുള്ള താളുകൾക്കു മാത്രം)',
 'tog-rememberpassword' => 'എന്റെ പ്രവേശനം ഈ ബ്രൗസറിൽ ({{PLURAL:$1|ഒരു ദിവസം|$1 ദിവസം}}) ഓർത്തുവെക്കുക',
@@ -1163,6 +1162,8 @@ $1 ആണ് ഈ തടയൽ നടത്തിയത്. ''$2'' എന്ന
 'content-not-allowed-here' => '"$1" ഉള്ളടക്കം [[$2]] താളിൽ അനുവദിക്കുന്നില്ല',
 'editwarning-warning' => 'ഈ താളിൽ നിന്നും പോകുന്നത് താങ്കൾ വരുത്തിയ മാറ്റങ്ങൾ നഷ്ടപ്പെടാൻ ഇടയാക്കും.
 താങ്കൾ ലോഗിൻ ചെയ്തിട്ടുണ്ടെങ്കിൽ, താങ്കളുടെ ക്രമീകരണങ്ങളിൽ "തിരുത്തൽ" എന്ന ഭാഗത്ത് ചെന്ന് ഈ അറിയിപ്പ് പ്രദർശിപ്പിക്കുന്നത് ഒഴിവാക്കാവുന്നതാണ്.',
+'editpage-notsupportedcontentformat-title' => 'ഉള്ളടക്ക ഫോർമാറ്റ് പിന്തുണയ്ക്കുന്നില്ല',
+'editpage-notsupportedcontentformat-text' => 'ഉള്ളടക്കത്തിന്റെ ഫോർമാറ്റ് ആയ $1 ഉള്ളടക്ക രീതിയായ $2 പിന്തുണയ്ക്കുന്നില്ല.',
 
 # Content models
 'content-model-wikitext' => 'വിക്കിഎഴുത്ത്',
@@ -1415,6 +1416,7 @@ $1",
 'search-result-score' => 'സാംഗത്യം: $1%',
 'search-redirect' => '(തിരിച്ചുവിടൽ താൾ $1)',
 'search-section' => '(വിഭാഗം $1)',
+'search-file-match' => '(പ്രമാണ ഉള്ളടക്കവുമായി ഒത്തുപോകുന്നുണ്ട്)',
 'search-suggest' => 'താങ്കൾ ഉദ്ദേശിച്ചത് $1 എന്നാണോ',
 'search-interwiki-caption' => 'സഹോദര സംരംഭങ്ങൾ',
 'search-interwiki-default' => '$1 ഫലങ്ങൾ:',
@@ -2806,7 +2808,7 @@ $1',
 '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 നിലവിൽ തടയപ്പെട്ടതാണ്.<br />
 താങ്കൾ സജ്ജീകരണത്തിൽ മാറ്റം വരുത്തുവാൻ ഉദ്ദേശിക്കുന്നുണ്ടോ?',
index 53384e8..ffea3b9 100644 (file)
@@ -55,7 +55,6 @@ $messages = array(
 'tog-numberheadings' => 'Гарчигуудыг автоматаар дэс дугаарлах',
 'tog-showtoolbar' => 'Засварлах түүлбарыг үзүүлэх (ЖаваСкрипт)',
 'tog-editondblclick' => 'Хоёр удаа дараад хуудсыг засварлах (ЖаваСкрипт)',
-'tog-editsection' => '[Засварлах] линкээр хэсгийг засварладаг болгох',
 'tog-editsectiononrightclick' => 'Хэсгийн гарчиг дээр баруун товчлуураар дарж засварладаг болгох (ЖаваСкрипт)',
 'tog-showtoc' => 'Агуулгын хүснэгтийг үзүүлэх (3-с илүү хэсэгтэй хуудсуудад)',
 'tog-rememberpassword' => 'Энэхүү хөтөч дээрх нэвтрэлтийг санах (хамгийн ихдээ $1 {{PLURAL:$1|өдрийн|өдрийн}} турш)',
index 22ea6ae..55ca268 100644 (file)
@@ -340,7 +340,6 @@ $messages = array(
 'tog-numberheadings' => 'शीर्षके स्वयंक्रमांकित करा',
 'tog-showtoolbar' => 'संपादन साधनपट्टी दाखवा',
 'tog-editondblclick' => 'दुबार-टिचकुन पान संपादित करा',
-'tog-editsection' => '[संपादन] दुव्यामार्फत विभाग संपादन करणे शक्य करा',
 'tog-editsectiononrightclick' => 'विभाग शीर्षकावर उजव्या क्लिकने टिचकुन संपादन करणे शक्य करा',
 'tog-showtoc' => 'अनुक्रमणिका दाखवा(पानात ३ पेक्षा जास्त शीर्षके असल्यास)',
 'tog-rememberpassword' => 'माझा सनोंदप्रवेश (लॉग-ईन) या न्याहाळकावर लक्षात ठेवा (जास्तीत जास्त $1 {{PLURAL:$1|दिवसासाठी|दिवसांसाठी}})',
@@ -600,7 +599,7 @@ $1',
 'youhavenewmessagesfromusers' => 'तुमच्यासाठी {{PLURAL:$3|इतर सदस्याकडून|$3 सदस्यांकडून}} $1 आहेत. ($2)',
 'youhavenewmessagesmanyusers' => 'तुमच्यासाठी बऱ्याच सदस्यांकडून $1 आहेत. ($2)',
 'newmessageslinkplural' => '{{PLURAL:$1|एक नवीन संदेश|९९९=नवीन संदेश}}',
-'newmessagesdifflinkplural' => 'मागील {{PLURAL:$1|बदल}}',
+'newmessagesdifflinkplural' => 'मागील {{PLURAL:$1|999=बदल}}',
 'youhavenewmessagesmulti' => '$1 वर तुमच्यासाठी नवीन संदेश आहेत.',
 'editsection' => 'संपादन',
 'editold' => 'संपादन',
@@ -840,7 +839,7 @@ $2',
 'mailerror' => 'विपत्र पाठवण्यात त्रुटी: $1',
 'acct_creation_throttle_hit' => 'माफ करा, तुम्ही आत्तापर्यंत {{PLURAL:$1|१ खाते उघडले आहे|$1 खाती उघडली आहेत}}. तुम्हाला आणखी खाती उघडता येणार नाहीत.',
 'emailauthenticated' => 'तुमचा विपत्रपत्ता $2 ला $3 यावेळी तपासण्यात आला आहे.',
-'emailnotauthenticated' => 'तà¥\81मà¤\9aा à¤\88-मà¥\87ल à¤ªà¤¤à¥\8dता à¤\85दà¥\8dयाप à¤\85धिपà¥\8dरमाणित(à¤\91थà¥\87à¤\82à¤\9fिà¤\95à¥\87à¤\9fà¥\87ड) à¤¨à¤¾à¤¹à¥\80. à¤\96ालà¥\80ल à¤\95à¥\8bणतà¥\8dयाहà¥\80 à¤«à¤¿à¤\9aरà¥\8dसà¤\95रिता ई-मेल पाठविला जाणार नाही.',
+'emailnotauthenticated' => 'तà¥\81मà¤\9aà¥\8dया à¤\88-मà¥\87ल à¤ªà¤¤à¥\8dतà¥\8dयाà¤\9aà¥\80 à¤\85दà¥\8dयाप à¤¨à¤¿à¤¶à¥\8dà¤\9aितà¥\80 à¤\9dालà¥\87लà¥\80 à¤¨à¤¾à¤¹à¥\80. à¤\96ालà¥\80ल à¤\95à¥\8bणतà¥\8dयाहà¥\80 à¤«à¤¿à¤\9aरà¥\8dससाठà¥\80 ई-मेल पाठविला जाणार नाही.',
 'noemailprefs' => 'खालील सुविधा कार्यान्वित करण्यासाठी,पसंतीक्रमात ई-मेल पत्ता नमूद करा.',
 'emailconfirmlink' => 'आपला ई-मेल पत्ता निश्चित करा.',
 'invalidemailaddress' => 'तुम्ही दिलेला ई-मेल पत्ता चुकीचा आहे, कारण तो योग्यप्रकारे लिहिलेला नाही. कृपया योग्यप्रकारे ई-मेल पत्ता लिहा अथवा ती जागा मोकळी सोडा.',
@@ -968,7 +967,7 @@ $2',
 'showdiff' => 'बदल दाखवा',
 'anoneditwarning' => "'''इशारा:''' तुम्ही विकिपीडियाचे सदस्य म्हणून सनोंद-प्रवेश (लॉग-इन) केलेला नाही. या पानाच्या संपादन इतिहासात तुमचा अंकपत्ता (आयपी) नोंदला जाईल.",
 'anonpreviewwarning' => "\"'''सावधान:''' तुम्ही विकिपीडियाचे सदस्य म्हणून सनोंद-प्रवेश (लॉग-इन) केलेला नाही. या पानाच्या संपादन इतिहासात तुमचा अंकपत्ता (आय.पी. ॲड्रेस) नोंदला जाईल.\"",
-'missingsummary' => "'''à¤\86ठवण:''' à¤¤à¥\81मà¥\8dहà¥\80 à¤¸à¤\82पादन à¤¸à¤¾à¤°à¤¾à¤\82श à¤ªà¥\81रवलà¥\87ला à¤¨à¤¾à¤¹à¥\80.à¤\86पण 'à¤\9cतन à¤\95रा' à¤µà¤° à¤ªà¥\81नà¥\8dहा à¤\9fिà¤\9aà¤\95à¥\80 à¤®à¤¾à¤°à¤²à¥\80 à¤¤à¤° à¤¤à¥\87 à¤¤à¥\8dयाशिवाय जतन होईल.",
+'missingsummary' => "'''à¤\86ठवण:''' à¤\86पण à¤¸à¤\82पादन à¤¸à¤¾à¤°à¤¾à¤\82श à¤ªà¥\81रवलà¥\87ला à¤¨à¤¾à¤¹à¥\80.à¤\86पण 'à¤\9cतन à¤\95रा' à¤µà¤° à¤ªà¥\81नà¥\8dहा à¤\9fिà¤\9aà¤\95à¥\80 à¤®à¤¾à¤°à¤²à¥\80 à¤¤à¤°, à¤¤à¥\87 à¤¤à¥\8dयाशिवायà¤\9a जतन होईल.",
 'missingcommenttext' => 'कृपया खाली प्रतिक्रिया भरा.',
 'missingcommentheader' => "'''आठवण:''' आपण या लेखनाकरिता विषय किंवा मथळा दिलेला नाही. आपण पुन्हा \"{{int:savearticle}}\" वर टिचकले तर, तुमचे संपादन त्याशिवायच जतन होईल.",
 'summary-preview' => 'आढाव्याची झलक:',
@@ -1393,6 +1392,7 @@ $1",
 'preferences' => 'पसंतीक्रम',
 'mypreferences' => 'पसंतीक्रम',
 'prefs-edits' => 'संपादनांची संख्या:',
+'prefsnologintext2' => 'आपला पसंतीक्रम बदलण्यास $1 करा',
 'prefs-skin' => 'त्वचा',
 'skin-preview' => 'झलक',
 'datedefault' => 'प्राथमिकता नाही',
@@ -1690,7 +1690,7 @@ $1",
 'rclistfrom' => '$1 नंतर केले गेलेले बदल दाखवा.',
 'rcshowhideminor' => 'छोटे बदल $1',
 'rcshowhidebots' => 'सांगकामे(बॉट्स) $1',
-'rcshowhideliu' => 'सनोंद प्रवेशित सदस्य $1',
+'rcshowhideliu' => '$1नोंदणीकृत सदस्य',
 'rcshowhideanons' => 'अनामिक सदस्य $1',
 'rcshowhidepatr' => '$1 पहारा असलेली संपादने',
 'rcshowhidemine' => 'माझे बदल $1',
@@ -1723,7 +1723,7 @@ $1",
 
 # Upload
 'upload' => 'संचिका चढवा',
-'uploadbtn' => 'सà¤\82à¤\9aिà¤\95ा à¤\9aढवा',
+'uploadbtn' => 'सà¤\82à¤\9aिà¤\95à¥\87à¤\9aà¥\87 à¤\85पभारण à¤\95रा',
 'reuploaddesc' => 'अपभारण रद्द करुन ,अपभारणाच्या अर्जाकडे परत जा',
 'upload-tryagain' => 'बदललेले संचिका वर्णन पाठवा',
 'uploadnologin' => 'सनोंद-प्रवेशित नाही',
@@ -1770,14 +1770,14 @@ $1",
 'filename-tooshort' => 'संचिकानाम खूपच छोटे आहे',
 'filetype-banned' => 'याप्रकारची संचिका प्रतिबंधित आहे.',
 'verification-error' => 'संचिका पडताळणीत ही संचिका अनुत्तीर्ण झाली.',
-'hookaborted' => 'तà¥\81मà¥\8dहà¥\80 à¤\95रà¥\82 à¤\87à¤\9aà¥\8dà¤\9bिणारà¥\87 à¤¸à¤\82पादन à¤¬à¤¾à¤¹à¥\8dय à¤¹à¥\81à¤\95 à¤¦à¥\8dवारà¥\87 à¤¥ंबवण्यात आले.',
+'hookaborted' => 'तà¥\81मà¥\8dहà¥\80 à¤\95रà¥\82 à¤\87à¤\9aà¥\8dà¤\9bिणारà¥\87 à¤¬à¤¦à¤² à¤µà¤¿à¤¸à¥\8dतारà¤\95ादà¥\8dवारà¥\87 à¤¥à¤¾ंबवण्यात आले.',
 'illegal-filename' => 'या संचिकानामास परवानगी नाही.',
 'overwrite' => 'अस्तित्वात असलेल्या संचिकेवर पुनर्लेखन प्रतिबंधित आहे.',
 'unknown-error' => 'एक अज्ञात चूक उद्भवली.',
 'tmp-create-error' => 'तात्पुरती संचिका बनवता आली नाही.',
 'tmp-write-error' => 'तात्पुरती संचिका लिहीतांना चूकी',
 'large-file' => 'संचिका $1 पेक्षा कमी आकाराची असण्याची अपेक्षा आहे, ही संचिका $2 एवढी आहे.',
-'largefileserver' => 'सेवा संगणकावर (सर्वर) निर्धारित केलेल्या आकारापेक्षा या संचिकेचा आकार मोठा आहे.',
+'largefileserver' => 'सà¥\87वा à¤¸à¤\82à¤\97णà¤\95ावर (सरà¥\8dवà¥\8dहर) à¤¨à¤¿à¤°à¥\8dधारित à¤\95à¥\87लà¥\87लà¥\8dया à¤\86à¤\95ारापà¥\87à¤\95à¥\8dषा à¤¯à¤¾ à¤¸à¤\82à¤\9aिà¤\95à¥\87à¤\9aा à¤\86à¤\95ार à¤®à¥\8bठा à¤\86हà¥\87.',
 'emptyfile' => 'चढवलेली संचिका रिकामी आहे.असे संचिकानाम चुकीचे लिहिल्याने होउ शकते. कृपया तुम्हाला हीच संचिका चढवायची आहे का ते तपासा.',
 'windows-nonascii-filename' => 'या विकिवर विशेष वर्ण असलेल्या संचिकानामाचा आधार घेता येणार नाही.',
 'fileexists' => 'या नावाची संचिका आधीच अस्तित्वात आहे, कृपया ही संचिका बदलण्याबद्दल तुम्ही साशंक असाल तर <strong>[[:$1]]</strong> तपासा.
@@ -1792,8 +1792,8 @@ $1",
 कृपया <strong>[[:$1]]</strong> ही संचिका तपासा.
 जर तपासलेली संचिका ही याच आकाराची असेल तर नवीन प्रतिकृती चढविण्याची गरज नाही.",
 'file-thumbnail-no' => 'या संचिकेचे नाव <strong>$1</strong> पासून सुरू होत आहे. ही कदाचित झलक असू शकते.
-जर तुमच्या कडे पूर्ण रिझोल्यूशनची संचिका असेल तर चढवा अथवा संचिकेचे नाव बदला.',
-'fileexists-forbidden' => 'या à¤¨à¤¾à¤µà¤¾à¤\9aà¥\80 à¤¸à¤\82à¤\9aिà¤\95ा à¤\85à¤\97à¥\8bदरà¤\9a à¤\85सà¥\8dतितà¥\8dतà¥\8dवात à¤\86हà¥\87; à¤\95à¥\83पया à¤ªà¥\81नà¥\8dहा à¤®à¤¾à¤\97à¥\87 जाऊन ही संचिका नवीन नावाने चढवा.
+जर तुमच्याकडे पूर्ण रिझोल्यूशनची संचिका असेल तर चढवा अथवा संचिकेचे नाव बदला.',
+'fileexists-forbidden' => 'या à¤¨à¤¾à¤µà¤¾à¤\9aà¥\80 à¤¸à¤\82à¤\9aिà¤\95ा à¤\85à¤\97à¥\8bदरà¤\9a à¤\85सà¥\8dतितà¥\8dतà¥\8dवात à¤\86हà¥\87; à¤\95à¥\83पया à¤ªà¥\81नà¥\8dहा à¤ªà¤°à¤¤ जाऊन ही संचिका नवीन नावाने चढवा.
 [[File:$1|thumb|center|$1]]',
 'fileexists-shared-forbidden' => 'हे नाव असलेली एक संचिका शेअर्ड संचिका कोशात आधी पासून आहे; कृपया परत मागे जा आणि नवीन, वेगळ्या नावाने ही संचिका पुन्हा चढवा. [[File:$1|thumb|center|$1]]',
 'file-exists-duplicate' => 'ही संचिका खालील {{PLURAL:$1|संचिकेची|संचिकांची}} प्रत आहे:',
@@ -1823,8 +1823,8 @@ $1",
 'watchthisupload' => 'या पानावर बदलांसाठी लक्ष ठेवा.',
 'filewasdeleted' => 'या नावाची संचिका या पूर्वी एकदा चढवून नंतर वगळली होती.तुम्ही ती पुन्हा चढवण्या अगोदर $1 तपासा.',
 'filename-bad-prefix' => "तुम्ही चढवत असलेल्या संचिकेचे नाव '''\"\$1\"''' पासून सुरू होते, जे की अंकीय छाउ (कॅमेरा) ने दिलेले अवर्णनात्मक नाव आहे.कृपया तुमच्या संचिकेकरिता अधिक वर्णनात्मक नाव निवडा.",
-'upload-success-subj' => 'यशसà¥\8dवà¥\80रà¥\80तà¥\8dया à¤\9aढवले',
-'upload-success-msg' => 'तुमचे [$2] येथून्ब चढवणे यशस्वी ठरले. ते येथे उपलब्ध आहे: [[:{{ns:file}}:$1]]',
+'upload-success-subj' => 'यशसà¥\8dवà¥\80रà¥\80तà¥\8dया à¤\85पभारित à¤\95à¥\87ले',
+'upload-success-msg' => 'तुमचे [$2] येथून अपभारण यशस्वी ठरले. ते येथे उपलब्ध आहे: [[:{{ns:file}}:$1]]',
 'upload-failure-subj' => 'चढवण्यातील त्रूटि:',
 'upload-failure-msg' => '[$2] येथून तुमच्या चढवण्यात चूक झाली:
 
@@ -1847,7 +1847,7 @@ $1',
 'backend-fail-stream' => '$1 या संचिकेचा स्त्रोत शोधता आला नाही.',
 'backend-fail-backup' => '$1 या संचिकेची आधारप्रत बनविता आली नाही.',
 'backend-fail-notexists' => '$1 ही संचिका अस्तित्वात नाही.',
-'backend-fail-hashes' => 'तà¥\81लना à¤\95रणà¥\8dयासाठà¥\80 à¤«à¤¾à¤\87ल à¤¹à¤¾शेस मिळाले नाही',
+'backend-fail-hashes' => 'तà¥\81लना à¤\95रणà¥\8dयासाठà¥\80 à¤«à¤¾à¤\87ल à¤¹à¥\85शेस मिळाले नाही',
 'backend-fail-notsame' => ' $1 येथे यापेक्षा विभिन्न असलेली संचिका पूर्वीच विद्यमान आहे',
 'backend-fail-invalidpath' => '$1 हा वैध संग्राहक-पथ नाही.',
 'backend-fail-delete' => '$1 ही संचिका (फाईल) बनवता आली नाही.',
@@ -1861,13 +1861,13 @@ $1',
 'backend-fail-closetemp' => 'तात्पुरती संचिका बंद करणे जमले नाही.',
 'backend-fail-read' => '$1 ही संचिका वाचता आली नाही.',
 'backend-fail-create' => '$1 ही संचिका लिहिता आली नाही.',
-'backend-fail-maxsize' => '$1 ही संचिका लिहिता आली नाही कारण ती {{PLURAL:$2|one byte|$2 bytes}} पेक्षा मोठी आहे.',
+'backend-fail-maxsize' => '$1 ही संचिका लिहिता आली नाही कारण ती {{PLURAL:$2|एक बाइट|$2 बाइट्स}} पेक्षा मोठी आहे.',
 'backend-fail-readonly' => 'पार्श्वभौमीक साठवण "$1" “फक्त वाचा” असे आहे. दिलेले कारण "$2" आहे.',
 'backend-fail-synced' => 'अंतर्गत पार्श्वभौमीक साठवणीतील फाईल "$1" विसंगत आहे.',
 'backend-fail-connect' => 'पार्श्वभौमीक साठा "$1"शी संबंध जोडू शकत नाही.',
 'backend-fail-internal' => 'पार्श्वभौमीक साठा "$1" यात अज्ञात चूक झाली आहे.',
 'backend-fail-contenttype' => '"$1" मध्ये ठेवलेल्या फाईलचा महितीचा प्रकार कळत नाही',
-'backend-fail-batchsize' => 'पार्श्वभौमीक साठयातील बॅच $1 फाईल{{PLURAL:$1|operation|operations}}; मधे मर्यादित कस्त $२ {{PLURAL:$2|operation|operations}} असू शकते',
+'backend-fail-batchsize' => 'पार्श्वभौमीक साठयातील बॅच $1 फाईल{{PLURAL:$1|क्रियेत|क्रियांमध्ये}}; मर्यादित कस्त $२ {{PLURAL:$2|क्रिया}} असू शकते',
 'backend-fail-usable' => 'अपुऱ्या परवानगीमुळे किंवा निर्देशिकेच्या/धारिकेच्या(डिरेक्टरीज/कंटेनर्स) अभावामुळे "$1" संचिका वाचु अथवा लिहू शकत नाही.',
 
 # File journal errors
@@ -1881,7 +1881,7 @@ $1',
 'lockmanager-fail-acquirelock' => '"$1" साठी लॉक फाइल मिळवू शकत नाही',
 'lockmanager-fail-openlock' => '"$1" साठी लॉक फाइल उघडू शकत नाही',
 'lockmanager-fail-releaselock' => '"$1" साठी लॉक उघडू शकत नाही',
-'lockmanager-fail-db-bucket' => '$1 à¤¬à¤¾à¤¸à¥\8dà¤\95à¥\87à¤\9f à¤®à¤§à¥\80ल à¤\95à¥\81लà¥\82प à¤¬à¤\82द à¤¡à¥\87à¤\9fाबà¥\87सशà¥\80 à¤ªà¥\81रà¥\87सा à¤¸à¤\82परà¥\8dà¤\95 à¤¹à¥\8bवà¥\82 à¤¶à¤\95त à¤¨à¤¾à¤¹à¥\80',
+'lockmanager-fail-db-bucket' => '$1 à¤¬à¤\95à¥\87à¤\9f à¤®à¤§à¥\80ल à¤\95à¥\81लà¥\82प à¤¬à¤\82द à¤¡à¥\87à¤\9fाबà¥\87सशà¥\80 à¤ªà¥\81रà¥\87सा à¤¸à¤\82परà¥\8dà¤\95 à¤¹à¥\8bवà¥\82 à¤¶à¤\95त à¤¨à¤¾à¤¹à¥\80.',
 'lockmanager-fail-db-release' => '"$1" डाटाबेस वरील लॉक उघडू शकत नाही',
 'lockmanager-fail-svr-acquire' => 'सर्व्हर "$1" वरील कुलूप उघडू शकत नाही',
 'lockmanager-fail-svr-release' => 'सर्व्हर "$1" वरील् लॉक उघडू शकत नाही',
@@ -1891,21 +1891,21 @@ $1',
 'zip-wrong-format' => 'ही संचिका "झिप" प्रकारची नाही.',
 'zip-bad' => 'ही संचिका दूषित किंवा न वाचता येणारी झिप संचिका आहे.
 ती सुरक्षिततेसाठी नीट तपासता आली नाही.',
-'zip-unsupported' => 'हि à¤¸à¤\82à¤\9aिà¤\95ा à¤\8fà¤\95 ZIP à¤¸à¤\82à¤\9aिà¤\95ा à¤\86हà¥\87 à¤\9cà¥\80 à¤®à¤¿à¤¡à¥\80याविà¤\95à¥\80 à¤¦à¥\8dवरे  (support) न केलेले ZIP वैशिष्ट्ये (features) वापरते.
-या संचिकेची सुरक्षा पडताळणीसाठी व्यवस्थितरीत्या होऊ शकत नाही.',
+'zip-unsupported' => 'हà¥\80 à¤¸à¤\82à¤\9aिà¤\95ा à¤\8fà¤\95 ZIP à¤¸à¤\82à¤\9aिà¤\95ा à¤\86हà¥\87 à¤\9cà¥\80 à¤®à¤¿à¤¡à¥\80याविà¤\95à¥\80 à¤¦à¥\8dवारे  (support) न केलेले ZIP वैशिष्ट्ये (features) वापरते.
+या संचिकेची सुरक्षा पडताळणी व्यवस्थितरीत्या होऊ शकत नाही.',
 
 # Special:UploadStash
 'uploadstash' => 'चढवणे लपवा',
 'uploadstash-summary' => 'या पानावर अश्या संचिका पहावयास् मिळतात ज्या चढवल्या आहेत (अथवा चढवल्या जात आहेत) परंतु अजून विकी वर प्रकाशित केल्या नाहित. या संचिका फक्त त्या सदस्यास् दिसतील ज्याने त्या चढवल्या आहेत, इतर सदस्यांस् त्या दिसणार नाहीत.',
 'uploadstash-clear' => 'लपवलेल्या संचिका काढा',
 'uploadstash-nofiles' => 'तुमच्याकडे लपवलेल्या संचिका नाहीत.',
-'uploadstash-badtoken' => 'हि कृती अयशस्वी होती. कदाचित आपल्या संपादन अधिकारपत्राची (editing credentials) मुदत संपली.',
+'uploadstash-badtoken' => 'हà¥\80 कृती अयशस्वी होती. कदाचित आपल्या संपादन अधिकारपत्राची (editing credentials) मुदत संपली.',
 'uploadstash-errclear' => 'संचिका स्वच्छ करणे अयशस्वी.',
 'uploadstash-refresh' => 'संचिकांची यादी ताजीतवानी करा',
 'invalid-chunk-offset' => 'अग्राह्य चंक ऑफसेट',
 
 # img_auth script messages
-'img-auth-accessdenied' => 'परवानà¤\97à¥\80 à¤¨à¤¾à¤¹à¥\80',
+'img-auth-accessdenied' => 'पà¥\8bहà¥\8bà¤\9a à¤¨à¤¾à¤\95ारलà¥\8dया à¤\97à¥\87लà¥\80.',
 'img-auth-nopathinfo' => 'मार्ग माहिती आढळली नाही.
 आपला सर्व्हर ही माहिती पोचवू शकत नाही.
 तो सीजीआय-आधारित व इमेज_ऑथला समर्थन न देऊ शकणारा असू शकतो.
@@ -1918,8 +1918,8 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization कृपया हे
 फक्त संचिका वापरण्याची परवानगी आहे.',
 'img-auth-streaming' => 'स्ट्रीमिंग "$1".',
 'img-auth-public' => 'img_auth.php हे  वैयक्तिक विकीमधून  माहिती प्रदान करण्याचे कार्य करते.
-हा विकि सार्वजनिक विकि म्हणून सब्चित करण्यात आला आ.े.
-à¤\89à¤\9aित à¤¸à¥\81रà¤\95à¥\8dषा à¤\95à¥\87 à¤²à¤¿à¤\8f img_auth.php à¤\95à¥\8b à¤¨à¤¿à¤·à¥\8dà¤\95à¥\83य à¤\95िया à¤¹à¥\81à¤\86 à¤¹à¥\88।',
+हा विकि सार्वजनिक विकि म्हणून सब्चित करण्यात आला आे.
+à¤\95िमान à¤¸à¥\81रà¤\95à¥\8dषà¥\87साठà¥\80 img_auth.php à¤²à¤¾ à¤\85à¤\95à¥\8dषम à¤\95à¥\87लà¥\87 à¤\86हà¥\87.',
 'img-auth-noread' => 'तुम्हाला "$1" वाचण्याची परवानगी नाही',
 'img-auth-bad-query-string' => 'या दुव्यामध्ये (URL) अवैध query string आहे.',
 
@@ -1950,7 +1950,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization कृपया हे
 'listfiles_search_for' => 'चित्र नावाने शोध:',
 'imgfile' => 'संचिका',
 'listfiles' => 'चित्र यादी',
-'listfiles_thumb' => 'पà¥\8dरारà¥\81प',
+'listfiles_thumb' => 'नà¤\96à¥\81लà¥\87',
 'listfiles_date' => 'दिनांक',
 'listfiles_name' => 'नाव',
 'listfiles_user' => 'सदस्य',
@@ -1973,7 +1973,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization कृपया हे
 'filehist-datetime' => 'दिनांक/वेळ',
 'filehist-thumb' => 'नखुले',
 'filehist-thumbtext' => '$1 च्या आवृत्तीचे नखुले',
-'filehist-nothumb' => 'पà¥\8dरारà¥\81प नाही',
+'filehist-nothumb' => 'नà¤\96à¥\81लà¥\87à¤\9aितà¥\8dर नाही',
 'filehist-user' => 'सदस्य',
 'filehist-dimensions' => 'आकार',
 'filehist-filesize' => 'संचिकेचा आकार (बाईट्स)',
@@ -1996,7 +1996,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization कृपया हे
 'sharedupload-desc-edit' => "संचिका $1 मधील आहे व ती इतर प्रकल्पांमध्ये वापरली जाऊ शकते.आपणास हवे असल्यास,या पानाच्या[$2 'संचिका वर्णन पान'] येथे,त्याची माहिती संपादु शकता.",
 'sharedupload-desc-create' => "संचिका $1 मधील आहे व ती इतर प्रकल्पांमध्ये वापरली जात असल्याची शक्यता आहे.आपणास हवे असल्यास,या पानाच्या[$2 'संचिका वर्णन पान'] येथे,त्याची माहिती संपादु शकता",
 'filepage-nofile' => 'या नावाची संचिका अस्तित्वात नाही.',
-'filepage-nofile-link' => 'या à¤¨à¤¾à¤µà¤¾à¤\9aà¥\80 à¤¸à¤\82à¤\9aिà¤\95ा à¤\85सà¥\8dतितà¥\8dयà¥\8dवात à¤¨à¤¾à¤¹à¥\80, à¤ªà¤£ à¤¤à¥\81मà¥\8dहà¥\80 à¤¤à¥\80 [$1 à¤\9aढवà¥\82 à¤¶à¤\95ता].',
+'filepage-nofile-link' => 'या नावाची संचिका अस्तित्वात नाही, पण तुम्ही ती [$1 चढवू शकता].',
 'uploadnewversion-linktext' => 'या संचिकेची नवीन आवृत्ती चढवा',
 'shared-repo-from' => '$1 पासून',
 'shared-repo' => 'एक मुक्त कोश',
@@ -2023,13 +2023,13 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization कृपया हे
 'filedelete-success-old' => '<span class="plainlinks">$3, $2 वेळी \'\'\'[[Media:$1|$1]]\'\'\' चे आवर्तन वगळण्यात आले आहे .</span>',
 'filedelete-nofile' => "'''$1''' अस्तित्वात नाही.",
 'filedelete-nofile-old' => "सांगितलेल्या गुणधर्मानुसार  '''$1'''चे कोणतेही विदा आवर्तन संचित नाही.",
-'filedelete-otherreason' => 'à¤\87तर/शिवाय à¤\85धिà¤\95 कारण:',
+'filedelete-otherreason' => 'दà¥\81सरà¥\87/à¤\85तिरिà¤\95à¥\8dत कारण:',
 'filedelete-reason-otherlist' => 'इतर कारण',
 'filedelete-reason-dropdown' => '*वगळण्याची सामान्य कारणे
 ** प्रताधिकार उल्लंघन
 ** जुळी संचिका',
 'filedelete-edit-reasonlist' => 'वगळण्याची कारणे संपादित करा',
-'filedelete-maintenance' => 'फाà¤\88ल à¤µà¤\97ळनà¥\87 à¤\86णि à¤ªà¥\81नà¥\8d:सà¥\8dथापित à¤\95रणà¥\8d',
+'filedelete-maintenance' => 'दà¥\87à¤\96भालà¥\80दरमà¥\8dयान, à¤¸à¤\82à¤\9aिà¤\95ा à¤µà¤\97ळणà¥\87 à¤µ à¤ªà¥\81नरà¥\8dसà¥\8dथापित à¤\95रणà¥\87 à¤¤à¤¾à¤¤à¥\8dपà¥\81रतà¥\87 à¤\85à¤\95à¥\8dषम à¤\95à¥\87लà¥\8dया à¤\97à¥\87लà¥\87 à¤\86हà¥\87.',
 'filedelete-maintenance-title' => 'संचिका (फाईल) वगळू शकत नाही.',
 
 # MIME search
@@ -2037,13 +2037,13 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization कृपया हे
 'mimesearch-summary' => 'हे पान विविधामाप (माईम)-प्रकारांकरिता संचिकांची चाळणी करण्याची सुविधा पुरवते:
 Input:contenttype/subtype, e.g. <code>image/jpeg</code>.',
 'mimetype' => 'विविधामाप (माईम) प्रकार:',
-'download' => 'à¤\89तरवा',
+'download' => 'à¤\85धिभारण à¤\95रा',
 
 # Unwatched pages
-'unwatchedpages' => 'लà¤\95à¥\8dष नसलेली पाने',
+'unwatchedpages' => 'दà¥\87à¤\96रà¥\87à¤\96 नसलेली पाने',
 
 # List redirects
-'listredirects' => 'पà¥\81नरà¥\8dनिरà¥\8dदà¥\87शनà¥\87 à¤¦à¤¾à¤\96वा',
+'listredirects' => 'पà¥\81नरà¥\8dनिरà¥\8dदà¥\87शनाà¤\82à¤\9aà¥\80 à¤¯à¤¾à¤¦à¥\80',
 
 # Unused templates
 'unusedtemplates' => 'न वापरलेले साचे',
@@ -2072,14 +2072,14 @@ Input:contenttype/subtype, e.g. <code>image/jpeg</code>.',
 'statistics-header-views' => 'सांख्यिकी पहा',
 'statistics-header-users' => 'सदस्य सांख्यिकी',
 'statistics-header-hooks' => 'इतर सांख्यिकी',
-'statistics-articles' => 'सà¤\82बà¤\82धित पाने',
+'statistics-articles' => 'à¤\86शय पाने',
 'statistics-pages' => 'पाने',
 'statistics-pages-desc' => 'विकीमधील सर्व पाने, पुनर्निर्देशने, चर्चापानांसहित.',
-'statistics-files' => 'à¤\9aढवलà¥\87लà¥\8dया संचिका',
+'statistics-files' => 'à¤\85पभारà¥\80त संचिका',
 'statistics-edits' => '{{SITENAME}} च्या सुरुवातीपासूनची पानांची संपादने',
 'statistics-edits-average' => 'प्रतिपान सरासरी संपादने',
 'statistics-views-total' => 'सर्व दाखवते',
-'statistics-views-total-desc' => 'à¤\9cà¥\87 à¤ªà¤¾à¤¨à¥\87 à¤¯à¤¾à¤®à¤§à¥\8dदà¥\87 à¤¨à¤¾à¤¹à¥\80त à¤¤à¥\87 à¤ªà¤¾à¤¹à¤¾ à¤\86नि à¤\96ास à¤ªà¤¾à¤¨à¥\87 à¤¸à¤¾à¤®à¤¿à¤²à¤¾ à¤\95रà¥\82 à¤¨à¤\95ा.',
+'statistics-views-total-desc' => 'à¤\85सà¥\8dतितà¥\8dवात à¤¨à¤¸à¤²à¥\87लà¥\80 à¤ªà¤¾à¤¨à¥\87 à¤µ à¤µà¤¿à¤¶à¥\87ष à¤ªà¤¾à¤¨à¥\87 à¤¯à¤¾à¤\82à¤\9aà¥\80 à¤¦à¥\83षà¥\8dयता à¤¯à¤¾à¤¤ à¤\85à¤\82तरà¥\8dभà¥\82त à¤¨à¤¾à¤¹à¥\80',
 'statistics-views-peredit' => 'प्रति संपादनामागे पाहणे',
 'statistics-users' => 'नोंदणीकृत [[Special:ListUsers|सदस्य]]',
 'statistics-users-active' => 'कार्यरत सदस्य',
@@ -2095,13 +2095,16 @@ Input:contenttype/subtype, e.g. <code>image/jpeg</code>.',
 'pageswithprop-prophidden-binary' => 'बायनरी गुणधर्माची किंमत लपविलेली आहे ($1)',
 
 'doubleredirects' => 'दुहेरी-पुनर्निर्देशने',
-'doubleredirectstext' => 'हे पान अशा पानांची सूची पुरवते की जी पुर्ननिर्देशीत पाने दुसऱ्या पुर्ननिर्देशीत पानाकडे निर्देशित झाली आहेत.प्रत्येक ओळीत पहिल्या आणि दुसऱ्या पुर्ननिर्देशनास दुवा दिला आहे सोबतच दुसरे पुर्ननिर्देशन ज्या पानाकडे पोहचते ते पण दिले आहे, जे की बरोबर असण्याची शक्यता आहे ,ते वस्तुतः पहिल्या पानापासूनचेही पुर्ननिर्देशन असावयास हवे.',
+'doubleredirectstext' => 'हे पान, अशा पानांची यादी पुरवते की जी पाने, दुसऱ्या पुर्ननिर्देशीत पानाकडे पुर्ननिर्देशीत झाली आहेत.प्रत्येक ओळीत पहिल्या आणि दुसऱ्या पुर्ननिर्देशनाचा दुवा दिला आहे,तसेच, दुसऱ्या  पुर्ननिर्देशनाचे लक्ष्य पान पण दिले आहे,जे मुळात ते 
+लक्ष्यपान आहे ज्याकडे, पहिले पुनर्निर्देशन असावयास हवे.
+
+<del>खोडलेल्या प्रविष्टी</del>समायोजित करण्यात आलेल्या आहेत.',
 'double-redirect-fixed-move' => '[[$1]] हलवले गेले आहे.
-ते [[$2]] येथे निर्देशित होते.',
-'double-redirect-fixed-maintenance' => '[[$1]] à¤¤à¥\87 [[$2]] à¤¹à¥\87 à¤\9aà¥\81à¤\95à¥\80à¤\9aà¥\87 à¤ªà¥\81नरà¥\8dनिरà¥\8dदà¥\87शन à¤¨à¥\80à¤\9f केले.',
-'double-redirect-fixer' => 'पà¥\81नरà¥\8dनिरà¥\8dदà¥\87शन à¤¨à¥\80à¤\9f करणारा',
+ते आता [[$2]] येथे निर्देशित होते.',
+'double-redirect-fixed-maintenance' => '[[$1]] à¤¤à¥\87 [[$2]] à¤¹à¥\87 à¤\9aà¥\81à¤\95à¥\80à¤\9aà¥\87 à¤ªà¥\81नरà¥\8dनिरà¥\8dदà¥\87शन à¤ à¤¿à¤\95ठाà¤\95 केले.',
+'double-redirect-fixer' => 'पà¥\81नरà¥\8dनिरà¥\8dदà¥\87शन à¤ à¤¿à¤\95ठाà¤\95 करणारा',
 
-'brokenredirects' => 'मà¥\8bडà¤\95à¥\87 à¤ªà¥\81नरà¥\8dनिरà¥\8dदà¥\87शन',
+'brokenredirects' => 'मà¥\8bडà¤\95à¥\80 à¤ªà¥\81नरà¥\8dनिरà¥\8dदà¥\87शनà¥\87',
 'brokenredirectstext' => 'खालील पुनर्निर्देशने अस्तित्वात नसलेली पाने जोडतात:',
 'brokenredirects-edit' => 'संपादन',
 'brokenredirects-delete' => 'वगळा',
@@ -2119,6 +2122,7 @@ Input:contenttype/subtype, e.g. <code>image/jpeg</code>.',
 '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|पानावर|पानांवर}}',
@@ -2157,6 +2161,7 @@ Input:contenttype/subtype, e.g. <code>image/jpeg</code>.',
 'protectedpages' => 'सुरक्षित पाने',
 'protectedpages-indef' => 'फक्त अनंत काळासाठी सुरक्षित केलेले',
 'protectedpages-cascade' => 'केवळ एकामेकांवर अवलंबून कास्केडींग सुरक्षा (सुरक्षा शिडी)',
+'protectedpages-noredirect' => 'पुनर्निर्देशने लपवा',
 'protectedpagesempty' => 'सध्या या नियमावलीने कोणतीही पाने सुरक्षित केलेली नाहीत.',
 'protectedtitles' => 'सुरक्षीत शीर्षके',
 'protectedtitlesempty' => 'या नियमावलीने सध्या कोणतीही शीर्षके सुरक्षित केलेली नाहीत.',
@@ -2270,14 +2275,14 @@ Input:contenttype/subtype, e.g. <code>image/jpeg</code>.',
 'listgrouprights-rights' => 'अधिकार',
 'listgrouprights-helppage' => 'Help:गट अधिकार',
 'listgrouprights-members' => '(सदस्यांची यादी)',
-'listgrouprights-addgroup' => '{{PLURAL:$2|गट|गट}} वाढवा: $1',
-'listgrouprights-removegroup' => '{{PLURAL:$2|गट|गट}} वगळा: $1',
+'listgrouprights-addgroup' => '{{PLURAL:$2|गट}} वाढवा: $1',
+'listgrouprights-removegroup' => '{{PLURAL:$2|गट}} वगळा: $1',
 'listgrouprights-addgroup-all' => 'सर्व गट वाढवा',
-'listgrouprights-removegroup-all' => 'सरà¥\8dव à¤¸à¤®à¥\82ह काढून टाका',
-'listgrouprights-addgroup-self' => 'स्वतःच्या खात्यात हे {{PLURAL:$2|गट|गट}} मिळवा: $1',
-'listgrouprights-removegroup-self' => 'स्वतःच्या खात्यातून हे {{PLURAL:$2|गट|गट}} वगळा: $1',
-'listgrouprights-addgroup-self-all' => 'सरà¥\8dव à¤¸à¤®à¥\82ह à¤¸à¥\8dवतà¤\83à¤\9aà¥\8dया à¤\96ातà¥\8dयात à¤®à¤¿à¤³à¤µा',
-'listgrouprights-removegroup-self-all' => 'सरà¥\8dव à¤¸à¤®à¥\82ह स्वतःच्या खात्यातून काढून टाका',
+'listgrouprights-removegroup-all' => 'सरà¥\8dव à¤\97à¤\9f काढून टाका',
+'listgrouprights-addgroup-self' => 'स्वतःच्या खात्यात हे {{PLURAL:$2|गट}} मिळवा: $1',
+'listgrouprights-removegroup-self' => 'स्वतःच्या खात्यातून हे {{PLURAL:$2|गट}} वगळा: $1',
+'listgrouprights-addgroup-self-all' => 'सरà¥\8dव à¤\97à¤\9f à¤¸à¥\8dवतà¤\83à¤\9aà¥\8dया à¤\96ातà¥\8dयात à¤\9cà¥\8bडा',
+'listgrouprights-removegroup-self-all' => 'सरà¥\8dव à¤\97à¤\9f स्वतःच्या खात्यातून काढून टाका',
 
 # Email user
 'mailnologin' => 'पाठविण्याचा पत्ता नाही',
@@ -2296,22 +2301,22 @@ Input:contenttype/subtype, e.g. <code>image/jpeg</code>.',
 'noemailtitle' => 'विपत्र पत्ता नाही',
 'noemailtext' => 'या सदस्याने वैध विपत्र पत्ता नमूद केलेला नाही.',
 'nowikiemailtitle' => 'विपत्र प्रतिबंधित',
-'nowikiemailtext' => 'हा à¤ªà¥\8dरयà¥\8bà¤\95à¥\8dता à¤\85नà¥\8dय à¤ªà¥\8dरयà¥\8bà¤\95à¥\8dता à¤\95डà¥\82न  à¤\88-मà¥\87ल à¤\98à¥\87à¤\8a à¤\87à¤\9aà¥\8dà¤\9bित à¤¨à¤¾à¤¹à¥\80.',
-'emailnotarget' => 'पà¥\8dरापà¥\8dतà¤\95रà¥\8dता à¤\95रà¥\80ता à¤\85सà¥\8dतितà¥\8dवात à¤¨à¤¸à¤²à¥\87लà¥\87  à¤\95िà¤\82वा à¤\85वà¥\88ध à¤¸à¤¦à¤¸à¥\8dय',
-'emailtarget' => 'पà¥\8dरापà¥\8dतà¤\95रà¥\8dता à¤ªà¥\8dरयà¥\8bà¤\95à¥\8dताà¤\9aà¥\87 à¤¨à¤¾à¤\82व à¤\9fाà¤\95ा.',
+'nowikiemailtext' => 'या à¤¸à¤¦à¤¸à¥\8dयानà¥\87 à¤\85नà¥\8dय à¤¸à¤¦à¤¸à¥\8dयाà¤\82à¤\95डà¥\82न  à¤\88-मà¥\87ल à¤¯à¥\87à¤\8a à¤¨ à¤¦à¥\87णà¥\8dयाà¤\9aà¥\87 (à¤\90à¤\9aà¥\8dà¤\9bिà¤\95) à¤¨à¤¿à¤µà¤¡à¤²à¥\87 à¤\86हà¥\87.',
+'emailnotarget' => 'पà¥\8dरापà¥\8dतà¤\95रà¥\8dतà¥\8dयाà¤\9aà¥\87 à¤\85सà¥\8dतितà¥\8dवात à¤¨à¤¸à¤²à¥\87लà¥\87  à¤\95िà¤\82वा à¤\85वà¥\88ध à¤¸à¤¦à¤¸à¥\8dयनाम.',
+'emailtarget' => 'पà¥\8dरापà¥\8dतà¤\95रà¥\8dतà¥\8dयाà¤\9aà¥\87 à¤¸à¤¦à¤¸à¥\8dयनाम à¤\9fाà¤\95ा',
 'emailusername' => 'सदस्यनाम:',
 'emailusernamesubmit' => 'पाठवा',
-'email-legend' => 'à¤\88मà¥\87ल à¤\85नà¥\8dय à¤¸à¤¦à¤¸à¥\8dयाला पाठवा',
-'emailfrom' => 'प्रेषक',
+'email-legend' => 'à¤\85नà¥\8dय {{SITENAME}} à¤µà¤°à¥\80ल à¤¸à¤¦à¤¸à¥\8dयाला à¤\88मà¥\87ल पाठवा',
+'emailfrom' => 'प्रेषक:',
 'emailto' => 'प्रति:',
 'emailsubject' => 'विषय:',
 'emailmessage' => 'संदेश:',
 'emailsend' => 'पाठवा',
-'emailccme' => 'माà¤\9dà¥\8dया à¤¸à¤\82दà¥\87शाà¤\9aà¥\80 à¤®à¤²à¤¾ à¤µà¤¿à¤ªà¤¤à¥\8dर à¤ªà¥\8dरत पाठवा.',
-'emailccsubject' => 'तुमच्या विपत्राची प्रत कडे $1: $2',
+'emailccme' => 'माà¤\9dà¥\8dया à¤¸à¤\82दà¥\87शाà¤\9aà¥\80 à¤ªà¥\8dरत à¤®à¤²à¤¾ à¤µà¤¿à¤ªà¤¤à¥\8dरादà¥\8dवारà¥\87 पाठवा.',
+'emailccsubject' => '$1 ला पाठविलेल्या आपल्या विपत्राची प्रत: $2',
 'emailsent' => 'विपत्र पाठवले',
 'emailsenttext' => 'तुमचा विपत्र संदेश पाठवण्यात आला आहे.',
-'emailuserfooter' => 'हे विपत्र $1 ने $2 ला {{SITENAME}} वरील "सदस्यास विपत्र पाठवा" वापरुन पाठवले आहे.',
+'emailuserfooter' => '$1 ने $2 ला हे विपत्र, {{SITENAME}} वरील, "सदस्यास विपत्र पाठवा" ही प्रक्रिया वापरुन पाठवले आहे.',
 
 # User Messenger
 'usermessage-summary' => 'प्रणाली संदेश देत आहे.',
@@ -2323,8 +2328,8 @@ Input:contenttype/subtype, e.g. <code>image/jpeg</code>.',
 'watchlistfor2' => '$1 $2 साठी',
 'nowatchlist' => 'तुमची पहाऱ्याची सूची रिकामी आहे.',
 'watchlistanontext' => 'तुमच्या पहाऱ्याच्या सूचीमधील बाबी पाहण्याकरता किंवा संपादित करण्याकरता, कृपया $1.',
-'watchnologin' => 'पà¥\8dरवà¥\87श à¤\95à¥\87लà¥\87ला नाही',
-'watchnologintext' => 'तà¥\81मà¤\9aà¥\80 à¤ªà¤¹à¤¾à¤±à¥\8dयाà¤\9aà¥\80 à¤¸à¥\82à¤\9aà¥\80 à¤¬à¤¦à¤²à¤¾à¤¯à¤\9aà¥\80 à¤\85सà¥\87ल à¤¤à¤° à¤¤à¥\81मà¥\8dहà¥\80 [[Special:UserLogin|पà¥\8dरवà¥\87श à¤\95à¥\87लà¥\87ला]] à¤\85सलाà¤\9a à¤ªà¤¾à¤¹à¥\80à¤\9cà¥\87.',
+'watchnologin' => 'सनà¥\8bà¤\82द-पà¥\8dरवà¥\87शित नाही',
+'watchnologintext' => 'à¤\86पलà¥\80 à¤ªà¤¹à¤¾à¤±à¥\8dयाà¤\9aà¥\80 à¤¸à¥\82à¤\9aà¥\80 à¤¬à¤¦à¤²à¤µà¤¾à¤¯à¤\9aà¥\80 à¤\85सà¥\87ल à¤¤à¤° à¤\86पणास [[Special:UserLogin|सनà¥\8bà¤\82द-पà¥\8dरवà¥\87शित]] à¤\85सावà¥\87 à¤²à¤¾à¤\97à¥\87ल.',
 'addwatch' => 'पहाऱ्याच्या सूचीमध्ये टाका',
 'addedwatchtext' => '"[[:$1]]"  हे पान तुमच्या  [[Special:Watchlist|\'माझी निरीक्षणसूची\']]मध्ये टाकले आहे. या पानावरील तसेच त्याच्या चर्चा पानावरील भविष्यातील बदल तेथे दाखवले जातील',
 'removewatch' => 'पहाऱ्याच्या सूचीतून वगळा',
@@ -2333,7 +2338,7 @@ Input:contenttype/subtype, e.g. <code>image/jpeg</code>.',
 'watchthispage' => 'या पानावर बदलांसाठी लक्ष ठेवा.',
 'unwatch' => 'पहारा काढा',
 'unwatchthispage' => 'पहारा काढून टाका',
-'notanarticle' => 'मà¤\9cà¤\95à¥\81र à¤µà¤¿à¤°à¤¹à¤¿à¤¤ à¤ªà¤¾à¤¨',
+'notanarticle' => 'हà¥\87 à¤\86शयपान à¤¨à¤¾à¤¹à¥\80',
 'notvisiblerev' => 'आवृत्ती वगळण्यात आलेली आहे',
 'watchlist-details' => 'पहाऱ्याच्या सूचीमधील {{PLURAL:$1|$1 पान|$1 पाने}}, यात चर्चा पाने मोजलेली नाहीत.',
 'wlheader-enotif' => 'विपत्र अधिसूचना सुविधा शक्य केली.',
@@ -2341,17 +2346,17 @@ Input:contenttype/subtype, e.g. <code>image/jpeg</code>.',
 'watchmethod-recent' => 'पहाऱ्यातील पानांकरिता अलीकडील बदलांचा तपास',
 'watchmethod-list' => 'अलीकडील बदलांकरिता पहाऱ्यातील पानांचा तपास',
 'watchlistcontains' => 'तुमचा $1 {{PLURAL:$1|पानावर|पानांवर}} पहारा आहे.',
-'iteminvalidname' => "'$1'बाबà¥\80स à¤¸à¤®à¤¸à¥\8dया, à¤\85मानà¥\8dय नाव...",
+'iteminvalidname' => "'$1'या à¤¬à¤¾à¤¬à¥\80साठà¥\80 à¤¸à¤®à¤¸à¥\8dया, à¤\85वà¥\88ध नाव...",
 'wlnote' => "खाली $3, $4 पर्यंतचे गेल्या {{PLURAL:$2| '''१''' तासातील|'''$2''' तासातील}} {{PLURAL:$1|शेवटचा बदल दिला आहे|शेवटाचे '''$1'''बदल दिले आहेत}}.",
 'wlshowlast' => 'मागील $1 तास $2 दिवस $3 पहा',
 'watchlist-options' => 'पहाऱ्याच्या सूचीचे पर्याय',
 
 # Displayed when you click the "watch" button and it is in the process of watching
-'watching' => 'पाहताहे...',
+'watching' => 'पहारा à¤¦à¥\87त à¤\86हे...',
 'unwatching' => 'पहारा काढत आहे...',
 'watcherrortext' => '$1 साठीच्या तुमच्या पहाऱ्याच्या सूचीमधील मांडणीत (watchlist settings) बदल करताना त्रुटी आली.',
 
-'enotif_mailer' => '{{SITENAME}} सूचना विपत्र',
+'enotif_mailer' => '{{SITENAME}} à¤\85धिसà¥\82à¤\9aना à¤µà¤¿à¤ªà¤¤à¥\8dर',
 'enotif_reset' => 'सर्व पानास भेट दिल्याचे नमूद करा',
 'enotif_impersonal_salutation' => '{{SITENAME}} सदस्य',
 'enotif_subject_deleted' => '{{SITENAME}} पानाला $1 {{gender:$2|$2}} ने वगळले',
@@ -2364,9 +2369,9 @@ Input:contenttype/subtype, e.g. <code>image/jpeg</code>.',
 'enotif_body_intro_moved' => '{{SITENAME}} हे $1 या लेखनामाचे पान या $PAGEEDITDATE (या संपादनाच्या तारखेस)$2 ने {{GENDER:$2|हलविले.}} अद्यतन आवृत्तीसाठी कृपया $3 बघा.',
 'enotif_body_intro_restored' => '{{SITENAME}} हे $1 या लेखनामाचे पान या $PAGEEDITDATE (या संपादनाच्या तारखेस)$2 ने {{GENDER:$2|पुनर्स्थापित केले.}}अद्यतन आवृत्तीसाठी कृपया $3 बघा.',
 'enotif_body_intro_changed' => '{{SITENAME}} हे $1 या लेखनामाचे पान या $PAGEEDITDATE (या संपादनाच्या तारखेस)$2 ने {{GENDER:$2|बदलविले.}} अद्यतन आवृत्तीसाठी कृपया $3 बघा.',
-'enotif_lastvisited' => 'तà¥\81मà¤\9aà¥\8dया à¤¶à¥\87वà¤\9fà¤\9aà¥\8dया à¤­à¥\87à¤\9fà¥\80नà¤\82तरà¤\9aà¥\87 à¤¬à¤¦à¤² à¤¬à¤\98णयासाठà¥\80 à¤ªà¤¹à¤¾ - $1.',
+'enotif_lastvisited' => 'तà¥\81मà¤\9aà¥\8dया à¤¶à¥\87वà¤\9fà¤\9aà¥\8dया à¤­à¥\87à¤\9fà¥\80नà¤\82तरà¤\9aà¥\87 à¤¬à¤¦à¤² à¤¬à¤\98णà¥\8dयासाठà¥\80 $1 à¤ªà¤¹à¤¾.',
 'enotif_lastdiff' => 'हा बदल पहाण्याकरिता $1 पहा.',
-'enotif_anon_editor' => 'à¤\85नामिà¤\95 à¤\89पयà¥\8bà¤\97à¤\95रà¥\8dता $1',
+'enotif_anon_editor' => 'à¤\85नामिà¤\95 à¤¸à¤¦à¤¸à¥\8dय $1',
 'enotif_body' => 'प्रिय $WATCHINGUSERNAME,
 
 {{SITENAME}}या लेखनावाचे $PAGETITLE (या मथळ्याचे) पान $PAGEEDITOR ने $PAGEEDITDATE ( या तारखेस) $CHANGEDORCREATED तयार केले किंवा बदलले आहे. सध्याची आवृत्ती पाहण्यासाठी खालील दुव्यावर टिचकी मारा.
@@ -2406,8 +2411,8 @@ $UNWATCHURL
 'delete-confirm' => '"$1" वगळा',
 'delete-legend' => 'वगळा',
 'historywarning' => 'सूचना: तुम्ही वगळत असलेल्या पानाला $1 {{PLURAL:$1|आवर्तनाचा|आवर्तनांचा}} इतिहास आहे:',
-'confirmdeletetext' => 'तुम्ही एक लेख त्याच्या सर्व इतिहासासोबत वगळण्याच्या तयारीत आहात.
-कृपया तुम्ही करत असलेली कृती ही मीडियाविकीच्या [[{{MediaWiki:Policy-url}}|नीतीनुसार]] आहे ह्याची खात्री करा. तसेच तुम्ही करित असलेल्या कृतीचे परिणाम कृती करण्यापूर्वी जाणून घ्या.',
+'confirmdeletetext' => 'तुम्ही एक लेखपान त्याच्या सर्व इतिहासासोबत वगळण्याच्या तयारीत आहात.
+कृपया, तुम्ही करीत असलेली कृती ही मीडियाविकीच्या [[{{MediaWiki:Policy-url}}|नीतीनुसार]] आहे ह्याची खात्री करा. तसेच, तुम्ही करीत असलेल्या कृतीचे परिणाम, कृती करण्यापूर्वी जाणून घ्या.',
 'actioncomplete' => 'काम पूर्ण',
 'actionfailed' => 'कृती अयशस्वी झाली',
 'deletedtext' => '"$1" हा लेख वगळला. अलीकडे वगळलेले लेख पाहण्यासाठी $2 पहा.',
@@ -2425,17 +2430,16 @@ $UNWATCHURL
 ** लेखकाची(लेखिकेची) विनंती
 ** तुटकी पुनर्निर्देशने',
 'delete-edit-reasonlist' => 'वगळण्याची कारणे संपादित करा',
-'delete-toobig' => 'या पानाला खूप मोठी इतिहास यादी आहे, तसेच हे पान $1 {{PLURAL:$1|पेक्षा|पेक्षा}}पेक्षा जास्त वेळा बदलण्यात आलेले आहे. अशी पाने वगळणे हे {{SITENAME}} ला धोकादायक ठरू नये म्हणून शक्य केलेले नाही.',
-'delete-warning-toobig' => 'या पानाला खूप मोठी इतिहास यादी आहे, तसेच हे पान $1 {{PLURAL:$1|पेक्षा|पेक्षा}} पेक्षा जास्त वेळा बदलण्यात आलेले आहे.
-अशी पाने वगळणे हे {{SITENAME}} ला धोकादायक ठरू शकते;
-कृपया काळजीपूर्वक हे पान वगळा.',
+'delete-toobig' => 'या पानाला, $1 {{PLURAL:$1|आवृत्ती|आवृत्त्यां}}मुळे तयार झालेला खूप मोठा संपादन इतिहास आहे. {{SITENAME}} वर आकस्मिक होणारी उलथापालथ वाचविण्यासाठी, अश्या पानांचे वगळणे प्रतिबंधित केल्या गेले आहे.',
+'delete-warning-toobig' => 'या पानाला, $1 {{PLURAL:$1|आवृत्ती|आवृत्त्यां}}मुळे तयार झालेला खूप मोठा संपादन इतिहास आहे.त्याचे वगळण्याने {{SITENAME}} वर डाटाबेसच्या क्रियांची उलथापालथ होऊ शकते; सावधगिरीने पुढे जा.',
+'deleting-backlinks-warning' => "'''ईशारा:''' आपण वगळत असणाऱ्या पानास दुसरी पाने जोडलेली किंवा आंतरविन्यासित आहेत.",
 
 # Rollback
 'rollback' => 'बदल वेगात माघारी न्या',
 'rollback_short' => 'द्रुतमाघार',
 'rollbacklink' => 'द्रुतमाघार',
 'rollbacklinkcount' => 'उलटवा $1 {{PLURAL:$1|संपादन|संपादने}}',
-'rollbacklinkcount-morethan' => '$1 पेक्षा अधिक उलटवा {{PLURAL:$1|संपादन|संपादने}}',
+'rollbacklinkcount-morethan' => '$1 पेक्षा अधिक {{PLURAL:$1|संपादन|संपादने}} उलटवा',
 'rollbackfailed' => 'द्रूतमाघार फसली',
 'cantrollback' => 'जुन्या आवृत्तीकडे परतवता येत नाही; शेवटचा संपादक या पानाचा एकमात्र लेखक आहे.',
 'alreadyrolled' => '[[User:$2|$2]] ([[User talk:$2|Talk]] [[Special:Contributions/$2|{{int:contribslink}}]])चे शेवटाचे [[:$1]]वे संपादन माघारी परतवता येत नाही; पान आधीच कुणी माघारी परतवले आहे किंवा संपादित केले आहे.
@@ -2443,12 +2447,13 @@ $UNWATCHURL
 शेवटचे संपादन [[User:$3|$3]] ([[User talk:$3|Talk]] [[Special:Contributions/$3|{{int:contribslink}}]])-चे होते.',
 'editcomment' => "संपादन सारांश \"''\$1''\" होता.",
 'revertpage' => '[[Special:Contributions/$2|$2]] ([[User talk:$2|चर्चा]]) यांनी केलेले बदल [[User:$1|$1]] यांच्या आवृत्तीकडे पूर्वपदास नेले.',
-'revertpage-nouser' => 'लपविलेल्या सदस्याची संपादने उलटवून {{GENDER:$1|[[सदस्य:$1|$1]]}} यांच्या आवृत्तीप्रमाणे पूर्ववत केले.',
+'revertpage-nouser' => 'लपविलेल्या सदस्याची संपादने उलटवून मागील आवृत्तीप्रमाणे पूर्ववत केले{{GENDER:$1|[[सदस्य:$1|$1]]}}',
 'rollback-success' => '$1 ने उलटवलेली संपादने;$2 च्या आवृत्तीस परत नेली.',
 
 # Edit tokens
 'sessionfailure-title' => 'सत्र त्रुटी',
-'sessionfailure' => 'तुमच्या दाखल सत्रात काही समस्या दिसते;सत्र अपहारणा पासून काळजी घेण्याच्या दृष्टीने ही कृती रद्द केली गेली आहे.कपया आपल्या विचरकाच्या "back" कळीवर टिचकी मारा आणि तुम्ही ज्या पानावरून आला ते पुन्हा चढवा,आणि प्रत प्रयत्न करा.',
+'sessionfailure' => 'तुमच्या दाखल सत्रात काही समस्या दिसते;सत्र अपहारणापासून 
+वाचविण्याचे दृष्टीने ही कृती रद्द केल्या गेली आहे.कृपया आपल्या विचरकाच्या "back" कळीवर टिचकी मारा आणि तुम्ही ज्या पानावरून आला ते पुन्हा चढवा,आणि परत प्रयत्न करा.',
 
 # Protect
 'protectlogpage' => 'सुरक्षा नोंदी',
@@ -2482,7 +2487,7 @@ $UNWATCHURL
 'protect-level-sysop' => 'केवळ प्रचालकांना परवानगी आहे',
 'protect-summary-cascade' => 'शिडी',
 'protect-expiring' => '$1 (UTC) ला संपेल',
-'protect-expiring-local' => '$1 à¤²à¤¾ à¤¸à¤®à¥\8dपते',
+'protect-expiring-local' => '$1 à¤²à¤¾ à¤¸à¤\82पते',
 'protect-expiry-indefinite' => 'अनंत',
 'protect-cascade' => 'या पानात असलेली पाने सुरक्षित करा (सुरक्षा शिडी)',
 'protect-cantedit' => 'तुम्ही या पानाची सुरक्षा पातळी बदलू शकत नाही कारण तुम्हाला तसे करण्याची परवानगी नाही.',
@@ -2520,17 +2525,18 @@ $UNWATCHURL
 'undeletepage' => 'वगळलेली पाने पहा आणि पुनर्स्थापित करा',
 'undeletepagetitle' => "'''खाली [[:$1]] च्या वगळलेल्या आवृत्त्या समाविष्ट केलेल्या आहेत'''.",
 'viewdeletedpage' => 'काढून टाकलेले लेख पहा',
-'undeletepagetext' => 'à¤\96ालà¥\80ल {{PLURAL:$1|पान à¤µà¤\97ळलà¥\87 à¤\86हà¥\87 à¤¤à¤°à¥\80सà¥\81दà¥\8dधा à¤µà¤¿à¤¦à¤¾à¤\97ारात à¤\9cतन à¤\86हà¥\87 à¤\86णि à¤ªà¥\81रà¥\8dनà¥\8dसà¥\8dथापित à¤\95रणà¥\87 à¤¶à¤\95à¥\8dय à¤\86हà¥\87|$1 à¤ªà¤¾à¤¨à¥\87 à¤µà¤\97ळलà¥\80 à¤\86हà¥\87त à¤¤à¤°à¥\80 à¤¸à¥\81दà¥\8dधा à¤µà¤¿à¤¦à¤¾à¤\97ारात à¤\9cतन à¤\86हà¥\87त à¤\86णि à¤ªà¥\81रà¥\8dन्स्थापित करणे शक्य आहेत}}. विदागारातील साठवण ठरावीक कालावधीने स्वच्छ करता येते.',
+'undeletepagetext' => 'à¤\96ालà¥\80ल {{PLURAL:$1|पान à¤µà¤\97ळलà¥\87 à¤\86हà¥\87 à¤¤à¤°à¥\80सà¥\81दà¥\8dधा à¤µà¤¿à¤¦à¤¾à¤\97ारात à¤\9cतन à¤\86हà¥\87 à¤\86णि à¤ªà¥\81नरà¥\8dसà¥\8dथापित à¤\95रणà¥\87 à¤¶à¤\95à¥\8dय à¤\86हà¥\87|$1 à¤ªà¤¾à¤¨à¥\87 à¤µà¤\97ळलà¥\80 à¤\86हà¥\87त à¤¤à¤°à¥\80 à¤¸à¥\81दà¥\8dधा à¤µà¤¿à¤¦à¤¾à¤\97ारात à¤\9cतन à¤\86हà¥\87त à¤\86णि à¤ªà¥\81नर्स्थापित करणे शक्य आहेत}}. विदागारातील साठवण ठरावीक कालावधीने स्वच्छ करता येते.',
 'undelete-fieldset-title' => 'आवर्तने पुनर्स्थापित करा',
-'undeleteextrahelp' => "संपूर्ण पान पुनर्स्थापित करण्याकरिता,सारे रकाने रिकामे ठेवा आणि '''''पुनर्स्थापन'''''वर टिचकी मारा. निवडक पुनर्स्थापन करण्याकरिता, ज्या आवर्तनांचे पुनर्स्थापन करावयाचे त्यांचे रकाने निवडा , आणि '''''पुनर्स्थापन'''''वर टिचकी मारा. '''''पुनर्योजन ''''' वर टिचकी मारल्यास सारे रकाने आणि प्रतिक्रिया खिडकी रिकामी होईल.",
+'undeleteextrahelp' => "पानाचा संपूर्ण इतिहास पुनर्स्थापित करण्यासाठी,साऱ्या चौकटपेट्या (चेकबॉक्सेस) रिकाम्या ठेवा
+आणि  '''''{{int:undeletebtn}}''''' वर टिचकी मारा. निवडक पुनर्स्थापन करण्याकरिता, ज्या आवर्तनांचे पुनर्स्थापन करावयाचे त्यांचेशी सुसंगत चौकटपेट्या (चेकबॉक्सेस) निवडा , आणि '''''{{int:undeletebtn}}''''' वर टिचकी मारा.",
 'undeleterevisions' => '$1 {{PLURAL:$1|आवर्तन|आवर्तने}}विदागारात संचीत',
 'undeletehistory' => 'जर तुम्ही पान पुनर्स्थापित केले तर ,सारी आवर्तने इतिहासात पुनर्स्थापित होतील.
 वगळल्या पासून त्याच नावाचे नवे पान तयार केले गेले असेले तर, पुनर्स्थापित आवर्तने पाठीमागील इतिहासात दिसतील. पुनर्स्थापना नंतर संचिकांच्या आवर्तनांवरील बंधने गळून पडतील याची नोंद घ्या.',
 'undeleterevdel' => 'पृष्ठ पानाचे आवर्तन अर्धवट वगळले जाणार असेल तर पुनर्स्थापनाची कृती केली जाणार नाही.
 अशा प्रसंगी, तुम्ही अगदी अलीकडील वगळलेली आवर्तने अनचेक किंवा अनहाईड केलीच पाहिजे.',
-'undeletehistorynoadmin' => 'हà¥\87 à¤ªà¤¾à¤¨ à¤µà¤\97ळलà¥\87 à¤\97à¥\87लà¥\87 à¤\86हà¥\87.वà¤\97ळणà¥\8dयाà¤\9aà¥\87 à¤\95ारण à¤\96ालà¥\80ल à¤\86ढावà¥\8dयात,वà¤\97ळणà¥\8dयापà¥\82रà¥\8dवà¥\80 à¤¸à¤\82पादित à¤\95रणाऱà¥\8dया à¤¸à¤\82पादà¤\95ाà¤\82à¤\9aà¥\8dया à¤®à¤¾à¤¹à¤¿à¤¤à¥\80 à¤¸à¥\8bबत,दाà¤\96वलà¥\87 à¤\86हà¥\87. à¤µà¤\97ळलà¥\87लà¥\8dया à¤\86वरà¥\8dतà¥\8dनाà¤\82à¤\9aा à¤¨à¥\87मà¤\95ा à¤®à¤\9cà¤\95à¥\82र à¤\95à¥\87वळ à¤ªà¥\8dरà¤\9aालà¤\95ाà¤\82ना à¤\89पलबà¥\8dध à¤\85सà¥\87ल.',
+'undeletehistorynoadmin' => 'हे पान वगळले गेले आहे.वगळण्याचे कारण खालील आढाव्यात,वगळण्यापूर्वी संपादित करणाऱ्या संपादकांच्या माहिती सोबत,दाखवले आहे. वगळलेल्या आवर्तनांचा नेमका मजकूर केवळ प्रचालकांना उपलब्ध असेल.',
 'undelete-revision' => '$1चे($4चे, $5 येथील) आवर्तन $3 ने वगळले:',
-'undeleterevision-missing' => 'अयोग्य अथवा नसापडणारे आवर्तन. तुमचा दुवा कदाचित चुकीचा असेल, किंवा आवर्तन पुनर्स्थापित केले गेले असेल किंवा विदागारातून वगळले असेल.',
+'undeleterevision-missing' => 'अयोग्य अथवा न सापडणारे आवर्तन. तुमचा दुवा कदाचित चुकीचा असेल, किंवा आवर्तन पुनर्स्थापित केले गेले असेल किंवा विदागारातून वगळले गेले असेल.',
 'undelete-nodiff' => 'पूर्वीचे कोणतेही आवर्तन आढळले नाही.',
 'undeletebtn' => 'वगळण्याची क्रिया रद्द करा',
 'undeletelink' => 'पहा/पुनर्स्थापित करा',
@@ -2554,7 +2560,7 @@ $UNWATCHURL
 'undelete-bad-store-key' => '$1 वेळ दिलेली संचिका आवर्तन पुनर्स्थापित करता येत नाही:संचिका वगळण्यापूर्वी पासून मिळाली नव्हती.',
 'undelete-cleanup-error' => 'न वापरलेली विदा संचिका "$1" वगळताना त्रुटी दाखवते.',
 'undelete-missing-filearchive' => 'संचिका विदास्मृती ID $1 पुनर्स्थापित करू शकत नाही कारण ती विदागारात उपलब्ध नाही. ती आधीच पुनर्स्थापित केली असण्याची शक्यता सुद्धा असू शकते.',
-'undelete-error' => 'à¤\9cर à¤ªà¤¾à¤¨à¤¾ à¤\95ाढà¥\82न à¤¨à¤¾à¤¹à¥\80 à¤\9fाà¤\95लà¥\87 à¤¤à¤° à¤ªà¤¾à¤¨ à¤¶à¥\80रà¥\8dषà¤\95',
+'undelete-error' => 'पान à¤ªà¥\81नरà¥\8dसà¥\8dथापनात à¤¤à¥\8dरà¥\82à¤\9fà¥\80',
 'undelete-error-short' => 'संचिकेचे वगळणे उलटवताना त्रूटी: $1',
 'undelete-error-long' => 'संचिकेचे वगळणे उलटवताना त्रुटींचा अडथळा आला:
 
@@ -2565,7 +2571,7 @@ $1',
 # Namespace form on various pages
 'namespace' => 'नामविश्व:',
 'invert' => 'निवडीचा क्रम उलटा करा',
-'tooltip-invert' => 'निवडलेल्या नामविश्वातील (आणि तसे निवडल्यास संबंधित नामविश्वातील)  पानांचे बदल  अदृष्य करण्या साटी टिचकी मारा',
+'tooltip-invert' => 'निवडलेल्या नामविश्वातील (आणि तसे निवडल्यास संबंधित नामविश्वातील)  पानांचे बदल  अदृष्य करण्यासाठी टिचकी मारा',
 'namespace_association' => 'सहभागी नामविश्वे',
 'tooltip-namespace_association' => 'निवडलेल्या नामविश्वासंबधीत विषय अथवा चर्चा नामविश्वसुद्धा आंतर्भूत करण्याकरिता हा बॉक्स टिचकवून चिह्नित करा',
 'blanknamespace' => '(मुख्य)',
@@ -2618,9 +2624,9 @@ $1',
 'whatlinkshere-filters' => 'गाळण्या',
 
 # Block/unblock
-'autoblockid' => '#$1ला स्वयंचलितपणे प्रतिबंधित करा',
+'autoblockid' => 'स्वयंचलितपणे #$1ला प्रतिबंधित करा',
 'block' => 'सदस्यास प्रतिबंध करा',
-'unblock' => 'सदस्य सोडवा',
+'unblock' => 'सदस्यप्रतिबंध काढा',
 'blockip' => 'हा अंकपत्ता अडवा',
 'blockip-legend' => 'सदस्यास प्रतिबंध करा',
 'blockiptext' => 'एखाद्या विशिष्ट अंकपत्त्याची किंवा सदस्याची लिहिण्याची क्षमता प्रतिबंधित  करण्याकरिता खालील सारणी वापरा.
@@ -2648,7 +2654,7 @@ $1',
 'ipbwatchuser' => 'या सदस्याच्या सदस्य तसेच चर्चा पानावर पहारा ठेवा',
 'ipb-disableusertalk' => 'सदस्यास स्वत:चे चर्चापान संपादण्यापासून प्रतिबंधित करा',
 'ipb-change-block' => 'या सेटींग्जसह सदस्यास पुन्हा प्रतिबंधित करा.',
-'ipb-confirm' => 'à¤\85डथाळा सुनिश्चित करा.',
+'ipb-confirm' => 'पà¥\8dरतिबà¤\82ध सुनिश्चित करा.',
 'badipaddress' => 'अंकपत्ता बरोबर नाही.',
 'blockipsuccesssub' => 'अडवणूक यशस्वी झाली',
 'blockipsuccesstext' => '[[Special:Contributions/$1|$1]]ला प्रतिबंधित केले.<br />
@@ -2696,7 +2702,7 @@ $1',
 'change-blocklink' => 'रोध बदला',
 'contribslink' => 'योगदान',
 'emaillink' => 'ई-मेल पाठवा.',
-'autoblocker' => 'स्वयंचलितप्रतिबंधन केले गेले कारण तुमचा अंकपत्ता अलीकडे "[[User:$1|$1]]"ने वापरला होता. $1 च्या प्रतिबंधनाकरिता दिलेले कारण: "$2" आहे.',
+'autoblocker' => 'स्वयंचलित प्रतिबंधन केले गेले कारण तुमचा अंकपत्ता अलीकडे "[[User:$1|$1]]"ने वापरला होता. $1 च्या प्रतिबंधनाकरिता दिलेले कारण: "$2" आहे.',
 'blocklogpage' => 'रोध नोंदी',
 'blocklog-showlog' => 'हा सदस्य पूर्वी प्रतिबंधित अथवा लपविल्या गेला होता.
 लपविलेल्या नोंदी  संदर्भाकरिता खाली उपलब्ध आहेत.',
@@ -2718,7 +2724,7 @@ $1',
 'range_block_disabled' => 'प्रचालकांची पल्ला बंधने घालण्याची क्षमता अनुपलब्ध केली आहे.',
 'ipb_expiry_invalid' => 'अयोग्य समाप्ती काळ.',
 'ipb_expiry_temp' => 'लपविलेले सदस्यनाम प्रतिबंधन कायमस्वरूपी असले पाहिजे.',
-'ipb_hide_invalid' => 'हà¥\87 à¤\96ात à¤¦à¤¾à¤¬à¤¨à¥\8dयासाथि à¤\85समरà¥\8dथ: à¤¤à¥\87 à¤¸à¥\81धà¥\8dदा à¤¬à¤¦à¤² à¤\95रनà¥\8dयाà¤\9aि à¤¸à¤\95तात.',
+'ipb_hide_invalid' => 'हà¥\87 à¤\96ात à¤¦à¤¾à¤¬à¤£à¥\8dयासाठà¥\80 à¤\85समरà¥\8dथ; à¤¤à¥\8dयात {{PLURAL:$1|à¤\8fà¤\95 à¤¸à¤\82पादन à¤\86हà¥\87|$1 à¤¸à¤\82पादनà¥\87 à¤\86हà¥\87त}}.',
 'ipb_already_blocked' => '"$1" आधीच अवरूद्ध केलेले आहे.',
 'ipb-needreblock' => '$1 आधीच प्रतिबंधित आहे . तुम्हाला त्याची सेटींग्स बदलण्याची इच्छा आहे का ?',
 'ipb-otherblocks-header' => '{{PLURAL:$1|दुसरे प्रतिबंधन|इतर प्रतिबंधने}}',
@@ -2726,25 +2732,25 @@ $1',
 'ipb_cant_unblock' => 'त्रूटी: प्रतिबंधन क्र.$1 मिळाला नाही. त्यावरील प्रतिबंधन कदाचित आधीच उठवले असेल.',
 'ipb_blocked_as_range' => 'त्रूटी:अंकपत्ता IP $1 हा प्रत्यक्षपणे प्रतिबंधित केलेला नाही आणि अप्रतिबंधीत करता येत नाही.तो,अर्थात,$2पल्ल्याचा भाग म्हाणून तो प्रतिबंधित केलेला आहे,जो की अप्रतिबंधीत करता येत नाही.',
 'ip_range_invalid' => 'अंकपत्ता अयोग्य टप्प्यात.',
-'ip_range_toolarge' => '/$1 पेक्षा मोठ्या Range प्रतिबंधनाची परवानगी नाह् are not allowed.',
-'proxyblocker' => 'प्रातिनिधी(प्रॉक्झी)प्रतिबंधक',
-'proxyblockreason' => 'तुमचा अंकपत्ता प्रतिबंधित केला आहे कारण तो उघड-उघड प्रतिनिधी आहे.कृपया तुमच्या आंतरजाल सेवा दात्यास किंवा तंत्रज्ञास पाचारण संपर्क करा आणि त्यांचे या गंभीर सुरक्षाप्रश्ना कडे लक्ष वेधा.',
+'ip_range_toolarge' => '/$1 पेक्षा मोठ्या रेंज प्रतिबंधनाची परवानगी नाही.',
+'proxyblocker' => 'प्रातिनिधी(प्रॉक्झी)प्रतिबंधक',
+'proxyblockreason' => 'तुमचा अंकपत्ता प्रतिबंधित केला आहे कारण तो उघड-उघड प्रतिनिधी आहे.कृपया तुमच्या आंतरजाल सेवा दात्यास किंवा तंत्रज्ञास पाचारण संपर्क करा आणि त्यांचे या गंभीर सुरक्षाप्रश्नाकडे लक्ष वेधा.',
 'sorbsreason' => '{{SITENAME}}ने वापरलेल्या DNSBL मध्ये तुमच्या अंकपत्त्याची नोंद उघड-उघड प्रतिनिधी म्हणून सूचित केली आहे.',
 'sorbs_create_account_reason' => '{{SITENAME}}च्या DNSBLने तुमचा अंकपत्ता उघड-उघड प्रतिनिधी म्हणून सूचित केला आहे.तुम्ही खाते उघडू शकत नाही',
 'xffblockreason' => '(X-Forwarded-For header) मधील अंकपत्ता,आपला किंवा आपण वापरत असलेल्या सर्व्हरचा,प्रतिबंधित केल्या गेला आहे.प्रतिबंधित करण्याचे मुळ कारण होते:$1',
-'cant-see-hidden-user' => 'तà¥\81मà¥\8dहà¥\80 à¤ªà¥\8dरतिबà¥\8dà¤\82धकरण्याचा प्रयत्न करत असलेले सदस्य खाते आधीपासूनच प्रतिबंधित आणि लपविले गेले आहे.
-तुमच्याकडे सदस्य लपविण्याचे अधिकार नसल्यामुळे , तुम्ही सदस्य प्रतिबंधन  पाहू अथवा संपादित करू शकत नाही',
+'cant-see-hidden-user' => 'तà¥\81मà¥\8dहà¥\80 à¤ªà¥\8dरतिबà¤\82ध करण्याचा प्रयत्न करत असलेले सदस्य खाते आधीपासूनच प्रतिबंधित आणि लपविले गेले आहे.
+तुमच्याकडे सदस्य लपविण्याचे अधिकार नसल्यामुळे , तुम्ही सदस्य प्रतिबंधन  पाहू अथवा संपादित करू शकत नाही.',
 'ipbblocked' => 'तुमचे स्वत:चेच खाते प्रतिबंधित असल्यामुळे तुम्ही इतर सदस्यांना प्रतिबंधित किंवा अप्रतिबंधीत करू शकत नाही',
-'ipbnounblockself' => 'तुम्ही स्वतः अप्रतिबंधित करू शकत नाही',
+'ipbnounblockself' => 'तुम्ही स्वतः अप्रतिबंधित करू शकत नाही',
 
 # Developer tools
 'lockdb' => 'विदागारास ताळे ठोका',
 'unlockdb' => 'विदागाराचे ताळे उघडा',
 'lockdbtext' => 'विदागारास ताळे ठोकल्याने सर्व सदस्यांची संपादन क्षमता, त्यांच्या सदस्य पसंती बदलणे,त्यांच्या पहाऱ्याच्या सूची संपादित करणे,आणि विदेत बदल घडवणाऱ्या इतर गोष्टी संस्थगित होतील.
-à¤\95à¥\83पया à¤¤à¥\81मà¥\8dहाला à¤¹à¥\87à¤\9a à¤\95रावयाà¤\9aà¥\87 à¤\86हà¥\87 à¤\86णि à¤­à¤°à¤£-पà¥\8bषणा à¤¨à¤\82तर विदागाराचे ताळे उघडावयाचे आहे हे निश्चित करा.',
+à¤\95à¥\83पया à¤¤à¥\81मà¥\8dहाला à¤¹à¥\87à¤\9a à¤\95रावयाà¤\9aà¥\87 à¤\86हà¥\87 à¤\86णि à¤\85नà¥\81रà¤\95à¥\8dषणानà¤\82तर (मà¥\87à¤\82à¤\9fà¥\87ननà¥\8dस)विदागाराचे ताळे उघडावयाचे आहे हे निश्चित करा.',
 'unlockdbtext' => 'विदागाराचे ताळे उघडल्याने सर्व सदस्यांची संपादन क्षमता, त्यांच्या सदस्य पसंती बदलणे,त्यांच्या पहाऱ्याच्या सूची संपादित करणे,आणि विदेत बदल घडवणाऱ्या इतर गोष्टीची क्षमता पुन्हा उपलब्ध होईल.
 कृपया तुम्हाला हेच करावयाचे आहे हे निश्चित करा.',
-'lockconfirm' => 'होय,मला खरेच विदागारास ताळे ठोकायच आहे.',
+'lockconfirm' => 'होय,मला खरेच विदागारास ताळे ठोकायच आहे.',
 'unlockconfirm' => 'होय,मला खरेच विदागाराचे ताळे उघडवयाचे आहे.',
 'lockbtn' => 'विदागारास ताळे ठोका',
 'unlockbtn' => 'विदागारचे ताळे काढा',
@@ -2752,7 +2758,7 @@ $1',
 'lockdbsuccesssub' => 'विदागरास ताळे यशस्वी',
 'unlockdbsuccesssub' => 'विदागाराचे ताळे काढले',
 'lockdbsuccesstext' => 'विदागारास ताळे ठोकण्यात आले आहे.<br />
-तà¥\81मà¤\9aà¥\8dयाà¤\95डà¥\82न à¤­à¤°à¤£-पà¥\8bषण à¤ªà¥\82रà¥\8dण à¤\9dालà¥\8dया नंतर [[Special:UnlockDB|ताळे उघडण्याचे]] लक्षात ठेवा.',
+तà¥\81मà¤\9aà¥\8dयाà¤\95डà¥\82न à¤\85नà¥\81रà¤\95à¥\8dषण à¤ªà¥\82रà¥\8dण à¤\9dालà¥\8dयानंतर [[Special:UnlockDB|ताळे उघडण्याचे]] लक्षात ठेवा.',
 'unlockdbsuccesstext' => 'विदागाराचे ताळे उघडण्यात आले आहे.',
 'lockfilenotwritable' => 'विदा ताळे संचिका लेखनीय नाही.विदेस ताळे लावण्याकरिता किंवा उघडण्याकरिता, ती आंतरजाल विदादात्याकडून लेखनीय असावयास हवी.',
 'databasenotlocked' => 'विदागारास ताळे नही',
@@ -2788,15 +2794,15 @@ $1',
 'movepagetalktext' => "संबंधित चर्चा पृष्ठ याबरोबर स्थानांतरीत होणार नाही '''जर:'''
 * तुम्ही पृष्ठ दुसऱ्या नामविश्वात स्थानांतरीत करत असाल
 * या नावाचे चर्चा पान अगोदरच अस्तित्वात असेल तर, किंवा
-* à¤\96ालà¥\80ल à¤\9aà¥\87à¤\95बà¥\89à¤\95à¥\8dस à¤¤à¥\81मà¥\8dहà¥\80 à¤\95ाढà¥\82न à¤\9fाà¤\95ला तर.
+* à¤\96ालà¥\80ल à¤\9aà¥\8cà¤\95à¤\9fपà¥\87à¤\9fà¥\80 (à¤\9aà¥\87à¤\95बà¥\89à¤\95à¥\8dस) à¤°à¤¿à¤\95ामà¥\80 à¤ à¥\87वलà¥\80 तर.
 
 या बाबतीत तुम्हाला स्वतःला ही पाने एकत्र करावी लागतील.",
 'movearticle' => 'पृष्ठाचे स्थानांतरण',
-'moveuserpage-warning' => "'''सावधान:''' आपण एक सदस्य पान स्थलांतरित करत आहात. कृपया लक्षात घ्या की, फक्त हे पान स्थलांतरित होइल, सदस्य नाम बदलले जणार नाही.",
-'movenologintext' => 'पान à¤¸à¥\8dथानाà¤\82तरित à¤\95रणà¥\8dयासाठà¥\80 à¤¤à¥\81मà¥\8dहाला [[Special:UserLogin|प्रवेश]] करावा लागेल.',
-'movenotallowed' => '{{SITENAME}}वरà¥\80ल à¤ªà¤¾à¤¨à¥\87 à¤¸à¥\8dथानाà¤\82तरà¥\80त à¤\95रणà¥\8dयाà¤\9aà¥\80 à¤\86पलà¥\8dयापाशà¥\80 परवानगी नाही.',
-'movenotallowedfile' => 'तà¥\81मà¥\8dहाला à¤¦à¤¸à¥\8dतावà¥\88à¤\9c स्थानांतरीत करण्याची परवानगी नाही.',
-'cant-move-user-page' => 'तà¥\81मà¥\8dहाला à¤¸à¤¦à¤¸à¥\8dयाà¤\9aà¥\87 à¤¦à¤¸à¥\8dतावà¥\88à¤\9c à¤¸à¥\8dथानाà¤\82तरà¥\80त à¤\95रणà¥\8dयाà¤\9aà¥\80 à¤ªà¤°à¤µà¤¾à¤¨à¤\97à¥\80 à¤¨à¤¾à¤¹à¥\80.',
+'moveuserpage-warning' => "'''सावधान:''' à¤\86पण à¤\8fà¤\95 à¤¸à¤¦à¤¸à¥\8dय à¤ªà¤¾à¤¨ à¤¸à¥\8dथलाà¤\82तरित à¤\95रत à¤\86हात. à¤\95à¥\83पया à¤²à¤\95à¥\8dषात à¤\98à¥\8dया à¤\95à¥\80, à¤«à¤\95à¥\8dत à¤¹à¥\87 à¤ªà¤¾à¤¨ à¤¸à¥\8dथलाà¤\82तरित à¤¹à¥\8bà¤\87ल, à¤¸à¤¦à¤¸à¥\8dय à¤¨à¤¾à¤® à¤¬à¤¦à¤²à¤²à¥\87 à¤\9cाणार à¤¨à¤¾à¤¹à¥\80.",
+'movenologintext' => 'पान à¤¸à¥\8dथानाà¤\82तरित à¤\95रणà¥\8dयासाठà¥\80 à¤¤à¥\81मà¥\8dहà¥\80 à¤¨à¥\8bà¤\82दà¥\80à¤\95à¥\83त à¤¸à¤¦à¤¸à¥\8dय à¤¹à¤µà¥\87 à¤µ à¤¤à¥\81मà¥\8dहाला [[Special:UserLogin|सनà¥\8bà¤\82द-प्रवेश]] करावा लागेल.',
+'movenotallowed' => '{{SITENAME}}वरà¥\80ल à¤ªà¤¾à¤¨à¥\87 à¤¸à¥\8dथानाà¤\82तरà¥\80त à¤\95रणà¥\8dयाà¤\9aà¥\80 à¤\86पलà¥\8dयास परवानगी नाही.',
+'movenotallowedfile' => 'तà¥\81मà¥\8dहाला à¤¸à¤\82à¤\9aिà¤\95ा स्थानांतरीत करण्याची परवानगी नाही.',
+'cant-move-user-page' => 'तà¥\81मà¥\8dहाला à¤¸à¤¦à¤¸à¥\8dयपान à¤¸à¥\8dथानाà¤\82तरà¥\80त à¤\95रणà¥\8dयाà¤\9aà¥\80 à¤ªà¤°à¤µà¤¾à¤¨à¤\97à¥\80 à¤¨à¤¾à¤¹à¥\80.(à¤\89पपानावà¥\8dयतिरिà¤\95à¥\8dत)',
 'cant-move-to-user-page' => 'तुम्हाला एखाद्या पानास सदस्य पानांवर (सदस्य उप-पाने सोडून) घेऊन जाण्यास परवानगी नाही.',
 'newtitle' => 'नवीन शीर्षकाकडे:',
 'move-watch' => 'स्रोत पान व लक्ष  पानांवर निगराणी ठेवा',
@@ -2804,12 +2810,12 @@ $1',
 'pagemovedsub' => 'स्थानांतरण यशस्वी',
 'movepage-moved' => '\'\'\'"$1" ला "$2" मथळ्याखाली स्थानांतरीत केले\'\'\'',
 'movepage-moved-redirect' => 'एक पुनर्निर्देशन तयार केले आहे.',
-'movepage-moved-noredirect' => 'पà¥\81नà¤\83निरà¥\8dदà¥\87शà¥\80त à¤ªà¤¾à¤¨ à¤¤à¤¯à¤¾à¤° à¤\95à¥\87लà¥\87लà¥\87 à¤¨à¤¾à¤¹à¥\80',
-'articleexists' => 'त्या नावाचे पृष्ठ अगोदरच अस्तित्वात आहे, किंवा तुम्ही निवडलेले
-नाव योग्य नाही आहे.
+'movepage-moved-noredirect' => 'पà¥\81नरà¥\8dनिरà¥\8dदà¥\87शन à¤¤à¤¯à¤¾à¤° à¤\95रणà¥\87 à¤¦à¤¡à¤ªà¤£à¥\8dयात à¤\86लà¥\87 à¤\86हà¥\87.',
+'articleexists' => 'त्या नावाचे पृष्ठ अगोदरच अस्तित्वात आहे, किंवा तुम्ही निवडलेले नाव योग्य नाही.
+
 कृपया दुसरे नाव शोधा.',
 'cantmove-titleprotected' => 'नवे शीर्षक निर्मित करण्या पासून सुरक्षित केलेले असल्यामुळे,तुम्ही या जागी एखादे पान स्थानांतरीत करू शकत नाही.',
-'movetalk' => 'शà¤\95à¥\8dय à¤\85सलà¥\8dयास "à¤\9aरà¥\8dà¤\9aा à¤ªà¥\83षà¥\8dठ" स्थानांतरीत करा',
+'movetalk' => 'सà¤\82लà¤\97à¥\8dन "à¤\9aरà¥\8dà¤\9aा à¤ªà¤¾à¤¨" स्थानांतरीत करा',
 'move-subpages' => 'उपपाने स्थानांतरीत करा (जास्तीतजास्त $1)',
 'move-talk-subpages' => 'चर्चा पानाची सर्व उपपाने स्थानांतरीत करा (जास्तीतजास्त $1)',
 'movepage-page-exists' => '$1 पान अगोदरच अस्तित्त्वात आहे व त्याच्यावर आपोआप पुनर्लेखन करता येणार नाही.',
@@ -2824,15 +2830,15 @@ $1',
 'movereason' => 'कारण:',
 'revertmove' => 'पूर्वपदास न्या',
 'delete_and_move' => 'वगळा आणि स्थानांतरित करा',
-'delete_and_move_text' => '==वगळण्याची आवशकता==
+'delete_and_move_text' => '==वà¤\97ळणà¥\8dयाà¤\9aà¥\80 à¤\86वशà¥\8dयà¤\95ता==
 
-लक्ष्यपान  "[[:$1]]" आधीच अस्तित्वात आहे.स्थानांतराचा मार्ग मोकळाकरण्या करिता तुम्हाला ते वगळावयाचे आहे काय?',
+लक्ष्यपान  "[[:$1]]" आधीच अस्तित्वात आहे.स्थानांतराचा मार्ग मोकळा करण्याकरिता तुम्हाला ते वगळावयाचे आहे काय?',
 'delete_and_move_confirm' => 'होय, पान वगळा',
 'delete_and_move_reason' => '"[[$1]]" पासून वगळून स्थानांतर केले.',
 'selfmove' => 'स्रोत आणि लक्ष्य पाने समान आहेत; एखादे पान स्वत:च्याच जागी स्थानांतरीत करता येत नाही.',
 'immobile-source-namespace' => 'नामविश्व "$1" मधील पाने हलवता आली नाहीत.',
 'immobile-target-namespace' => 'नामविश्व "$1" मध्ये पाने हलवता आली नाहीत.',
-'immobile-target-namespace-iw' => 'पà¥\81ढà¥\87 à¤\9aाल à¤\95रणà¥\8dयासाठà¥\80 à¤¹à¤¾ à¤µà¤¿à¤\95िà¤\85à¤\82तरà¥\8dà¤\97त à¤¦à¥\81वा à¤¯à¥\8bà¤\97à¥\8dय à¤²à¤\95à¥\8dष à¤¨à¤¾à¤¹à¥\80',
+'immobile-target-namespace-iw' => 'पान à¤¸à¥\8dथानाà¤\82तरासाठà¥\80, à¤¹à¤¾ à¤µà¤¿à¤\95िà¤\9aा à¤\85à¤\82तरà¥\8dà¤\97त à¤¦à¥\81वा à¤¯à¥\8bà¤\97à¥\8dय à¤²à¤\95à¥\8dषà¥\8dय à¤¨à¤¾à¤¹à¥\80.',
 'immobile-source-page' => 'हे पान हलवता येत नाही',
 'immobile-target-page' => 'लक्ष्य मथळा हलवता येत नाही.',
 'bad-target-model' => 'तुमचे ईच्छित स्थानक हे वेगळे आशय नमुना (कंटेंट मॉडेल) वापरते.  $1 चे $2 मध्ये रुपांतर करु शकत नाही.',
@@ -3487,8 +3493,7 @@ $1',
 'exif-lightsource-255' => 'इतर प्रकाश स्रोत',
 
 # Flash modes
-'exif-flash-fired-0' => 'Flash did not fire
-फ्लॅशदिवा प्रज्ज्वलित झाला नाही',
+'exif-flash-fired-0' => 'फ्लॅशदिवा प्रज्ज्वलित झाला नाही',
 'exif-flash-fired-1' => 'क्षणदीप(फ्लेशदिवा)प्रज्ज्वलित झाला',
 'exif-flash-return-0' => 'लखलखाट (फ्लॅश) - प्रकाश परावर्तन नोंदणीची सुविधा अनुपलब्ध',
 'exif-flash-return-2' => 'लखलखाटाच्या (फ्लॅश)   परावर्तन प्रकाशाची नोंद झाली नाही',
@@ -3511,19 +3516,19 @@ $1',
 
 'exif-filesource-3' => 'स्थिरचित्र  अंकीय छाउ (डिजीटल स्टील कॅमेरा)',
 
-'exif-scenetype-1' => 'डायरà¥\87à¤\95à¥\8dà¤\9fलà¥\80 छायाचित्रीत चित्र',
+'exif-scenetype-1' => 'थà¥\87à¤\9f छायाचित्रीत चित्र',
 
 'exif-customrendered-0' => 'नियमीत प्रक्रीया',
-'exif-customrendered-1' => 'à¤\86वडà¥\80नà¥\81सार प्रक्रीया',
+'exif-customrendered-1' => 'पारà¤\82पारिà¤\95 प्रक्रीया',
 
-'exif-exposuremode-0' => 'सà¥\8dवयà¤\82à¤\9aलित à¤\9bायाà¤\82à¤\95न',
+'exif-exposuremode-0' => 'सà¥\8dवयà¤\82à¤\9aलित à¤\85नावरण',
 'exif-exposuremode-1' => 'अस्वयंचलित छायांकन',
 'exif-exposuremode-2' => 'स्वयंसिद्ध कंस',
 
 'exif-whitebalance-0' => 'ऍटो व्हाईट बॅलेन्स',
 'exif-whitebalance-1' => 'मॅन्यूअल व्हाईट बॅलेन्स',
 
-'exif-scenecapturetype-0' => 'दरà¥\8dà¤\9cा',
+'exif-scenecapturetype-0' => 'दरà¥\8dà¤\9cà¥\87दार',
 'exif-scenecapturetype-1' => 'आडवे',
 'exif-scenecapturetype-2' => 'उभे',
 'exif-scenecapturetype-3' => 'रात्रीचे दृश्य',
@@ -3539,8 +3544,8 @@ $1',
 'exif-contrast-2' => 'कठीण',
 
 'exif-saturation-0' => 'सर्व साधारण',
-'exif-saturation-1' => 'à¤\95मà¥\80 à¤¸à¥\85à¤\9aà¥\82रà¥\87शन',
-'exif-saturation-2' => 'à¤\9cासà¥\8dत à¤¸à¥\85à¤\9aà¥\82रà¥\87शन',
+'exif-saturation-1' => 'निमà¥\8dन à¤¸à¤\82तà¥\83पà¥\8dति',
+'exif-saturation-2' => 'à¤\89à¤\9aà¥\8dà¤\9a à¤¸à¤\82तà¥\83पà¥\8dति',
 
 'exif-sharpness-0' => 'सर्वसाधारण',
 'exif-sharpness-1' => 'मृदू',
@@ -3560,7 +3565,7 @@ $1',
 'exif-gpslongitude-w' => 'पश्चिम रेखांश',
 
 # Pseudotags used for GPSAltitudeRef
-'exif-gpsaltitude-above-sealevel' => 'समुद्रपातळीच्यावर $1 {{PLURAL:$1|मीटर|मीटर}}',
+'exif-gpsaltitude-above-sealevel' => 'समुद्रपातळीच्यावर $1 {{PLURAL:$1|मीटर}}',
 'exif-gpsaltitude-below-sealevel' => 'समुद्रपातळीच्याखाली $1 {{PLURAL:$1|मीटर|मीटर}}',
 
 'exif-gpsstatus-a' => 'मोजणी काम चालू आहे',
@@ -3713,7 +3718,7 @@ $5
 # action=watch/unwatch
 'confirm-watch-button' => 'ठीक आहे',
 'confirm-watch-top' => 'हे पान तुमच्या पहारा सूचीमध्ये टाकायचे?',
-'confirm-unwatch-button' => 'ठà¥\80à¤\95',
+'confirm-unwatch-button' => 'ठिà¤\95 à¤\86हà¥\87',
 'confirm-unwatch-top' => 'हे पान तुमच्या नित्य पहाण्याच्या सूचीतून काढायचे?',
 
 # Multipage image navigation
@@ -3722,6 +3727,10 @@ $5
 'imgmultigo' => 'चला!',
 'imgmultigoto' => '$1 पानावर जा',
 
+# Language selector for translatable SVGs
+'img-lang-default' => '(अविचल भाषा)',
+'img-lang-go' => 'जा',
+
 # Table pager
 'ascending_abbrev' => 'चढ',
 'descending_abbrev' => 'उतर',
@@ -3802,8 +3811,16 @@ $5
 'version-parser-function-hooks' => 'पृथकक कार्य अंकुश',
 'version-hook-name' => 'अंकुश नाव',
 'version-hook-subscribedby' => 'वर्गणीदार',
-'version-version' => '(आवृत्ती $1)',
+'version-version' => '($1)',
 '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' => '$1 साठी परवाना',
+'version-license-not-found' => 'या विस्तारकासाठी विस्तृत परवाना माहिती सापडली नाही.',
 'version-poweredby-credits' => "हा विकी '''[https://www.mediawiki.org/ मीडियाविकी]'''द्वारे संचालित आहे, प्रताधिकारित © २००१-$1 $2.",
 'version-poweredby-others' => 'इतर',
 'version-poweredby-translators' => 'ट्रांसलेटविकि.नेट वरील भाषांतरकार',
@@ -3823,11 +3840,13 @@ $5
 # Special:Redirect
 'redirect' => 'संचिका,सदस्य किंवा आवृत्ती या ओळखणीनुसार पुनर्निर्देशन',
 'redirect-legend' => 'संचिका अथवा पानास पुनर्निर्देशन',
-'redirect-summary' => 'हे विशेष पान एक संचिकेस पुनर्निर्देशित करते(दिलेले संचिकानाम),एक पान(दिलेली आवृत्ती ओळ्खण) किंवा एक सदस्यपान(दिलेला सदस्य अंक).',
+'redirect-summary' => 'हे विशेष पान एक संचिकेस पुनर्निर्देशित करते(दिलेले संचिकानाम),एक पान(दिलेली आवृत्ती किंवा पान ओळखण) किंवा एक सदस्यपान(दिलेला सदस्य अंक).
+वापर:[[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], किंवा [[{{#Special:Redirect}}/user/101]].',
 'redirect-submit' => 'जा',
 'redirect-lookup' => 'बघा:',
 'redirect-value' => 'मुल्य:',
 'redirect-user' => 'सदस्यनाम',
+'redirect-page' => 'पृष्ठ-परिचय',
 'redirect-revision' => 'पानाची आवृत्ती',
 'redirect-file' => 'संचिकानाम',
 'redirect-not-exists' => '(योग्य)मुल्य (व्हॅल्यु) सापडले नाही',
@@ -3847,7 +3866,7 @@ $5
 'specialpages' => 'विशेष पृष्ठे',
 'specialpages-note-top' => 'विवरण',
 'specialpages-note' => '* सर्वसाधारण विशेष पृष्ठे.
-* <strong class="mw-specialpagerestricted">प्रतिबंधित विशेष पृष्ठे.</strong>',
+* <span class="mw-specialpagerestricted">प्रतिबंधित विशेष पृष्ठे.</span>',
 'specialpages-group-maintenance' => 'व्यवस्थापन अहवाल',
 'specialpages-group-other' => 'इतर विशेष पृष्ठे',
 'specialpages-group-login' => 'प्रवेश / नवीन सदस्य नोंदणी',
@@ -4018,6 +4037,7 @@ $5
 'api-error-overwrite' => 'अस्तित्वात असलेल्या संचिकेवर पुनर्लेखन प्रतिबंधित आहे.',
 'api-error-stashfailed' => 'इन्तरिक त्रुटी : विदादाता तात्पुरत्या स्वरूपाच्या संचिका जमा करण्यात अयशस्वी',
 'api-error-publishfailed' => 'अंतर्गत त्रूटी:विदादात्यास, या तात्पुरत्या संचिकेच्या प्रकाशनास अपयश आले.',
+'api-error-stasherror' => 'स्टॅचला ही संचिका अपभारणात त्रूटी आली.',
 'api-error-timeout' => 'अपेक्षित वेळेत विदागार (server)ने प्रतिसाद दिला नाही.',
 'api-error-unclassified' => 'एक अज्ञात चूक उद्भवली.',
 'api-error-unknown-code' => 'अज्ञात त्रुटी: "$1"',
@@ -4046,14 +4066,14 @@ $5
 'limitreport-cputime-value' => '$1 {{PLURAL:$1|सेकंद}}',
 'limitreport-walltime-value' => '$1 {{PLURAL:$1|सेकंद}}',
 'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|बाइट|बाइट्स}}',
+'limitreport-templateargumentsize' => 'साचा विधानाचा आकार',
 'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|बाइट|बाइट्स}}',
 
 # Special:ExpandTemplates
 'expandtemplates' => 'साचे वाढवा',
-'expand_templates_intro' => 'हà¥\87 à¤ªà¤¾à¤¨ à¤\95ाहà¥\80 à¤®à¤\9cà¤\95à¥\82र à¤\98à¥\87à¤\8aन à¤¤à¥\8dयातिल सर्व साचे वाढविते. तसेच हे पान पार्सर फंक्शन्स जसे की
+'expand_templates_intro' => 'हà¥\87 à¤ªà¤¾à¤¨ à¤\95ाहà¥\80 à¤®à¤\9cà¤\95à¥\82र à¤\98à¥\87à¤\8aन à¤\86वरà¥\8dतà¥\80 à¤ªà¤¦à¥\8dधतà¥\80नà¥\87 à¤¤à¥\8dयातà¥\80ल सर्व साचे वाढविते. तसेच हे पान पार्सर फंक्शन्स जसे की
 <nowiki>{{</nowiki>#language:...}}, व बदलणार्‍या किमती (variables) जसे की
-<nowiki>{{</nowiki>CURRENTDAY}}&mdash;म्हणजेच दोन ब्रेसेसमधील सर्व मजकूर वाढविते.
-मीडियाविकिमधून पार्सर स्टेज मागवून हे केले जाते.',
+<nowiki>{{</nowiki>CURRENTDAY}}&mdash;म्हणजेच दोन ब्रेसेसमधील बरेच काही वाढविते.',
 'expand_templates_title' => '{{FULLPAGENAME}} वगैरे करीता, कन्टेक्स्ट शीर्षक:',
 'expand_templates_input' => 'इनपुट मजकूर:',
 'expand_templates_output' => 'निकाल',
@@ -4064,4 +4084,6 @@ $5
 'expand_templates_generate_xml' => 'XML चा पार्स (parse) वृक्ष दाखवा',
 'expand_templates_preview' => 'झलक',
 
+# Unknown messages
+'uploadinvalidxml' => 'अपभारीत संचिकेतील XML पार्स करता आले नाही.',
 );
index b79a9fd..d998720 100644 (file)
@@ -19,6 +19,7 @@
  * @author Kurniasan
  * @author Meno25
  * @author Putera Luqman Tunku Andre
+ * @author SNN95
  * @author Urhixidur
  * @author Yosri
  * @author Zamwan
@@ -198,7 +199,7 @@ $specialPageAliases = array(
 
 $messages = array(
 # User preference toggles
-'tog-underline' => 'Gariskan pautan:',
+'tog-underline' => 'Garis bawah pautan:',
 'tog-justify' => 'Laraskan perenggan',
 'tog-hideminor' => 'Sembunyikan suntingan kecil dalam laman perubahan terkini',
 'tog-hidepatrolled' => 'Sorokkan suntingan yang telah dironda daripada senarai perubahan terkini',
@@ -208,7 +209,6 @@ $messages = array(
 'tog-numberheadings' => 'Nomborkan tajuk secara automatik',
 'tog-showtoolbar' => 'Tunjukkan palang sunting (perlukan JavaScript)',
 'tog-editondblclick' => 'Dwiklik untuk sunting laman (JavaScript)',
-'tog-editsection' => 'Bolehkan penyuntingan bahagian melalui pautan [sunting]',
 'tog-editsectiononrightclick' => 'Bolehkan penyuntingan bahagian dengan mengklik kanan pada tajuk bahagian',
 'tog-showtoc' => 'Tunjukkan isi kandungan (bagi rencana yang melebihi 3 tajuk)',
 'tog-rememberpassword' => 'Ingat log masuk saya di pelayar ini (tidak melebihi $1 {{PLURAL:$1|hari|hari}})',
@@ -1016,6 +1016,8 @@ Log penghapusan bagi laman ini dilampirkan di bawah untuk rujukan.',
 'content-not-allowed-here' => 'Kandungan "$1" tidak dibenarkan di halaman [[$2]]',
 'editwarning-warning' => 'Meninggalkan laman ini mungkin akan menyebabkan sebarang perubahan yang telah anda lakukan hilang.
 Jika anda sudah log masuk, anda boleh melumpuhkan amaran ini di bahagian "Menyunting" dalam keutamaan anda.',
+'editpage-notsupportedcontentformat-title' => 'Format kandungan tidak disokong',
+'editpage-notsupportedcontentformat-text' => 'Format kandungan $1 tidak disokong oleh model kandungan $2.',
 
 # Content models
 'content-model-wikitext' => 'wikiteks',
@@ -1268,6 +1270,7 @@ Butirannya boleh didapati di [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGEN
 'search-result-score' => 'Kaitan: $1%',
 'search-redirect' => '(pelencongan $1)',
 'search-section' => '(bahagian $1)',
+'search-file-match' => '(sepadan dengan kandungan fail)',
 'search-suggest' => 'Maksud anda, $1?',
 'search-interwiki-caption' => 'Projek-projek lain',
 'search-interwiki-default' => 'Keputusan daripada $1:',
@@ -1708,6 +1711,7 @@ Jika anda memiliki imej ini dalam leraian penuh, sila muat naik fail tersebut. J
 'fileexists-shared-forbidden' => 'Sebuah fail dengan nama ini telah pun wujud dalam gedung fail kongsi. Jika anda masih mahu memuat naik fail ini, sila kembali ke borang muat naik dan gunakan nama lain. [[File:$1|thumb|center|$1]]',
 'file-exists-duplicate' => 'Fail ini adalah salinan bagi {{PLURAL:$1|fail|fail-fail}} berikut:',
 'file-deleted-duplicate' => 'Sebuah fail yang serupa dengan fail ini ([[:$1]]) telah pun dihapuskan sebelum ini. Anda seharusnya memeriksa sejarah penghapusan fail itu terlebih dahulu sebelum memuat naiknya sekali lagi.',
+'file-deleted-duplicate-notitle' => 'Satu fail yang seiras dengan fail ini telah dihapuskan dahulu, maka judulnya telah disekat. Anda harus meminta sesiapa yang boleh melihat data fail yang disekat untuk meneliti situasinya sebelum cuba memuat naiknya semula.',
 'uploadwarning' => 'Amaran muat naik',
 'uploadwarning-text' => 'Sila ubah keterangan fail di bawah dan cuba lagi.',
 'savefile' => 'Simpan fail',
@@ -2085,6 +2089,7 @@ Masukan yang <del>dipotong</del> telah diselesaikan.',
 'protectedpages' => 'Laman dilindungi',
 'protectedpages-indef' => 'Perlindungan tanpa had sahaja',
 'protectedpages-cascade' => 'Perlindungan separa sahaja',
+'protectedpages-noredirect' => 'Sorokkan lencongan',
 'protectedpagesempty' => 'Tiada laman yang dilindungi dengan kriteria ini.',
 'protectedtitles' => 'Tajuk dilindungi',
 'protectedtitlesempty' => 'Tiada tajuk yang dilindungi yang sepadan dengan kriteria yang diberikan.',
@@ -2362,7 +2367,7 @@ Sila lihat $2 untuk rekod penghapusan terkini.',
 '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 pada halaman yang hendak anda hapus itu.",
+'deleting-backlinks-warning' => "'''Amaran:''' Terdapat halaman-halaman lain yang berpaut atau bertransklusi dengan halaman yang hendak anda hapus itu.",
 
 # Rollback
 'rollback' => 'Undurkan suntingan.',
@@ -2598,6 +2603,7 @@ dirosakkan).',
 <br />Sila lihat [[Special:BlockList|senarai sekatan]] untuk menyemak sekatan.',
 'ipb-blockingself' => 'Anda akan menyekat diri sendiri! Pastikah anda mahu berbuat demikian?',
 'ipb-confirmhideuser' => 'Anda akan menyekat seorang pengguna yang menghidupkan "sorokkan pengguna". Ini akan menindaskan nama pengguna itu di semua senarai dan entri log. Pastikah anda mahu berbuat demikian?',
+'ipb-confirmaction' => 'Jika anda benar-benar ingin melakukannya, sila tanda ruangan "{{int:ipb-confirm}}" di bawah.',
 'ipb-edit-dropdown' => 'Sunting sebab sekatan',
 'ipb-unblock-addr' => 'Nyahsekat $1',
 'ipb-unblock' => 'Nyahsekat nama pengguna atau alamat IP',
@@ -2660,7 +2666,7 @@ Sila lihat juga [[Special:BlockList|senarai sekatan]] untuk senarai larangan dan
 'range_block_disabled' => 'Kebolehan penyelia untuk membuat sekatan julat dimatikan.',
 'ipb_expiry_invalid' => 'Waktu tamat tidak sah.',
 'ipb_expiry_temp' => 'Sekatan nama pengguna terselindung sepatutnya kekal.',
-'ipb_hide_invalid' => 'Tidak dapat menahan akaun ini; ia mungkin mempunyai terlalu banyak suntingan.',
+'ipb_hide_invalid' => 'Akaun ini tidak dapat disekat kerana mempunyai lebih daripada $1 suntingan.',
 'ipb_already_blocked' => '"$1" sudah disekat',
 'ipb-needreblock' => '$1 telah pun disekat Adakah anda mahu menukar tetapan sekatan pengguna ini?',
 'ipb-otherblocks-header' => '{{PLURAL:$1|Sekatan|Sekatan-sekatan}} lain',
@@ -3777,7 +3783,17 @@ Anda juga boleh [[Special:EditWatchlist|menggunakan penyunting piawai]].',
 'version-hook-name' => 'Nama penyangkuk',
 'version-hook-subscribedby' => 'Dilanggan oleh',
 'version-version' => '(Versi $1)',
-'version-license' => 'Lesen',
+'version-license' => 'Lesen MediaWiki',
+'version-ext-license' => 'Lesen',
+'version-ext-colheader-name' => 'Sambungan',
+'version-ext-colheader-version' => 'Versi',
+'version-ext-colheader-license' => 'Lesen',
+'version-ext-colheader-description' => 'Keterangan',
+'version-ext-colheader-credits' => 'Pengarang',
+'version-license-title' => 'Lesen untuk $1',
+'version-license-not-found' => 'Tidak terdapat maklumat lesen yang terperinci untuk sambungan ini.',
+'version-credits-title' => 'Kredit untuk$1',
+'version-credits-not-found' => 'Tidak terdapat maklumat penghargaan yang terperinci untuk sambungan ini.',
 'version-poweredby-credits' => "Wiki ini dikuasakan oleh '''[https://www.mediawiki.org/ MediaWiki]''', hak cipta © 2001-$1 $2.",
 'version-poweredby-others' => 'penyumbang-penyumbang lain',
 'version-poweredby-translators' => 'para penterjemah translatewiki.net',
@@ -3998,6 +4014,7 @@ Ataupun, anda boleh menggunakan borang yang mudah di bawah. Ulasan anda akan dic
 'api-error-overwrite' => 'Menulis ganti fail yang telah wujud adalah tidak dibenarkan.',
 'api-error-stashfailed' => 'Ralat dalaman: pelayan tidak dapat menyimpan fail sementara.',
 'api-error-publishfailed' => 'Ralat dalaman: Pelayan tidak dapat menerbitkan fail sementara.',
+'api-error-stasherror' => 'Terdapat ralat ketika menyimpan fail yang dimuat naik.',
 'api-error-timeout' => 'Pelayan tidak bergerak balas dalam tempoh yang diharapkan.',
 'api-error-unclassified' => 'Berlakunya ralat yang tidak diketahui',
 'api-error-unknown-code' => 'Ralat tidak diketahui: "$1"',
@@ -4055,4 +4072,6 @@ Sebenarnya, ia mengembangkan segalanya dalam tanda kurung panah berganda.',
 'expand_templates_generate_rawhtml' => 'Paparkan HTML mentah',
 'expand_templates_preview' => 'Pralihat',
 
+# Unknown messages
+'uploadinvalidxml' => 'XML dalam fail yang dimuat naik ini tidak dapat dihuraikan.',
 );
index ad5013c..6c7c709 100644 (file)
@@ -284,7 +284,6 @@ $messages = array(
 'tog-numberheadings' => 'Numerazzjoni awtomatika tat-titli tas-sezzjonijiet',
 'tog-showtoolbar' => 'Uri l-kolonna tal-għodda għall-immodifikar (bżonn tal-JavaScript)',
 'tog-editondblclick' => "Immodifika l-paġni permezz ta' klikk doppju (bżonn tal-JavaScript)",
-'tog-editsection' => 'L-immodifikar tas-sezzjonijiet permezz tal-ħolqa [editja]',
 'tog-editsectiononrightclick' => "L-immodifikar ta' sezzjonijiet bi klikk lemini fuq it-titli tas-sezzjonijiet (bżonn tal-JavaScript)",
 'tog-showtoc' => "Uri l-werrej (għal paġni b'iktar minn 3 sezzjonijiet)",
 'tog-rememberpassword' => "Ftakar il-login tiegħi fuq dan il-browżer (għal massimu ta' {{PLURAL:$1|ġurnata|$1 ġurnata}})",
index 565253f..7ac970f 100644 (file)
@@ -85,9 +85,9 @@ $messages = array(
 'tog-hidepatrolled' => 'Motlàtìs tlapîpialli tlayèktlàlilistli ìpan welok tlapảtlalistli',
 'tog-newpageshidepatrolled' => 'Mokintlàtis tlapîpialtlaìxtlapaltìn ìwikpa ìtlapòpòwaltekpànal in yâyankuik tlaìxtlapaltìn',
 'tog-extendwatchlist' => 'Mìxmảnas in tlapòpòwaltekpàntlachialli ìka mỏtas nochi in tlapảtlalistli, âmò in san okachi yankuik.',
-'tog-usenewrc' => 'Quimolōloāz in tlapatlaliztli yancuīc tlapatlaliztli āmapan īhuān in tlachiyaliztli tlapōhualāmapan (monequi JavaScript)',
+'tog-usenewrc' => 'Molōloāzqueh in tlapatlaliztli in yancuīc tlapatlaliztli āmapan īhuān in tlachiyaliztli tlapōhualāmapan (monequi JavaScript)',
 'tog-showtoolbar' => 'Motlaīxtlatīz in tlachihchīhualōni pāntli',
-'tog-editondblclick' => 'Tiquimpatlāz in zāzaniltin intlā ōme tiquimpachoa',
+'tog-editondblclick' => 'Tiquimpatlāz in zāzanilli intlā ōme tiquimpachoa',
 'tog-showtoc' => 'Tiquittāz in tlein cah zāzotlahcuilōlco',
 'tog-rememberpassword' => 'Ticpiyāz moMotlatequitiltilīltōca īhuān motlahtōlichtacāyo inīn chīuhpōhualhuazco (īxquich {{PLURAL:$1|tōnalli}})',
 'tog-watchcreations' => 'Moaquiāz in āmatl mā niquinyōcoya īhuān in tlahcuilōlli mā niquinquetza īpan notlachiyaliz',
@@ -390,7 +390,7 @@ Hueliz quimpiya tlahtōl tlein ahmo mohuelītih motequitiltia tōcāpan.',
 'createaccount' => 'Ticchīhuāz cē cuentah',
 'gotaccount' => "¿Ye ticpiya cē cuentah? '''$1'''.",
 'gotaccountlink' => 'Ximocalaqui',
-'createaccountmail' => 'Ticnemītīz ahmo cemihcac zāzoichtacātlahtōlli nō in tiquēhualtīz in maltzinteyōtl nonetitlanizyeyān',
+'createaccountmail' => 'Ticnemītīz ahmo cemihcac zāzoichtacātlahtōlli nō in tiquēhualtīz in maltzinteyōtl monetitlanizyeyān',
 'createaccountreason' => 'Tlèka:',
 'badretype' => 'Ahneneuhqui motlahtōlichtacāyo.',
 'userexists' => 'In tlatequitiltilīltōcāitl in ōquipehpen ye ia.
@@ -427,7 +427,7 @@ Occeppa xicalaqui niman ticmatīz.',
 'newpassword' => 'Yancuīc motlahtōlichtacayo:',
 'retypenew' => 'Occeppa xiquihcuiloa yancuīc motlahtōlichtacayo:',
 'resetpass_submit' => 'Xicpatlāz motlahtōlichtacāyo auh xicalaquīz',
-'changepassword-success' => 'In ichtacātlahtōlli cualli ōtlapatlalo',
+'changepassword-success' => 'Mochtacātlahtōl cualli ōtlapatlalo.',
 'resetpass_forbidden' => 'Tlahtōlichtacayōtl ahmo mohuelītih mopatlah',
 'resetpass-submit-loggedin' => 'Ticpatlāz motlahtōlichtacāyo',
 'resetpass-submit-cancel' => 'Ticcuepāz',
@@ -472,9 +472,7 @@ Occeppa xicalaqui niman ticmatīz.',
 'loginreqlink' => 'ximocalaqui',
 'loginreqpagetext' => 'Tihuīquilia $1 ic tiquintta occequīntīn zāzaniltin.',
 'accmailtitle' => 'Tlahtōlichtacāyōtl ōmoihuah.',
-'accmailtext' => "Cē zāzotlahtōlichtacāyōtl ōcyōcox [[User talk:$1|$1]]  moquitītlani īhuīc $2.
-
-In tlahtōlichtacāyōtl īpal inīn yancuīc cuenta hueliti ticpatlalo zāzanilpan ''[[Special:ChangePassword|tlahtōlichtacāyōtl patlaliztli]]'' zatepan ōticalac.",
+'accmailtext' => "Ōquiyōcox zāzochtacātlahtōlli in [[User talk:$1|$1]] auh ōmoquitītlan īhuīc $2. Tihueliti ticpatlaz īpan ''[[Special:ChangePassword|Ticpatlaz in ]]'' in ōticalaco achtopa.",
 'newarticle' => '(Yancuīc)',
 'newarticletext' => 'Ōtictocac cētiliztli cē zāzanilhuīc oc ahmo ia. Intlā quiēlēhuia quichīhua, xitlahcuiloa niman (nō xiquitta [[{{MediaWiki:Helppage}}|tēpalēhuiliztli zāzanilli]] huehca ōmpa tlapatlaliztli). Intlā ahmo, yāuh achtopa zāzanilli.',
 'noarticletext' => 'In āxcān, ahmō onca tlahcuilōlli inīn zāzanilpan.
@@ -505,7 +503,7 @@ Tihuelīti [[Special:Search/{{PAGENAME}}|tictēmoa inīn zāzaniltōcācopa]] oc
 'hiddencategories' => 'Inīn zāzanilli mopiya {{PLURAL:$1|1 neneuhcāyōc ōmotlāti|$1 neneuhcāyōc ōmotlāti}}:',
 'nocreatetext' => 'Inīn huiqui ōquitzacuili tlahuelītiliztli ic tlachīhua yancuīc zāzaniltin. Tichuelīti ticcuepa auh ticpatla cē zāzanilli, [[Special:UserLogin|xicalaqui nozo xicchīhua cē cuentah]].',
 'nocreate-loggedin' => 'Ahmo tihuelīti tiquinchīhua yancuīc zāzaniltin.',
-'permissionserrors' => 'Huelītiliztechcopa ahcuallōtl',
+'permissionserrors' => 'Tēmācāhualiztli aiuhcāyōtl',
 'permissionserrorstext' => 'Ahmo tihuelīti quichīhua inōn, inīn {{PLURAL:$1|īxtlamatilizpampa}}:',
 'permissionserrorstext-withaction' => 'Ahmo tiquihuelīti $2 inīn {{PLURAL:$1|īxtlamatilizpampa}}:',
 'moveddeleted-notice' => 'Inīn zāzanilli ōmopolo.
@@ -539,8 +537,8 @@ Ye ia.',
 'page_last' => 'xōcoyōc',
 'history-fieldset-title' => 'Tictēmōz īpan tlahcuilōlloh',
 'history-show-deleted' => 'Zan tlapolōlli',
-'histfirst' => 'Achto',
-'histlast' => 'Yancuīc',
+'histfirst' => 'in achto',
+'histlast' => 'in tlatzaucticah',
 'historysize' => '({{PLURAL:$1|1 byte|$1 byte}})',
 'historyempty' => '(iztāc)',
 
@@ -557,10 +555,10 @@ Hueliz ōmopolo huiqui nozo ōmozacac.
 'revisiondelete' => 'Tiquimpolōz/ahtiquimpolōz tlachiyaliztli',
 'revdelete-show-file-submit' => 'Quēmah',
 'revdelete-selected' => "'''{{PLURAL:$2|Tlachiyaliztli ōmoēlēhui|Tlachiyaliztli ōmoēlēhuih}} [[:$1]] ītechcopa:'''",
-'revdelete-hide-text' => 'Tictlātīz tlachiyaliztli ītlahcuilōl',
+'revdelete-hide-text' => 'In tlahtlachiyaliztli ītlahcuilōl',
 'revdelete-hide-image' => 'Tictlātīz tlahcuilōlli ītlapiyaliz',
-'revdelete-radio-set' => 'Quēmah',
-'revdelete-radio-unset' => 'Ahmo',
+'revdelete-radio-set' => 'Tlaīnāyalli',
+'revdelete-radio-unset' => 'Ittalōni',
 'revdel-restore' => 'Ticpatlāz tlattaliztli',
 'pagehist' => 'Zāzanilli tlahcuilōlloh',
 'deletedhist' => 'Ōtlapolo tlahcuilōlloh',
@@ -753,7 +751,7 @@ Intlā ticnequi, tlācah quimatīzqueh motequi.',
 'rclistfrom' => 'Xiquinttāz yancuīc tlapatlaliztli īhuīcpa $1',
 'rcshowhideminor' => '$1 tlapatlalitzintli',
 'rcshowhidebots' => '$1 tepoztlācah',
-'rcshowhideliu' => '$1 tlatequitiltilīlli ōmocalacqueh',
+'rcshowhideliu' => '$1 tēmachiyōmacalli tlatequitiltilīltin',
 'rcshowhideanons' => '$1 ahtōcā tlatequitiltilīlli',
 'rcshowhidepatr' => '$1 tlapatlaliztli mochiyahua',
 'rcshowhidemine' => '$1 notlahcuilōl',
@@ -1099,7 +1097,7 @@ Xiquitta $2 ic yancuīc tlapololiztli.',
 'contributions-title' => 'Tlatequitiltilīlli $1 ītlahcuilōl',
 'mycontris' => 'Notlahcuilōl',
 'contribsub2' => '$1 ($2)',
-'uctop' => '(ahco)',
+'uctop' => '(āxcān tlapatlaliztli)',
 'month' => 'Īhuīcpa mētztli (auh achtopa):',
 'year' => 'Xiuhhuīcpa (auh achtopa):',
 
@@ -1437,7 +1435,7 @@ Niman tihuelīti [[Special:UserLogin|timocalaqui]] auh ticpactiāz huiquitica.',
 'version' => 'Machiyōtzin',
 'version-specialpages' => 'Nònkuâkìskàtlaìxtlapaltìn',
 'version-other' => 'Occē',
-'version-version' => '(Machiyōtzin $1)',
+'version-version' => '($1)',
 'version-software-version' => 'Machiyōtzin',
 
 # Special:FileDuplicateSearch
index 71311f1..081ec4d 100644 (file)
@@ -332,6 +332,9 @@ Che mā khó-lêng sī {{SITENAME}} só͘ sú-iōng ê nńg-thé chhut būn-tê.
 # General errors
 'error' => 'Chhò-gō·',
 'databaseerror' => 'Chu-liāu-khò· chhò-gō·',
+'databaseerror-query' => '揣:',
+'databaseerror-function' => '功能:',
+'laggedslavemode' => "'''提醒:'''頁內容可能毋是上新的。",
 'readonly' => 'Chu-liāu-khò· só tiâu leh',
 'enterlockreason' => 'Phah beh hong-só ê lí-iû, pau-koah ko͘-kè siáⁿ-mi̍h sî-chūn ē kái-tû hong-só.',
 'readonlytext' => 'Chu-liāu-khò· hiān-chú-sî só tiâu leh, bô khai-hòng hō· lâng siu-kái. Che tāi-khài sī in-ūi teh pān î-siu khang-khòe, oân-sêng liáu-āu èng-tong tō ē hôe-ho̍k chèng-siông. Hū-chek ê hêng-chèng jîn-oân lâu chit-ê soat-bêng: $1',
@@ -340,6 +343,9 @@ Che mā khó-lêng sī {{SITENAME}} só͘ sú-iōng ê nńg-thé chhut būn-tê.
 Che it-poaⁿ sī in-ūi koè-sî ê cheng-chha ia̍h sī le̍k-sú liân-kiat ê ia̍h í-keng hông thâi tiàu.
 
 Nā m̄-sī hit chióng chêng-hêng, lí khó-lêng tú tio̍h nńg-thé ê chhò-ngō͘. Chhiáⁿ pò hō͘ chi̍t ūi [[Special:ListUsers/sysop|koán-lí-goân]], ūi liân-kiat hiâ khì lâu thong-ti .',
+'missingarticle-rev' => '(修訂版本#:$1)',
+'missingarticle-diff' => '(精差:$1,$2)',
+'readonly_lag' => '佇附屬的資料庫更新到主要資料庫資料的時陣,資料庫會自動鎖定。',
 'internalerror' => 'Loē-pō͘ ê chhò-ngō͘',
 'internalerror_info' => 'Loē-pō͘ ê chhò-ngō͘: $1',
 'fileappenderrorread' => 'Ka-ji̍p(append) ê sî bô-hoat-tō͘ thak "$1".',
@@ -353,7 +359,8 @@ Nā m̄-sī hit chióng chêng-hêng, lí khó-lêng tú tio̍h nńg-thé ê chh
 'unexpected' => 'Koài-koài ê pió-tat: "$1"="$2"。',
 'formerror' => 'Chhò-gō·: bô-hoat-tō· kā pió sàng chhut khì.',
 'badarticleerror' => 'Bē-tàng tiàm chit ia̍h chip-hêng chit ê tōng-chok.',
-'cannotdelete' => 'Bô-hoat-tō· kā hit ê ia̍h a̍h-sī iáⁿ-siōng thâi tiāu. (Khó-lêng pa̍t-lâng í-keng kā thâi tiāu ah.)',
+'cannotdelete' => 'Bô-hoat-tō· kā hit ê ia̍h a̍h-sī iáⁿ-siōng 「$1」 thâi tiāu. (Khó-lêng pa̍t-lâng í-keng kā thâi tiāu ah.)',
+'cannotdelete-title' => '無法度共"$1"這頁刣掉。',
 'badtitle' => 'M̄-chiâⁿ piau-tê',
 'badtitletext' => 'Iau-kiû ê piau-tê sī bô-hāu ê, khang ê, a̍h-sī liân-kiat chhò-gō· ê inter-language/inter-wiki piau-tê.',
 'perfcached' => 'Ē-kha ê chu-liāu tùi lâi--ê, só·-í bī-pit oân-choân hoán-èng siōng sin ê chōng-hóng. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
@@ -607,7 +614,6 @@ Lí ê kái-piàn tī ē-kha ê bûn-jī-keh. Lí su-iàu chiōng lí chò ê k
 'rows' => 'Chōa:',
 'columns' => 'Nôa',
 'searchresultshead' => 'Chhiau-chhōe kiat-kó ê siat-tēng',
-'resultsperpage' => '1 ia̍h hián-sī kúi kiāⁿ:',
 'recentchangesdays' => 'Hián-sī kúi ji̍t chòe-kīn ê kái-piàn:',
 'recentchangesdays-max' => 'siōng-choē $1 {{PLURAL:$1|kang|kang}}',
 'recentchangescount' => 'Hián-sī kúi tiâu chòe-kīn ê kái-piàn:',
index d2c3da0..dc3b40a 100644 (file)
@@ -329,7 +329,6 @@ $messages = array(
 'tog-numberheadings' => 'Autonummerer overskrifter',
 'tog-showtoolbar' => 'Vis verktøylinje',
 'tog-editondblclick' => 'Rediger sider ved å dobbeltklikke',
-'tog-editsection' => 'Rediger avsnitt ved hjelp av [rediger]-lenke',
 'tog-editsectiononrightclick' => 'Rediger avsnitt ved å høyreklikke på avsnittsoverskrift',
 'tog-showtoc' => 'Vis innholdsfortegnelse (for sider med flere enn tre avsnitt)',
 'tog-rememberpassword' => 'Husk meg i denne nettleseren (i høyst $1 {{PLURAL:$1|dag|dager}})',
@@ -852,8 +851,8 @@ Skriv inn en fungerende e-postadresse eller tøm feltet.',
 
 Du kan ignorere denne beskjeden dersom kontoen ble opprettet ved en feil.',
 'usernamehasherror' => 'Brukernavn kan ikke inneholde nummertegn.',
-'login-throttled' => 'Du har nylig prøvd for mange ganger å logge inn.
-Vær vennlig å vente $1 før du prøver igjen.',
+'login-throttled' => 'Du har prøvd å logge inn for mange ganger.
+Vent $1 før du prøver på nytt.',
 'login-abort-generic' => 'Innleggingen ble avbrutt.',
 'loginlanguagelabel' => 'Språk: $1',
 'suspicious-userlogout' => 'Din forespørsel om å logge ut ble nektet fordi den så ut til å ha bli sendt av en ødelagt nettleser eller en mellomtjener.',
@@ -1152,6 +1151,8 @@ Slette- og flytteloggen vises nedenfor.',
 'invalid-content-data' => 'Ugyldig innhold',
 'content-not-allowed-here' => 'Innholdsmodellen «$1» er ikke tillatt på siden [[$2]]',
 'editwarning-warning' => 'Ved å forlate siden kan du miste alle endringer du har utført. Om du er logget inn kan du slå av denne advarselen under «Redigering»-seksjonen i innstillingene.',
+'editpage-notsupportedcontentformat-title' => 'Innholdsformatet er ikke støttet',
+'editpage-notsupportedcontentformat-text' => 'Innholdsformatet $1 er ikke støttet av innholdsmodellen $2.',
 
 # Content models
 'content-model-wikitext' => 'WikiTekst',
@@ -1400,6 +1401,7 @@ Detaljer kan finnes i [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}
 'search-result-score' => 'Relevans: $1&nbsp;%',
 'search-redirect' => '(omdirigering $1)',
 'search-section' => '(avsnitt $1)',
+'search-file-match' => '(matcher filinnhold)',
 'search-suggest' => 'Mente du: $1',
 'search-interwiki-caption' => 'Søsterprosjekter',
 'search-interwiki-default' => '$1-resultater:',
@@ -1726,6 +1728,7 @@ Informasjonen vil være offentlig.',
 'recentchanges-label-plusminus' => 'Sidestørrelsen kan endres med dette antallet bytes',
 'recentchanges-legend-heading' => "'''Tegnforklaring:'''",
 'recentchanges-legend-newpage' => '(se også [[Special:NewPages|liste av nye sider]])',
+'recentchanges-legend-plusminus' => '«(±123)»',
 'rcnotefrom' => "Nedenfor er endringene siden '''$2''' (opp til '''$1''' vises).",
 'rclistfrom' => 'Vis nye endringer med start fra $1',
 'rcshowhideminor' => '$1 mindre endringer',
@@ -2497,7 +2500,7 @@ Se $2 for en oversikt over de siste slettingene.',
 'delete-edit-reasonlist' => 'Rediger begrunnelser for sletting',
 'delete-toobig' => 'Denne siden har en stor redigeringshistorikk, med over {{PLURAL:$1|$1&nbsp;revisjon|$1&nbsp;revisjoner}}. Muligheten til å slette slike sider er begrenset for å unngå utilsiktet forstyrring av {{SITENAME}}.',
 'delete-warning-toobig' => 'Denne siden har en stor redigeringshistorikk, med over {{PLURAL:$1|$1&nbsp;revisjon|$1&nbsp;revisjoner}}. Sletting av denne siden kan forstyrre databasen til {{SITENAME}}; vær varsom.',
-'deleting-backlinks-warning' => "'''Advarsel:''' Andre sider har lenker til den siden du skal til å slette.",
+'deleting-backlinks-warning' => "'''Advarsel:''' Andre sider linker til eller inkluderer siden du er i ferd med å slette.",
 
 # Rollback
 'rollback' => 'Fjern redigeringer',
@@ -2788,7 +2791,7 @@ Skjulingsloggen vises nedenfor.',
 'range_block_disabled' => 'Muligheten til å blokkere flere IP-adresser om gangen er slått av.',
 'ipb_expiry_invalid' => 'Ugyldig utløpstid.',
 'ipb_expiry_temp' => 'For å skjule brukernavnet må blokkeringen være permanent.',
-'ipb_hide_invalid' => 'Kan ikke skjule denne kontoen. Den kan ha for mange redigeringer.',
+'ipb_hide_invalid' => 'Denne kontoen kan ikke skjules; den har mer enn {{PLURAL:$1|én redigering|$1 redigeringer}}.',
 'ipb_already_blocked' => '«$1» er allerede blokkert',
 'ipb-needreblock' => '$1 er blokkert fra før. Vil du endre innstillingene?',
 'ipb-otherblocks-header' => '{{PLURAL:$1|Annen blokkering|Andre blokkeringer}}',
@@ -3799,6 +3802,9 @@ Denne bekreftelseskoden utløper $4.',
 'confirm-unwatch-button' => 'OK',
 'confirm-unwatch-top' => 'Fjern denne siden fra overvåkningslisten din?',
 
+# Separators for various lists, etc.
+'quotation-marks' => '«$1»',
+
 # Multipage image navigation
 'imgmultipageprev' => '← forrige side',
 'imgmultipagenext' => 'neste side &rarr;',
@@ -4207,4 +4213,6 @@ Faktisk utvider den det meste innkapslet i doble krøllparenteser.',
 'expand_templates_generate_rawhtml' => 'Vis ubehandlet HTML',
 'expand_templates_preview' => 'Forhåndsvisning',
 
+# Unknown messages
+'uploadinvalidxml' => 'XML-en i den opplastede filen kunne ikke tolkes.',
 );
index cc1db15..4ff9d80 100644 (file)
@@ -225,7 +225,6 @@ $messages = array(
 'tog-numberheadings' => 'Överschrieven automatsch nummereern',
 'tog-showtoolbar' => 'Editeer-Warktüüchlist wiesen',
 'tog-editondblclick' => 'Sieden mit Dubbelklick ännern (JavaScript)',
-'tog-editsection' => 'Links för dat Ännern vun en Afsatz wiesen',
 'tog-editsectiononrightclick' => 'En Afsatz mit en Rechtsklick ännern (Javascript)',
 'tog-showtoc' => "Wiesen vun'n Inholtsverteken bi Sieten mit mehr as dree Överschriften",
 'tog-rememberpassword' => 'Duersam inloggen (för maximaal $1 {{PLURAL:$1|Dag|Daag}})',
index 1d1162c..96a5090 100644 (file)
@@ -334,7 +334,6 @@ $messages = array(
 'tog-numberheadings' => 'Koppen vanzelf nummeren',
 'tog-showtoolbar' => 'Laot de warkbalke zien',
 'tog-editondblclick' => 'Mit dubbelklik bewarken',
-'tog-editsection' => 'Mit bewarkgedeelten',
 'tog-editsectiononrightclick' => 'Bewarken van deelziejen meugelik maken mit n rechtermuusklik op n tussenkop',
 'tog-showtoc' => 'Samenvatting laoten zien van de zaken die an bod koemen (mit meer as dree onderwarpen)',
 'tog-rememberpassword' => 'Vanzelf anmelden (hooguut $1 {{PLURAL:$1|dag|dagen}})',
index 257a8e7..fb78ae6 100644 (file)
@@ -13,6 +13,7 @@
  * @author Ganesh Paudel
  * @author Indiver
  * @author Kaganer
+ * @author Krish Dulal
  * @author Lkhatiwada
  * @author RajeshPandey
  * @author Reedy
@@ -58,26 +59,25 @@ $messages = array(
 'tog-justify' => 'अनुच्छेद जस्टिफाइ(justify) गर्ने',
 'tog-hideminor' => 'भर्खरका मामूली सम्पादनहरुलाई लुकाउने',
 'tog-hidepatrolled' => 'गस्ती(patrolled)सम्पादनहरु हालका परिवर्तनहरुमा लुकाउने',
-'tog-newpageshidepatrolled' => 'गस्ती(patrolled) पृष्ठहरु नयाँ पृष्ठ सूचीबाट लुकाउने',
+'tog-newpageshidepatrolled' => 'गस्ती गरिएका पृष्ठहरू नयाँ पृष्ठ सूचीबाट लुकाउने',
 'tog-extendwatchlist' => 'निगरानी सूचीलाई सबै परिवर्तनहरू देखाउने गरी बढाउने , हालैको  बाहेक',
 'tog-usenewrc' => 'पृष्ठका भर्खरका परिवर्तन र अवलोकन सूचीको आधारमा सामूहिक परिवर्तनहरु ( जाभास्क्रिप्ट चाहिन्छ)',
 'tog-numberheadings' => 'शीर्षकहरुलाई स्वत:अङ्कित गर्नुहोस्',
 'tog-showtoolbar' => 'सम्पादन औजारबट्टा देखाउने',
 'tog-editondblclick' => 'दोहोरो क्लिकमा पृष्ठ सम्पादन गर्ने',
-'tog-editsection' => '[सम्पादन] सम्बन्ध मार्फत हुने खण्ड सम्पादनलाई सक्षम पार्ने',
 'tog-editsectiononrightclick' => 'शीर्षकमा दाहिने क्लिकद्वारा खण्ड सम्पादन सक्षम पार्ने',
 'tog-showtoc' => 'सामग्री तालिका हेर्ने (तीन भन्दा बढी शीर्षक भएमा)',
 'tog-rememberpassword' => 'यस ब्राउजरमा मेरो प्रवेशलाई सम्झनुहोस् (अधिकतम $1 {{PLURAL:$1|दिन|दिनहरु}} सम्म)',
 'tog-watchcreations' => 'मेरो निगरानी सूचीमा मैले सृजना गरेको पृष्ठ र अपलोड जोड्ने',
 'tog-watchdefault' => 'मैले सम्पादन गरेको पृष्ठ र फाइल निगरानी सूचीमा थप्ने',
-'tog-watchmoves' => 'मà¥\88लà¥\87 à¤¸à¤¾à¤°à¥\87à¤\95à¥\8b à¤ªà¥\83षà¥\8dठहरà¥\81 à¤° à¤«à¤¾à¤\87लहरà¥\81लाई निगरानी सूचीमा थप्ने',
-'tog-watchdeletion' => 'मà¥\88लà¥\87 à¤¹à¤\9fाà¤\8fà¤\95à¥\8b à¤ªà¥\83षà¥\8dठहरà¥\81 à¤° à¤«à¤¾à¤\87लहरà¥\81लाई निगरानी सूचीमा थप्ने',
+'tog-watchmoves' => 'मà¥\88लà¥\87 à¤¸à¤¾à¤°à¥\87à¤\95ा à¤ªà¥\83षà¥\8dठहरà¥\82 à¤° à¤«à¤¾à¤\87लहरà¥\82लाई निगरानी सूचीमा थप्ने',
+'tog-watchdeletion' => 'मà¥\88लà¥\87 à¤¹à¤\9fाà¤\8fà¤\95ा à¤ªà¥\83षà¥\8dठहरà¥\82 à¤° à¤«à¤¾à¤\87लहरà¥\82लाई निगरानी सूचीमा थप्ने',
 'tog-minordefault' => 'सबै सम्पादनहरुलाई पूर्वनिर्धारित रुपमा सामान्य चिनो लगाउने',
 'tog-previewontop' => 'सम्पादन सन्दुक अगि पूर्वरुप देखाउने',
 'tog-previewonfirst' => 'पहिलो सम्पादनमा पूर्वरुप देखाउने',
 'tog-enotifwatchlistpages' => 'मेरो निगरानी सूचीमा रहेका पृष्ठ अथवा फाइलहरु परिवर्तन गरिए मलाई ई-मेल गरियोस्',
 'tog-enotifusertalkpages' => 'मेरो प्रयोगकर्ता वार्ता पृष्ठ परिवर्तन गरिए मलाई ई-मेल गर्ने',
-'tog-enotifminoredits' => 'पà¥\83षà¥\8dठहरà¥\81 à¤° à¤«à¤¾à¤\87लहरà¥\81à¤\95à¥\8b सामान्य सम्पादन भएमा पनि मलाई ई-मेल गरियोस्',
+'tog-enotifminoredits' => 'पà¥\83षà¥\8dठहरà¥\82 à¤° à¤«à¤¾à¤\87लहरà¥\82मा सामान्य सम्पादन भएमा पनि मलाई ई-मेल गरियोस्',
 'tog-enotifrevealaddr' => 'जानकारी इ-मेलहरुमा मेरो इ-मेल खुलाउने',
 'tog-shownumberswatching' => 'निगरानी गरिरहेका प्रयोगकर्ताहरुको संख्या देखाउने',
 'tog-oldsig' => 'वर्तमान हस्ताक्षर:',
@@ -174,22 +174,22 @@ $messages = array(
 'december-date' => 'डिसेम्बर $1',
 
 # Categories related messages
-'pagecategories' => '{{PLURAL:$1|शà¥\8dरà¥\87णà¥\80|शà¥\8dरà¥\87णà¥\80हरà¥\81}}',
+'pagecategories' => '{{PLURAL:$1|शà¥\8dरà¥\87णà¥\80|शà¥\8dरà¥\87णà¥\80हरà¥\82}}',
 'category_header' => '"$1" श्रेणीमा भएका लेखहरू',
 'subcategories' => 'उपश्रेणीहरु',
 'category-media-header' => '"$1" श्रेणीमा रहेका मिडियाहरू',
 'category-empty' => "''यो श्रेणीमा हाल कुनै पृष्ठ या मिडियाहरु रहेका छैनन् ।''",
-'hidden-categories' => '{{PLURAL:$1|लà¥\81à¤\95ाà¤\87à¤\8fà¤\95à¥\8b à¤¶à¥\8dरà¥\87णà¥\80|लà¥\81à¤\95ाà¤\87à¤\8fà¤\95ा à¤¶à¥\8dरà¥\87णà¥\80हरà¥\81}}',
-'hidden-category-category' => 'लà¥\81à¤\95ाà¤\87à¤\8fà¤\95ा à¤¶à¥\8dरà¥\87णà¥\80हरà¥\81',
-'category-subcat-count' => '{{PLURAL:$2|यà¥\8b à¤¶à¥\8dरà¥\87णà¥\80मा à¤¨à¤¿à¤®à¥\8dन à¤\89पशà¥\8dरà¥\87णà¥\80हरà¥\81 à¤®à¤¾à¤¤à¥\8dर à¤\9bनà¥\8d।|यà¥\8b à¤¶à¥\8dरà¥\87णà¥\80à¤\95à¥\8b à¤¨à¤¿à¤®à¥\8dन {{PLURAL:$1|à¤\89पशà¥\8dरà¥\87णà¥\80|$1 à¤\89पशà¥\8dरà¥\87णà¥\80हरà¥\81}},  $2 à¤\95à¥\81ल à¤®à¤§à¥\8dयà¥\87 à¤¶à¥\8dरà¥\87णà¥\80हरà¥\81 छन् ।}}',
+'hidden-categories' => '{{PLURAL:$1|लà¥\81à¤\95ाà¤\87à¤\8fà¤\95à¥\8b à¤¶à¥\8dरà¥\87णà¥\80|लà¥\81à¤\95ाà¤\87à¤\8fà¤\95ा à¤¶à¥\8dरà¥\87णà¥\80हरà¥\82}}',
+'hidden-category-category' => 'लà¥\81à¤\95ाà¤\87à¤\8fà¤\95ा à¤¶à¥\8dरà¥\87णà¥\80हरà¥\82',
+'category-subcat-count' => '{{PLURAL:$2|यà¥\8b à¤¶à¥\8dरà¥\87णà¥\80मा à¤¨à¤¿à¤®à¥\8dन à¤\89पशà¥\8dरà¥\87णà¥\80हरà¥\82 à¤®à¤¾à¤¤à¥\8dर à¤\9bनà¥\8d।|यà¥\8b à¤¶à¥\8dरà¥\87णà¥\80à¤\95à¥\8b à¤¨à¤¿à¤®à¥\8dन {{PLURAL:$1|à¤\89पशà¥\8dरà¥\87णà¥\80|$1 à¤\89पशà¥\8dरà¥\87णà¥\80हरà¥\82}},  $2 à¤\95à¥\81ल à¤®à¤§à¥\8dयà¥\87 à¤¶à¥\8dरà¥\87णà¥\80हरà¥\82 छन् ।}}',
 'category-subcat-count-limited' => 'यो श्रेणीको निम्न {{PLURAL:$1|उपश्रेणी|$1 उपश्रेणीहरु}} छ।',
-'category-article-count' => '{{PLURAL:$2|यà¥\8b à¤¶à¥\8dरà¥\87णà¥\80मा à¤\8fà¤\95 à¤®à¤¾à¤¤à¥\8dर à¤ªà¥\83षà¥\8dठरहà¥\87à¤\95à¥\8b à¤\9b।|à¤\95à¥\81ल $2 à¤®à¤§à¥\8dयà¥\87 à¤¯à¥\8b à¤¶à¥\8dरà¥\87णà¥\80मा {{PLURAL:$1|पà¥\83षà¥\8dठ|$1 à¤ªà¥\83षà¥\8dठहरà¥\81}} रहेका छन् । }}',
-'category-article-count-limited' => 'निमà¥\8dन {{PLURAL:$1|पà¥\83षà¥\8dठ|$1 à¤ªà¥\83षà¥\8dठहरà¥\81}} यस श्रेणीमा रहेको ।',
+'category-article-count' => '{{PLURAL:$2|यà¥\8b à¤¶à¥\8dरà¥\87णà¥\80मा à¤\8fà¤\95 à¤®à¤¾à¤¤à¥\8dर à¤ªà¥\83षà¥\8dठरहà¥\87à¤\95à¥\8b à¤\9b।|à¤\95à¥\81ल $2 à¤®à¤§à¥\8dयà¥\87 à¤¯à¥\8b à¤¶à¥\8dरà¥\87णà¥\80मा {{PLURAL:$1|पà¥\83षà¥\8dठ|$1 à¤ªà¥\83षà¥\8dठहरà¥\82}} रहेका छन् । }}',
+'category-article-count-limited' => 'निमà¥\8dन {{PLURAL:$1|पà¥\83षà¥\8dठ|$1 à¤ªà¥\83षà¥\8dठहरà¥\82}} यस श्रेणीमा रहेको ।',
 'category-file-count' => '{{PLURAL:$2|यो श्रेणीमा निम्न फाइल मात्र छ ।|निम्न श्रेणीमा {{PLURAL:$1|फाइल|$1 फाइलहरु}} , कुल  $2 मध्ये रहेको ।}}',
 'category-file-count-limited' => 'निम्न  {{PLURAL:$1|फाइल|$1 फाइलहरु}} यस श्रेणीमा रहेको ।',
 'listingcontinuesabbrev' => 'निरन्तरता...',
-'index-category' => 'à¤\95à¥\8dरमाà¤\99à¥\8dà¤\95ित à¤ªà¥\83षà¥\8dठहरà¥\81',
-'noindex-category' => 'à¤\95à¥\8dरमाà¤\82à¤\95न à¤¨à¤\97रिà¤\8fà¤\95ा à¤ªà¥\83षà¥\8dठहरà¥\81',
+'index-category' => 'à¤\95à¥\8dरमाà¤\99à¥\8dà¤\95ित à¤ªà¥\83षà¥\8dठहरà¥\82',
+'noindex-category' => 'à¤\95à¥\8dरमाà¤\82à¤\95न à¤¨à¤\97रिà¤\8fà¤\95ा à¤ªà¥\83षà¥\8dठहरà¥\82',
 'broken-file-category' => 'टुटेको फाइल लिंकसितको पृष्ठ',
 
 'about' => 'बारेमा',
@@ -301,8 +301,8 @@ $1',
 'aboutpage' => 'Project:बारेमा',
 'copyright' => 'सामाग्री $1 अनुसार उपलब्ध छ, खुलाइएको अवस्था बाहेकको हकमा ।',
 'copyrightpage' => '{{ns:project}}:प्रतिलिपी अधिकारहरु',
-'currentevents' => 'हालà¥\88à¤\95ा à¤\98à¤\9fनाहरà¥\81',
-'currentevents-url' => 'Project:हालà¥\88à¤\95ा à¤\98à¤\9fनाहरà¥\81',
+'currentevents' => 'हालà¥\88à¤\95ा à¤\98à¤\9fनाहरà¥\82',
+'currentevents-url' => 'Project:हालà¥\88à¤\95ा à¤\98à¤\9fनाहरà¥\82',
 'disclaimers' => 'अस्विकारोक्तिहरु',
 'disclaimerpage' => 'Project:सामान्य अस्वीकारोक्ति',
 'edithelp' => 'सम्पादन सहायता',
@@ -331,7 +331,7 @@ $1',
 'youhavenewmessages' => 'तपाईंको लागि ($2) मा  $1 छ ।',
 'youhavenewmessagesfromusers' => 'तपाईंको लागि  {{PLURAL:$3|प्रयोगकर्ता|$3 प्रयोगकर्ताहरु}} ($2) बाट $1',
 'youhavenewmessagesmanyusers' => 'तपाईँलाई धेरै प्रयोगकर्ताहरू($2) बाट $1 छ ।',
-'newmessageslinkplural' => '{{PLURAL:$1|नयाà¤\81 à¤¸à¤¨à¥\8dदà¥\87श|नयाँ सन्देशहरू}}',
+'newmessageslinkplural' => '{{PLURAL:$1|à¤\8fà¤\89à¤\9fा à¤¨à¤¯à¤¾à¤\81 à¤¸à¤¨à¥\8dदà¥\87श|999=नयाँ सन्देशहरू}}',
 'newmessagesdifflinkplural' => 'अन्तिम {{PLURAL:$1|सम्पादन|सम्पादनहरू}}',
 'youhavenewmessagesmulti' => 'तपाईंको लागि $1 मा  नयाँ सन्देशहरू छन्',
 'editsection' => 'सम्पादन',
@@ -491,7 +491,7 @@ $2',
 'userlogin' => 'प्रवेश गर्ने / नयाँ खाता बनाउने',
 'userloginnocreate' => 'लग इन',
 'logout' => 'निर्गमन',
-'userlogout' => 'निरà¥\8dà¤\97मन (लà¤\97 à¤\86à¤\89à¤\89)',
+'userlogout' => 'निरà¥\8dà¤\97मन (लà¤\97 à¤\86à¤\89à¤\9f)',
 'notloggedin' => 'प्रवेश (लग ईन) नगरिएको',
 'userlogin-noaccount' => 'के खाता छैन ?',
 'userlogin-joinproject' => '{{SITENAME}} मा खाता खोल्नुहोस् ।',
@@ -805,8 +805,8 @@ $2
 'editingold' => "''चेतावनी: तपाईं यस पृष्ठको अति पुरनो अप्रचलित संशोधनको सम्पादन गर्नुहुँदैछ।'''
 यदि तपाईंले यस परिवर्तनलाई संग्रह गर्नु भयो भनें यस पछिका संशोधनहरु नष्ट हुनेछन्।",
 'yourdiff' => 'भिन्नताहरु',
-'copyrightwarning' => "à¤\95à¥\83पया à¤§à¥\8dयान à¤¦à¤¿à¤¨à¥\81हà¥\8bसà¥\8d à¤¯à¤¸ {{SITENAME}}मा à¤¦à¤¿à¤\87à¤\8fà¤\95ा à¤¯à¥\8bà¤\97दानहरà¥\81 $2à¤\95à¥\8b à¤¤à¤¹à¤¤ à¤¸à¤®à¥\8dपादन à¤° à¤ªà¥\81नरà¥\8dवितरणà¤\95à¥\8bलाà¤\97ि à¤®à¥\81à¤\95à¥\8dत à¤®à¤¾à¤¨à¤¿à¤¨à¥\87à¤\9b (विवरणà¤\95à¥\8bलाà¤\97ि $1 à¤¹à¥\87रà¥\8dनà¥\81हà¥\8bसà¥\8d) à¥¤ à¤¯à¤¦à¤¿  à¤¤à¤ªà¤¾à¤\88à¤\82à¤\95à¥\8b à¤²à¥\87à¤\96लाà¤\88 à¤¸à¤®à¥\8dपादन à¤\85थवा à¤ªà¥\81नà¤\83 à¤µà¤¿à¤¤à¤°à¤£ à¤\97राà¤\89न à¤\9aाहनà¥\81 à¤¹à¥\81नà¥\8dन à¤­à¤¨à¥\87à¤\82  à¤\95à¥\83पया à¤¯à¤¹à¤¾à¤\81  तपाईंको लेख प्रस्तुत नगर्नुहोस् ।<br />       
-यदि à¤¤à¤ªà¤¾à¤\88à¤\82 à¤\95िà¤\9fानसाथ à¤­à¤¨à¥\8dनà¥\81हà¥\81नà¥\8dà¤\9b à¤\95ि à¤\95à¥\81नà¥\88 à¤²à¥\87à¤\96 à¤®à¥\88लà¥\87 à¤²à¥\87à¤\96à¥\87à¤\95à¥\8b à¤¹à¥\8b à¤\85थवा à¤¸à¤¾à¤°à¥\8dवà¤\9cनिà¤\95 à¤\9cà¥\8dà¤\9eानà¤\95à¥\8dषà¥\87तà¥\8dर à¤\85थवा à¤®à¥\81à¤\95à¥\8dत à¤¸à¤\82साधनबाà¤\9f à¤²à¤¿à¤\87à¤\8fà¤\95à¥\8b à¤¹à¥\8b, '''यसà¥\8dतà¥\8b à¤²à¥\87à¤\96 à¤¬à¤¿à¤¨à¤¾ à¤\95पà¥\80राà¤\87à¤\9f à¤¯à¤¹à¤¾à¤\81 à¤¨à¤¦à¤¿नुहोस्!'''",
+'copyrightwarning' => "à¤\95à¥\83पया à¤§à¥\8dयान à¤¦à¤¿à¤¨à¥\81हà¥\8bसà¥\8d à¤¯à¤¸ {{SITENAME}}मा à¤¦à¤¿à¤\87à¤\8fà¤\95ा à¤¯à¥\8bà¤\97दानहरà¥\82 $2à¤\95à¥\8b à¤\85नà¥\81सार à¤¸à¤®à¥\8dपादन à¤° à¤ªà¥\81नरà¥\8dवितरणà¤\95à¥\8bलाà¤\97ि à¤\96à¥\81ला à¤®à¤¾à¤¨à¤¿à¤¨à¥\87à¤\9b (विवरणà¤\95à¥\8bलाà¤\97ि $1 à¤¹à¥\87रà¥\8dनà¥\81हà¥\8bसà¥\8d) à¥¤ à¤¯à¤¦à¤¿ à¤¤à¤ªà¤¾à¤\88à¤\82à¤\95à¥\8b à¤²à¥\87à¤\96लाà¤\88 à¤¸à¤®à¥\8dपादन à¤\85थवा à¤ªà¥\81नà¤\83 à¤µà¤¿à¤¤à¤°à¤£ à¤\97राà¤\89न à¤\9aाहनà¥\81हà¥\81नà¥\8dन à¤­à¤¨à¥\87 à¤\95à¥\83पया à¤¯à¤¹à¤¾à¤\81 तपाईंको लेख प्रस्तुत नगर्नुहोस् ।<br />       
+यदि à¤¤à¤ªà¤¾à¤\88à¤\82 à¤\95िà¤\9fानसाथ à¤­à¤¨à¥\8dनà¥\81हà¥\81नà¥\8dà¤\9b à¤\95ि à¤\95à¥\81नà¥\88 à¤²à¥\87à¤\96 à¤®à¥\88लà¥\87 à¤²à¥\87à¤\96à¥\87à¤\95à¥\8b à¤¹à¥\8b à¤\85थवा à¤¸à¤¾à¤°à¥\8dवà¤\9cनिà¤\95 à¤\9cà¥\8dà¤\9eानà¤\95à¥\8dषà¥\87तà¥\8dर à¤\85थवा à¤®à¥\81à¤\95à¥\8dत à¤¸à¤\82साधनबाà¤\9f à¤²à¤¿à¤\87à¤\8fà¤\95à¥\8b à¤¹à¥\8b, '''यसà¥\8dतà¥\8b à¤²à¥\87à¤\96 à¤\95पिराà¤\87à¤\9fबिना à¤¯à¤¹à¤¾à¤\81 à¤¨à¤°à¤¾à¤\96à¥\8dनुहोस्!'''",
 'copyrightwarning2' => "कृपया ध्यान दिनुहोस् यस {{SITENAME}}मा दिइएका योगदानहरुलाई अन्य योगदाताहरुद्वारा सम्पादन गरिनेछ, परिवर्तन गरिनेछ अथवा हटाइनेछ। यदि  तपाईंको लेखलाई निर्दयता पूर्वक सम्पादन गरेको चाहनुहुन्न भनें त्यो यहाँ नदिनुहोस्।<br />
 यदि तपाईं किटानसाथ भन्नुहुन्छ कि यो लेख तपाईं आफै लेखेको हो अथवा सार्वजनिक ज्ञानक्षेत्र अथवा मुक्त संसाधनबाट लिइएको हो (विवरणकोलागि हेर्नुहोस् $1 ). 
 '''कपीराइट भएको रचना अनुमति बिना  यहाँ नदिनुहोस्!'''",
@@ -821,12 +821,12 @@ $2
 'semiprotectedpagewarning' => "'''सूचना:''' यो पृष्ठलाई सुरक्षित गरिएको हुँदा दर्ता भएका प्रयोगकर्ताहरुले मात्र यसलाई सम्पादन गर्न सक्छन्। संदर्भको लागि नविनतम लग प्रविष्टि  तल दिइएको छ:",
 'cascadeprotectedwarning' => "'''चेतावनी:''' यस पृष्ठलाई सुरक्षित गरिएको छ यसकारण संशोधन प्रबन्धनको विशेषाधिकार प्राप्त प्रयोगकर्ताले मात्र सम्पादन गर्न सक्नेछन् किन भनें यो {{PLURAL:$1|पृष्ठ|पृष्ठहरु}}को सुरक्षित निम्न सुचिमा सुरक्षित छ :",
 'titleprotectedwarning' => "'''चेतावनी:''' यो पृष्ठलाई सुरक्षित गरिएकोछ र यसलाई सृजना गर्न  [[Special:ListGroupRights|विशेषाधिकार]] चाहिन्छ । संदर्भको लागि नवीनतम लग प्रविष्टि  तल दिइएको छ:",
-'templatesused' => 'यस à¤ªà¥\83षà¥\8dठमा à¤ªà¥\8dरयà¥\8bà¤\97 à¤­à¤\8fà¤\95ा {{PLURAL:$1|Template|à¤\9fà¥\87मà¥\8dपà¥\8dलà¥\87à¤\9f(नमà¥\82ना)हरà¥\81}} :',
-'templatesusedpreview' => 'यस à¤ªà¥\83षà¥\8dठमा à¤ªà¥\8dरयà¥\8bà¤\97 à¤­à¤\8fà¤\95ा {{PLURAL:$1|Template|à¤\9fà¥\87मà¥\8dपà¥\8dलà¥\87à¤\9f(नमà¥\82ना)हरà¥\81}} :',
+'templatesused' => 'यस à¤ªà¥\83षà¥\8dठमा à¤ªà¥\8dरयà¥\8bà¤\97 à¤­à¤\8fà¤\95ा {{PLURAL:$1|Template|à¤\9fà¥\87मà¥\8dपà¥\8dलà¥\87à¤\9f(ढाà¤\81à¤\9aा)हरà¥\82}} :',
+'templatesusedpreview' => 'यस à¤ªà¥\83षà¥\8dठमा à¤ªà¥\8dरयà¥\8bà¤\97 à¤­à¤\8fà¤\95ा {{PLURAL:$1|Template|à¤\9fà¥\87मà¥\8dपà¥\8dलà¥\87à¤\9f(ढाà¤\81à¤\9aा)हरà¥\82}} :',
 'templatesusedsection' => '{{PLURAL:$1|ढाँचा प्रयोग गरिएकोछ|ढाँचाहरु प्रयोग गरिएकाछन्}} यस खण्डमा:',
 'template-protected' => '(सुरक्षित)',
 'template-semiprotected' => '(अर्ध-सुरक्षित)',
-'hiddencategories' => 'यà¥\8b à¤ªà¥\83षà¥\8dठ à¤¨à¤¿à¤®à¥\8dन {{PLURAL:$1|1 à¤²à¥\81à¤\95ाà¤\87à¤\8fà¤\95à¥\8b à¤¶à¥\8dरà¥\87णà¥\80|$1 à¤²à¥\81à¤\95ाà¤\87à¤\8fà¤\95ा à¤¶à¥\8dरà¥\87णà¥\80हरà¥\81}}को सदस्य हो :',
+'hiddencategories' => 'यà¥\8b à¤ªà¥\83षà¥\8dठ à¤¨à¤¿à¤®à¥\8dन {{PLURAL:$1|1 à¤²à¥\81à¤\95ाà¤\87à¤\8fà¤\95à¥\8b à¤¶à¥\8dरà¥\87णà¥\80|$1 à¤²à¥\81à¤\95ाà¤\87à¤\8fà¤\95ा à¤¶à¥\8dरà¥\87णà¥\80हरà¥\82}}को सदस्य हो :',
 'edittools' => '<!-- Text here will be shown below edit and upload forms. -->',
 'edittools-upload' => '-',
 'nocreatetext' => '{{SITENAME}} ले नयाँ पृष्ठ सृजना गर्न सक्ने क्षमतामा रोक लगाएको छ।
@@ -864,13 +864,13 @@ $2
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''चेतावनी:''' यस पृष्टका अति धेरै संख्याका महँगा पार्सर फंक्सन कल्स (expensive parser function calls)  छन्।
 यसमा $2 भन्दा कम {{PLURAL:$2|कल|कल्स}} हुनुपर्छ,  यहाँ {{PLURAL:$1|अहिले $1 कल छ|अहिले $1 कल्स छ्न्}}.",
-'expensive-parserfunction-category' => "à¤\85ति à¤§à¥\87रà¥\87 à¤®à¥\87हनत à¤ªà¤°à¥\8dनà¥\87 '''पारà¥\8dसर à¤«à¤\99à¥\8dसन à¤\95ल'''हरà¥\81 à¤­à¤\8fà¤\95ा à¤ªà¥\83षà¥\8dठहरà¥\81",
+'expensive-parserfunction-category' => "à¤\85ति à¤§à¥\87रà¥\88 à¤®à¥\87हनत à¤ªà¤°à¥\8dनà¥\87 '''पारà¥\8dसर à¤«à¤\99à¥\8dसन à¤\95ल'''हरà¥\82 à¤­à¤\8fà¤\95ा à¤ªà¥\83षà¥\8dठहरà¥\82",
 'post-expand-template-inclusion-warning' => "'''चेतावनी:''' समेट्नुपर्ने टेम्प्लेट(नमुना) आकार अति ठूलो छ।
 केही टेम्प्लेटहरु(नमुनाहरु) समेटिने छैनन् ।",
 'post-expand-template-inclusion-category' => 'पृष्ठहरु जहाँ  समेटिएको टेम्पलेट आकार हुनुपर्ने भन्दा बढि छ ।',
 'post-expand-template-argument-warning' => "'''चेतावनी:''' यो पृष्ठकमा कम्तिमा एक टेम्प्लेट मान रहेको छ जसको धेरै ठूलो बढोत्तरी आकार रहेको छ।
 यस्ता मानहरु हटाइएका छन् ।",
-'post-expand-template-argument-category' => 'मà¥\87à¤\9fिà¤\8fà¤\95ा à¤¢à¤¾à¤\81à¤\9aाहरà¥\81सà¤\81à¤\97 à¤¸à¤®à¥\8dबनà¥\8dध à¤°à¤¹à¥\87à¤\95ा à¤ªà¥\83षà¥\8dठहरà¥\81',
+'post-expand-template-argument-category' => 'मà¥\87à¤\9fिà¤\8fà¤\95ा à¤¢à¤¾à¤\81à¤\9aाहरà¥\82सà¤\81à¤\97 à¤¸à¤®à¥\8dबनà¥\8dध à¤°à¤¹à¥\87à¤\95ा à¤ªà¥\83षà¥\8dठहरà¥\82',
 'parser-template-loop-warning' => 'ढाँचागत ग़ाँठो पर्‍यो : [[$1]]',
 'parser-template-recursion-depth-warning' => 'ढाँचा पुन:चक्र गहिराई सिमा ($1) भन्दा बढि भयो',
 'language-converter-depth-warning' => 'भाषा परिवर्तनकर्ता गहिराई  ($1) नाघेको छ',
@@ -1059,7 +1059,7 @@ $1",
 'viewprevnext' => 'हेर्नुहोस् ($1 {{int:pipe-separator}} $2) ($3)',
 'searchmenu-exists' => "''' \"[[:\$1]]\" नाम गरेको पृष्ठ  यो विकीमा रहेको छ'''",
 'searchmenu-new' => "'''यस विकिमा  \"[[:\$1]]\" शीर्षक भएको पृष्ठ बनाउनुहोस् !'''",
-'searchprofile-articles' => 'सामà¤\97à¥\8dरà¥\80 à¤ªà¥\83षà¥\8dठहरà¥\81',
+'searchprofile-articles' => 'सामà¤\97à¥\8dरà¥\80 à¤ªà¥\83षà¥\8dठहरà¥\82',
 'searchprofile-project' => 'सहायता र आयोजना पृष्ठहरु',
 'searchprofile-images' => 'मल्टिमिडिया(श्रव्य दृश्य)',
 'searchprofile-everything' => 'सब थोक',
@@ -1076,13 +1076,13 @@ $1",
 'search-section' => '(खण्ड $1)',
 'search-suggest' => 'के तपाईको खोजाई : $1 हो?',
 'search-interwiki-caption' => 'भगिनी आयोजना',
-'search-interwiki-default' => '$1 à¤¨à¤¤à¤¿à¤\9cाहरà¥\81:',
+'search-interwiki-default' => '$1 à¤¨à¤¤à¤¿à¤\9cाहरà¥\82:',
 'search-interwiki-more' => '(अझै)',
 'search-relatedarticle' => 'सम्बन्धित',
 'searcheverything-enable' => 'सबै नेमस्पेसेजहरुमा खोज्नुहोस्',
 'searchrelated' => 'सम्बन्धित',
 'searchall' => 'सबै',
-'showingresults' => "दà¥\87à¤\96ाà¤\89दà¥\88  {{PLURAL:$1|'''१''' à¤¨à¤¤à¤¿à¤\9cा|'''$1''' à¤¨à¤¤à¤¿à¤\9cाहरà¥\81 }} , #'''$2''' बाट सुरुहुने ।",
+'showingresults' => "दà¥\87à¤\96ाà¤\89à¤\81दà¥\88  {{PLURAL:$1|'''१''' à¤¨à¤¤à¤¿à¤\9cा|'''$1''' à¤¨à¤¤à¤¿à¤\9cाहरà¥\82 }} , #'''$2''' बाट सुरुहुने ।",
 'showingresultsnum' => "तल देखाउदै  {{PLURAL:$3|'''१''' नतिजा|'''$3''' नतिजाहरु }}, #'''$2''' बाट सुरुहुने ।",
 'showingresultsheader' => "{{PLURAL:$5|नतिजा '''$1''' को '''$3'''|नतिजाहरु '''$1 - $2''' को'''$3'''}}  ,'''$4''' को लागि",
 'search-nonefound' => 'तपाईँको क्वेरीसँग मेल खाने नतिजाहरू भेटिएनन्',
@@ -1109,7 +1109,7 @@ $1",
 'prefs-labs' => 'प्रयोगशाला गुणहरु',
 'prefs-user-pages' => 'प्रयोगकर्ता पृष्ठहरू',
 'prefs-personal' => 'प्रयोगकर्ताको विवरण',
-'prefs-rc' => 'नयाà¤\81 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतनहरà¥\81',
+'prefs-rc' => 'नयाà¤\81 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतनहरà¥\82',
 'prefs-watchlist' => 'अवलोकन पृष्ठ',
 'prefs-watchlist-days' => 'निगरानी सूचीमा देखाउन दिनहरु:',
 'prefs-watchlist-days-max' => 'धेरैमा $1 {{PLURAL:$1|दिन|दिन}}',
@@ -1267,7 +1267,7 @@ HTML ट्यागहरु जाँच्नुहोस् ।',
 'right-createtalk' => 'छलफल पृष्ठ सृजना गर्नुहोस्',
 'right-createaccount' => 'नयाँ प्रयोगकर्ता खाता सृजना गर्नुहोस्।',
 'right-minoredit' => 'सम्पादनलाई सामान्य चिनो लगाउने',
-'right-move' => 'पà¥\83षà¥\8dठहरà¥\81 सार्ने',
+'right-move' => 'पà¥\83षà¥\8dठहरà¥\82 सार्ने',
 'right-move-subpages' => 'तिनीहरुको सह-पृष्ठसहित पृष्ठहरु सार्ने',
 'right-move-rootuserpages' => 'मूल(root) प्रयोगकर्ताको पृष्ठहरु सार्ने',
 'right-movefile' => 'फाइलहरु सार्ने',
@@ -1282,12 +1282,12 @@ HTML ट्यागहरु जाँच्नुहोस् ।',
 'right-bot' => 'स्वाचालित कार्यको रुपमा व्यवहार गर्ने',
 'right-apihighlimits' => 'API खोजको लागि उच्च सीमा प्रयोग गर्नुहोस्',
 'right-writeapi' => 'लेखन API प्रयोग गर्ने',
-'right-delete' => 'पà¥\83षà¥\8dठहरà¥\81 मेट्ने',
+'right-delete' => 'पà¥\83षà¥\8dठहरà¥\82 मेट्ने',
 'right-bigdelete' => 'लामो इतिहासहरु भएको पृष्ठहरु मेट्ने',
 'right-deleterevision' => 'खुलाइएको पृष्ठहरु मेटाउने र मेटाएको रद्द गर्ने',
 'right-deletedhistory' => 'मेटाइएको इतिहास प्रविष्टीहरु हेर्ने, तिनीहरुसँग सम्बद्ध पाठ बिना',
 'right-deletedtext' => 'मेटाइएका संशोधन बीचका मेटाइएका पाठ र परिवर्तनहरु हेर्ने',
-'right-browsearchive' => 'मà¥\87à¤\9fिà¤\8fà¤\95ा à¤ªà¥\83षà¥\8dठहरà¥\81 खोज्ने',
+'right-browsearchive' => 'मà¥\87à¤\9fिà¤\8fà¤\95ा à¤ªà¥\83षà¥\8dठहरà¥\82 खोज्ने',
 'right-undelete' => 'मेटेको पृष्ठ फिर्तागर्ने',
 'right-suppressrevision' => 'प्रबन्धकहरुबाट लुकाइएको पुनरावलोकनहरु पूर्वालोकन गर्ने र पुरानो स्थितिमा फर्काउने',
 'right-suppressionlog' => 'व्यक्तिगत लगहरु हेर्ने',
@@ -1336,7 +1336,7 @@ HTML ट्यागहरु जाँच्नुहोस् ।',
 'action-minoredit' => 'यस सम्पादनलाई साधारणको रुपमा चिनो लगाउने',
 'action-move' => 'यो पृष्ठलाई सर्ने',
 'action-move-subpages' => 'यो पृष्ठ र यसका सह पृष्ठहरुलाई सर्ने',
-'action-move-rootuserpages' => 'मà¥\82ल à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤ªà¥\83षà¥\8dठहरà¥\81 सार्ने',
+'action-move-rootuserpages' => 'मà¥\82ल à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤ªà¥\83षà¥\8dठहरà¥\82 सार्ने',
 'action-movefile' => 'यो फाइल सार्ने',
 'action-upload' => 'यो फाइल अपलोड गर्ने',
 'action-reupload' => 'रहिआएको फाइल अधिलेखन गर्ने',
@@ -1346,7 +1346,7 @@ HTML ट्यागहरु जाँच्नुहोस् ।',
 'action-delete' => 'यो पृष्ठ मेट्ने',
 'action-deleterevision' => 'यो पुनरावलोकन मेट्ने',
 'action-deletedhistory' => 'यो पृष्ठको मेटाइएको इतिहास हेर्ने',
-'action-browsearchive' => 'मà¥\87à¤\9fिà¤\8fà¤\95ा à¤ªà¥\83षà¥\8dठहरà¥\81 खोज्ने',
+'action-browsearchive' => 'मà¥\87à¤\9fिà¤\8fà¤\95ा à¤ªà¥\83षà¥\8dठहरà¥\82 खोज्ने',
 'action-undelete' => 'यो पृष्ठ लाइ पुन:स्थापना गर्ने',
 'action-suppressrevision' => 'यो लुकाइएको पुनरावलोकनको पुर्वालोकन गर्ने र पुनरावृत्ति गर्ने',
 'action-suppressionlog' => 'यो व्यक्तिगत लग हेर्ने',
@@ -1366,7 +1366,7 @@ HTML ट्यागहरु जाँच्नुहोस् ।',
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|परिवर्तन|परिवर्तनहरु}}',
 'enhancedrc-history' => 'इतिहास',
-'recentchanges' => 'नयाà¤\81 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतनहरà¥\81',
+'recentchanges' => 'नयाà¤\81 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतनहरà¥\82',
 'recentchanges-legend' => 'हालैको परिवर्तन विकल्पहरु',
 'recentchanges-summary' => 'विकिका भर्खरका परिवर्तनहरुलाई यस पृष्ठमा पहिल्याउने',
 'recentchanges-feed-description' => 'यो फिडमा रहेको विकीको सवैभन्दा अन्तिम परिवर्तनहरुको जानकारी राख्नुहोस्',
@@ -1404,9 +1404,9 @@ HTML ट्यागहरु जाँच्नुहोस् ।',
 'rc-old-title' => 'मौलिक तौरमा "$1" रुपमा बनाइएको',
 
 # Recent changes linked
-'recentchangeslinked' => 'सà¤\82बनà¥\8dधित à¤ªà¤°à¤¿à¤µà¤°à¥\8dतनहरà¥\81',
-'recentchangeslinked-feed' => 'सà¤\82बनà¥\8dधित à¤ªà¤°à¤¿à¤µà¤°à¥\8dतनहरà¥\81',
-'recentchangeslinked-toolbox' => 'सà¤\82बनà¥\8dधित à¤ªà¤°à¤¿à¤µà¤°à¥\8dतनहरà¥\81',
+'recentchangeslinked' => 'समà¥\8dबनà¥\8dधित à¤ªà¤°à¤¿à¤µà¤°à¥\8dतनहरà¥\82',
+'recentchangeslinked-feed' => 'समà¥\8dबनà¥\8dधित à¤ªà¤°à¤¿à¤µà¤°à¥\8dतनहरà¥\82',
+'recentchangeslinked-toolbox' => 'समà¥\8dबनà¥\8dधित à¤ªà¤°à¤¿à¤µà¤°à¥\8dतनहरà¥\82',
 'recentchangeslinked-title' => '"$1"सम्वन्धित परिवर्तनसँग',
 'recentchangeslinked-summary' => "यो सूची निर्दिष्ट पृष्ठ (वा निर्दिष्ट श्रेणी)सित जोड़िएका  भर्खरै परिवर्तन भएका पृष्ठको  हो। [[Special:Watchlist|तपाईँको निगरानी सूची]]का पृष्ठहरु '''गाढा अक्षरमा''' छन्।",
 'recentchangeslinked-page' => 'पृष्ठ नाम:',
@@ -1425,13 +1425,13 @@ HTML ट्यागहरु जाँच्नुहोस् ।',
 'upload-recreate-warning' => "'''चेतावनी: त्यस नाममा रहेका फाइलहरु सारिएको या हटाइएको छ।'''
 
 यस पृष्ठको सारिएको र हटाइएको लग तपाईको सहजताको लागि दिइएको छ।",
-'uploadtext' => "फाà¤\87ल à¤\89रà¥\8dधà¥\8dवभरण गर्न निम्न फारम प्रयोग गर्नुहोस्।
-हà¥\87रà¥\8dनà¥\81हà¥\8bसà¥\8d- à¤ªà¤¹à¤¿à¤²à¤¾ à¤\89रà¥\8dधà¥\8dवभरण à¤\97रिà¤\8fà¤\95ा [[Special:FileList|फाà¤\87लहरà¥\81à¤\95à¥\8b à¤¸à¥\82à¤\9aà¥\80]] , à¤ªà¥\81नà¤\83 à¤\89रà¥\8dधà¥\8dवभरण à¤\97रिà¤\8fà¤\95ा [[Special:Log/upload|à¤\89रà¥\8dधà¥\8dवभरण à¤²à¤\97]]मा , à¤®à¥\87à¤\9fिà¤\8fà¤\95ा à¤«à¤¾à¤\87लहरà¥\81 [[Special:Log/delete|मेटिएको लग]]मा।
+'uploadtext' => "फाà¤\87ल à¤\85पलà¥\8bड गर्न निम्न फारम प्रयोग गर्नुहोस्।
+हà¥\87रà¥\8dनà¥\81हà¥\8bसà¥\8d- à¤ªà¤¹à¤¿à¤²à¤¾ à¤\85पलà¥\8bड à¤\97रिà¤\8fà¤\95ा [[Special:FileList|फाà¤\87लहरà¥\82à¤\95à¥\8b à¤¸à¥\82à¤\9aà¥\80]] , à¤ªà¥\81नà¤\83 à¤\85पलà¥\8bड à¤\97रिà¤\8fà¤\95ा [[Special:Log/upload|à¤\85पलà¥\8bड à¤²à¤\97]]मा, à¤®à¥\87à¤\9fिà¤\8fà¤\95ा à¤«à¤¾à¤\87लहरà¥\82 [[Special:Log/delete|मेटिएको लग]]मा।
 
-पà¥\83षà¥\8dठमा à¤«à¤¾à¤\87ल à¤¸à¤\82लà¤\97à¥\8dन à¤\97रà¥\8dन à¤¤à¤² à¤¦à¤¿à¤\8fà¤\95ा à¤«à¤¾à¤°à¤®à¤¹à¤°à¥\81मध्ये एउटामा लिङ्क गराउनुहोस्:
+पà¥\83षà¥\8dठमा à¤«à¤¾à¤\87ल à¤¸à¤\82लà¤\97à¥\8dन à¤\97रà¥\8dन à¤¤à¤² à¤¦à¤¿à¤\8fà¤\95ा à¤«à¤¾à¤°à¤®à¤¹à¤°à¥\82मध्ये एउटामा लिङ्क गराउनुहोस्:
 * '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>'''पूर्ण आकारको फाइल प्रयोग गर्न
-* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code>''' 200 पिक्सलको देब्रेपटि मार्जिन गरेर फाइलको बर्णनसहित प्रयोग गर्न
-* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' à¤«à¤¾à¤\87ल à¤¨à¤¦à¥\87à¤\96ाà¤\88 à¤¸à¤¿à¤§à¥\88 à¤«à¤¾à¤\87लसित à¤²à¤¿à¤\99à¥\8dà¤\95 à¤\97रि प्रयोग गर्न",
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code>''' 200 à¤ªà¤¿à¤\95à¥\8dसलà¤\95à¥\8b à¤¦à¥\87बà¥\8dरà¥\87पà¤\9fà¥\8dà¤\9fि à¤®à¤¾à¤°à¥\8dà¤\9cिन à¤\97रà¥\87र à¤«à¤¾à¤\87लà¤\95à¥\8b à¤¬à¤°à¥\8dणनसहित à¤ªà¥\8dरयà¥\8bà¤\97 à¤\97रà¥\8dन
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' à¤«à¤¾à¤\87ल à¤¨à¤¦à¥\87à¤\96ाà¤\88 à¤¸à¤¿à¤\82धà¥\88 à¤«à¤¾à¤\87लसित à¤²à¤¿à¤\99à¥\8dà¤\95 à¤\97रà¥\80 प्रयोग गर्न",
 'upload-permitted' => 'अनुमति पाएका फ़ाइल प्रकार:$1.',
 'upload-preferred' => 'चाहिएका फ़ाइल प्रकार:$1.',
 'upload-prohibited' => 'निषिद्ध फ़ाइल प्रकार:$1.',
@@ -1644,7 +1644,7 @@ $1',
 'download' => 'डाउनलोड',
 
 # Unwatched pages
-'unwatchedpages' => 'धà¥\8dयान à¤¨à¤¦à¤¿à¤\87à¤\8fà¤\95ा à¤ªà¥\83षà¥\8dठहरà¥\81',
+'unwatchedpages' => 'धà¥\8dयान à¤¨à¤¦à¤¿à¤\87à¤\8fà¤\95ा à¤ªà¥\83षà¥\8dठहरà¥\82',
 
 # List redirects
 'listredirects' => 'अनुप्रेषित सूची',
@@ -1671,9 +1671,9 @@ $1',
 'statistics-header-views' => 'तथ्याङ्क देखाउनुहोस्',
 'statistics-header-users' => 'प्रयोगकर्ता तथ्याङ्कहरु',
 'statistics-header-hooks' => 'अन्य तथ्याङ्कहरु',
-'statistics-articles' => 'सामà¤\97à¥\8dरà¥\80 à¤ªà¥\83षà¥\8dठहरà¥\81',
-'statistics-pages' => 'पà¥\83षà¥\8dठहरà¥\81',
-'statistics-pages-desc' => 'विà¤\95िà¤\95ा à¤¸à¤¬à¥\88 à¤ªà¥\83षà¥\8dठहरà¥\81 , à¤µà¤¾à¤°à¥\8dतापà¤\95ा à¤ªà¥\83षà¥\8dठहरà¥\81 à¤¸à¤®à¥\87त , à¤°à¤¿à¤¡à¤¾à¤\87रà¥\87à¤\95à¥\8dà¤\9f , इत्यादि ।',
+'statistics-articles' => 'सामà¤\97à¥\8dरà¥\80 à¤ªà¥\83षà¥\8dठहरà¥\82',
+'statistics-pages' => 'पà¥\83षà¥\8dठहरà¥\82',
+'statistics-pages-desc' => 'विà¤\95िà¤\95ा à¤¸à¤¬à¥\88 à¤ªà¥\83षà¥\8dठहरà¥\82, à¤µà¤¾à¤°à¥\8dतापà¤\95ा à¤ªà¥\83षà¥\8dठहरà¥\82समà¥\87त, à¤°à¤¿à¤¡à¤¾à¤\87रà¥\87à¤\95à¥\8dà¤\9f, इत्यादि ।',
 'statistics-files' => 'उर्ध्वभरण गरिएका फाइलहरु',
 'statistics-edits' => '{{SITENAME}} स्थापना भए देखिको पृष्ठ सम्पादन',
 'statistics-edits-average' => 'प्रतिपृष्ठ औसत सम्पादन',
@@ -1695,12 +1695,12 @@ $1',
 'brokenredirects-edit' => 'सम्पादन',
 'brokenredirects-delete' => 'मेट्ने',
 
-'withoutinterwiki' => 'भाषा à¤¨à¤­à¤\8fà¤\95à¥\8b à¤ªà¥\83षà¥\8dठहरà¥\81',
+'withoutinterwiki' => 'भाषा à¤¨à¤­à¤\8fà¤\95à¥\8b à¤ªà¥\83षà¥\8dठहरà¥\82',
 'withoutinterwiki-summary' => 'यी पानाहरूले अन्य भाषाका संस्करणहरूमा संबन्ध राखेका छैनन्:',
 'withoutinterwiki-legend' => 'पहिले आउने',
 'withoutinterwiki-submit' => 'देखाउने',
 
-'fewestrevisions' => 'थà¥\8bरà¥\88 à¤ªà¥\81नरावलà¥\8bà¤\95न à¤­à¤\8fà¤\95ा à¤ªà¥\83षà¥\8dठहरà¥\81',
+'fewestrevisions' => 'थà¥\8bरà¥\88 à¤ªà¥\81नरावलà¥\8bà¤\95न à¤­à¤\8fà¤\95ा à¤ªà¥\83षà¥\8dठहरà¥\82',
 
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|बाइट|बाइटहरू}}',
@@ -1712,31 +1712,31 @@ $1',
 'nimagelinks' => '$1 {{PLURAL:$1|पृष्ठ|पृष्ठहरु}}माथि प्रयोग गरिएको',
 'ntransclusions' => '$1 {{PLURAL:$1पृष्ठमा प्रयोग गरिएको|पृष्ठहरुमा प्रयोग गरिएका}}',
 'specialpage-empty' => 'यो पृष्ठ खाली छ।',
-'lonelypages' => 'à¤\85नाथ à¤ªà¥\83षà¥\8dठहरà¥\81',
-'uncategorizedpages' => 'शà¥\8dरà¥\87णà¥\80à¤\95रण à¤¨à¤­à¤\8fà¤\95ा à¤ªà¥\83षà¥\8dठहरà¥\81',
-'uncategorizedcategories' => 'शà¥\8dरà¥\87णà¥\80à¤\95रण à¤¨à¤­à¤\8fà¤\95ा à¤¶à¥\8dरà¥\87णà¥\80हरà¥\81',
+'lonelypages' => 'à¤\85नाथ à¤ªà¥\83षà¥\8dठहरà¥\82',
+'uncategorizedpages' => 'शà¥\8dरà¥\87णà¥\80à¤\95रण à¤¨à¤­à¤\8fà¤\95ा à¤ªà¥\83षà¥\8dठहरà¥\82',
+'uncategorizedcategories' => 'शà¥\8dरà¥\87णà¥\80à¤\95रण à¤¨à¤­à¤\8fà¤\95ा à¤¶à¥\8dरà¥\87णà¥\80हरà¥\82',
 'uncategorizedimages' => 'श्रेणीकरण नभएका फाइलहरु',
 'uncategorizedtemplates' => 'श्रेणीकरण नभएका टेम्प्लेटहरु',
-'unusedcategories' => 'पà¥\8dरयà¥\8bà¤\97 à¤¨à¤­à¤\8fà¤\95ा à¤¶à¥\8dरà¥\87णà¥\80हरà¥\81',
+'unusedcategories' => 'पà¥\8dरयà¥\8bà¤\97 à¤¨à¤­à¤\8fà¤\95ा à¤¶à¥\8dरà¥\87णà¥\80हरà¥\82',
 'unusedimages' => 'प्रयोग नभएका फाइलहरु',
 'popularpages' => 'धेरै रूचाईएका पृष्ठहरू',
-'wantedcategories' => 'माà¤\97 à¤­à¤\8fà¤\95ा à¤¶à¥\8dरà¥\87णà¥\80हरà¥\81',
-'wantedpages' => 'à¤\96à¥\8bà¤\9cिà¤\8fà¤\95ा à¤ªà¥\83षà¥\8dठहरà¥\81',
+'wantedcategories' => 'माà¤\97 à¤­à¤\8fà¤\95ा à¤¶à¥\8dरà¥\87णà¥\80हरà¥\82',
+'wantedpages' => 'à¤\96à¥\8bà¤\9cिà¤\8fà¤\95ा à¤ªà¥\83षà¥\8dठहरà¥\82',
 'wantedpages-badtitle' => 'नतिजा सूचीमा अमान्य शीर्षक:$1',
 'wantedfiles' => 'माग भएका फाइलहरु',
 'wantedtemplates' => 'माग भएका टेम्प्लेटहरु',
 'mostlinked' => 'सबैभन्दा बढि लिंक भएको पृष्ठ',
-'mostlinkedcategories' => 'सबै भन्दा बढी जोडिएको श्रेणीहरु',
+'mostlinkedcategories' => 'सबैभन्दा बढी लिंक भएका श्रेणीहरू',
 'mostlinkedtemplates' => 'ढाँचाहरुसित सबैभन्दा बढि लिंक भएको',
 'mostcategories' => 'सबैभन्दा धेरै श्रेणीहरू भएका लेखहरू',
 'mostimages' => 'सबैभन्दा बढि लिंक भएको चित्र',
 'mostrevisions' => 'सबैभन्दा बढी संशोधित लेखहरू',
 'prefixindex' => 'प्रिफिक्स सहितका पृष्ठहरु',
-'shortpages' => 'à¤\9bà¥\8bà¤\9fा à¤ªà¥\83षà¥\8dठहरà¥\81',
-'longpages' => 'लामà¥\8b à¤ªà¥\83षà¥\8dठहरà¥\81',
-'deadendpages' => 'हदà¥\88-à¤\85नà¥\8dतà¤\95ि à¤ªà¥\83षà¥\8dठहरà¥\81',
+'shortpages' => 'à¤\9bà¥\8bà¤\9fा à¤ªà¥\83षà¥\8dठहरà¥\82',
+'longpages' => 'लामा à¤ªà¥\83षà¥\8dठहरà¥\82',
+'deadendpages' => 'मà¥\8dयाद à¤¸à¤\95िà¥\87à¤\8fà¤\95ा à¤ªà¥\83षà¥\8dठहरà¥\82',
 'deadendpagestext' => 'निम्न पृष्ठहरु {{SITENAME}}मा रहेका अरु पृष्ठहरुसँग जोडिदैनन् ।',
-'protectedpages' => 'सà¤\82रà¤\95à¥\8dषित à¤ªà¥\83षà¥\8dठहरà¥\81',
+'protectedpages' => 'सà¤\82रà¤\95à¥\8dषित à¤ªà¥\83षà¥\8dठहरà¥\82',
 'protectedpages-indef' => 'नखुलेको सुरक्षा मात्र',
 'protectedpages-cascade' => 'लामबद्ध सुरक्षाहरु मात्रा',
 'protectedpagesempty' => 'दिइएको प्यारामिटर प्रयोग गरि सुरक्षा गरिएका पृष्ठहरु छैनन् ।',
@@ -1749,7 +1749,7 @@ $1',
 'usercreated' => ' $1को $2 मा {{GENDER:$3|सृजना}} गरिएको',
 'newpages' => 'नयाँ पृष्ठहरू',
 'newpages-username' => 'प्रयोगकर्ता नाम:',
-'ancientpages' => 'सबà¥\88भनà¥\8dदा à¤ªà¥\81राना à¤ªà¥\83षà¥\8dठहरà¥\81',
+'ancientpages' => 'सबà¥\88भनà¥\8dदा à¤ªà¥\81राना à¤ªà¥\83षà¥\8dठहरà¥\82',
 'move' => 'सार्ने',
 'movethispage' => 'यो पृष्ठ सार्नुहोस्',
 'notargettitle' => 'कुनैपनि निसाना(टारगेट) छैन',
@@ -1773,14 +1773,14 @@ $1',
 'log-title-wildcard' => 'पाठबाट सुरुहुने शीर्षकहरु खोज्नुहोस्',
 
 # Special:AllPages
-'allpages' => 'सबà¥\88 à¤ªà¥\83षà¥\8dठहरà¥\81',
+'allpages' => 'सबà¥\88 à¤ªà¥\83षà¥\8dठहरà¥\82',
 'alphaindexline' => '$1 लाई $2 मा',
 'nextpage' => 'अर्को पृष्ठ ($1)',
 'prevpage' => 'पहिलो पृष्ठ ($1)',
-'allpagesfrom' => 'यहाà¤\81दà¥\87à¤\96ि à¤¶à¥\81रà¥\81 à¤¹à¥\81नà¥\87 à¤ªà¥\83षà¥\8dठहरà¥\81 देखाउनुहोस्:',
-'allpagesto' => 'निमà¥\8dनमा à¤\85नà¥\8dतहà¥\81नà¥\87 à¤ªà¥\83षà¥\8dठहरà¥\81 देखाउने:',
-'allarticles' => 'सबà¥\88 à¤²à¥\87à¤\96हरà¥\81',
-'allinnamespace' => 'सबà¥\88 à¤ªà¥\83षà¥\8dठहरà¥\81 ($1 नेमस्पेस)',
+'allpagesfrom' => 'यहाà¤\81दà¥\87à¤\96ि à¤¶à¥\81रà¥\81 à¤¹à¥\81नà¥\87 à¤ªà¥\83षà¥\8dठहरà¥\82 देखाउनुहोस्:',
+'allpagesto' => 'निमà¥\8dनमा à¤\85नà¥\8dतहà¥\81नà¥\87 à¤ªà¥\83षà¥\8dठहरà¥\82 देखाउने:',
+'allarticles' => 'सबà¥\88 à¤²à¥\87à¤\96हरà¥\82',
+'allinnamespace' => 'सबà¥\88 à¤ªà¥\83षà¥\8dठहरà¥\82 ($1 नेमस्पेस)',
 'allpagessubmit' => 'जाने',
 'allpagesprefix' => 'यी सुरुका अक्षरसहितका पृष्ठहरु हेर्ने:',
 'allpagesbadtitle' => 'दिएको पृष्ठ शीर्षक अमान्य, खाली वा गलत रुपमा अन्तर भाषा वा अन्तर विकी सम्बन्ध गरिएको थियो।  
@@ -1790,14 +1790,14 @@ $1',
 
 # Special:Categories
 'categories' => 'श्रेणीहरू',
-'categoriesfrom' => 'शà¥\8dरà¥\87णà¥\80हरà¥\81 देखाउन शुरु हुने यहाँ:',
+'categoriesfrom' => 'शà¥\8dरà¥\87णà¥\80हरà¥\82 देखाउन शुरु हुने यहाँ:',
 'special-categories-sort-count' => 'गणना क्रममा राख्नुहोस्',
 'special-categories-sort-abc' => 'वर्णानुक्रम अनुसार मिलाउने',
 
 # Special:DeletedContributions
-'deletedcontributions' => 'पà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dताà¤\95ा à¤®à¥\87à¤\9fिà¤\8fà¤\95ा à¤¯à¥\8bà¤\97दानहरà¥\81',
-'deletedcontributions-title' => 'पà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dताà¤\95ा à¤®à¥\87à¤\9fाà¤\87à¤\8fà¤\95ा à¤¯à¥\8bà¤\97दानहरà¥\81',
-'sp-deletedcontributions-contribs' => 'यà¥\8bà¤\97दानहरà¥\81',
+'deletedcontributions' => 'पà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dताà¤\95ा à¤®à¥\87à¤\9fिà¤\8fà¤\95ा à¤¯à¥\8bà¤\97दानहरà¥\82',
+'deletedcontributions-title' => 'पà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dताà¤\95ा à¤®à¥\87à¤\9fाà¤\87à¤\8fà¤\95ा à¤¯à¥\8bà¤\97दानहरà¥\82',
+'sp-deletedcontributions-contribs' => 'यà¥\8bà¤\97दानहरà¥\82',
 
 # Special:LinkSearch
 'linksearch' => 'बाह्य लिंक खोज',
@@ -1886,7 +1886,7 @@ $1',
 'watchnologintext' => 'आफ्नो अवलोकनलाइ परिवर्तन गर्नको लागि त तपाइ यसमा [[Special:UserLogin|प्रवेश(लगइन)]] गर्नुपर्छ।',
 'addwatch' => 'निगरानी सुचीमा थप्ने',
 'addedwatchtext' => '"[[:$1]]" पृष्ठ [[Special:Watchlist|अवलोकनसूची]]मा थपियो
-यो पृष्ठ र यससित सम्बद्ध वार्तालाप पृष्ठमा भविष्यमा हुने परिवर्तन  सूचिबद्ध गरिनेछ र यो पृष्ठ [[Special:RecentChanges|नयाँ परिवर्तनहरु]]मा छान्न सजिलोकोलागि गाढा अक्षरमा देखा पर्नेछ।',
+यो पृष्ठ र यससित सम्बद्ध वार्तालाप पृष्ठमा भविष्यमा हुने परिवर्तन सूचिबद्ध गरिनेछ र यो पृष्ठ [[Special:RecentChanges|नयाँ परिवर्तनहरू]]मा छान्न सजिलोकोलागि गाढा अक्षरमा देखा पर्नेछ।',
 'removewatch' => 'निगरानी सुचीबाट हटाउने',
 'removedwatchtext' => 'पृष्ठ "[[:$1]]" [[Special:Watchlist|तपाईको निगरानी सूची]]बाट हटाइएको छ।',
 'watch' => 'अवलोकन',
@@ -2053,7 +2053,7 @@ proceed with caution.',
 'restriction-level-all' => 'कुनै स्तर',
 
 # Undelete
-'undelete' => 'मà¥\87à¤\9fिà¤\8fà¤\95ा à¤ªà¥\83षà¥\8dठहरà¥\81 à¤¹à¥\87रà¥\8dनà¥\81हà¥\8bस',
+'undelete' => 'मà¥\87à¤\9fिà¤\8fà¤\95ा à¤ªà¥\83षà¥\8dठहरà¥\82 à¤¹à¥\87रà¥\8dनà¥\81हà¥\8bसà¥\8d',
 'undeletepage' => 'मेटाइएका पृष्ठहरु हेर्ने अनि पुनर्स्थापित गर्ने',
 'undeletepagetitle' => "'''[[:$1|$1]]का मेटाइएका पुनरावलोकनहरु यसभित्र  छन् '''।",
 'viewdeletedpage' => 'मेटिएका पृष्ठहरू हेर्नुहोस्',
@@ -2089,8 +2089,8 @@ $3द्वारा $1को ($4को  समय $5 मा) मेटाइए
 'undeletedpage' => "'''$1लाई पूर्वावस्थामा ल्याइयो'''
 भर्खरै मेटाइएको रिकर्डहरु र पुनर्स्थापनाहरु हेर्न [[Special:Log/delete|मेटाइएको लग]]मा जानुहोस्।",
 'undelete-header' => 'भर्खर मेटिएका पृष्ठहरु हेर्न [[Special:Log/delete|मेटाइएका लग]]मा जानुहोस्।',
-'undelete-search-title' => 'मà¥\87à¤\9fिà¤\8fà¤\95ा à¤ªà¥\83षà¥\8dठहरà¥\81 à¤\96à¥\8bà¤\9cà¥\8dनà¥\81हà¥\8bस',
-'undelete-search-box' => 'मà¥\87à¤\9fिà¤\8fà¤\95ा à¤ªà¥\83षà¥\8dठहरà¥\81 à¤\96à¥\8bà¤\9cà¥\8dनà¥\81हà¥\8bस',
+'undelete-search-title' => 'मà¥\87à¤\9fिà¤\8fà¤\95ा à¤ªà¥\83षà¥\8dठहरà¥\82 à¤\96à¥\8bà¤\9cà¥\8dनà¥\81हà¥\8bसà¥\8d',
+'undelete-search-box' => 'मà¥\87à¤\9fिà¤\8fà¤\95ा à¤ªà¥\83षà¥\8dठहरà¥\82 à¤\96à¥\8bà¤\9cà¥\8dनà¥\81हà¥\8bसà¥\8d',
 'undelete-search-prefix' => 'बाट सुरु हुने  पृष्ठहरु देखाउनुहोस :',
 'undelete-search-submit' => 'खोजी गर्नुहोस्',
 'undelete-no-results' => 'मेटिएका पृष्ठहरुको अभिलेखमा कुनै पनि मिल्दो पृष्ठहरु भेटिएन ।',
@@ -2115,19 +2115,19 @@ $3द्वारा $1को ($4को  समय $5 मा) मेटाइए
 
 # Contributions
 'contributions' => '{{GENDER:$1|प्रयोगकर्ता}}का योगदानहरू',
-'contributions-title' => '$1à¤\95à¥\8b à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤¯à¥\8bà¤\97दानहरà¥\81',
-'mycontris' => 'यà¥\8bà¤\97दानहरà¥\81',
+'contributions-title' => '$1à¤\95à¥\8b à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤¯à¥\8bà¤\97दानहरà¥\82',
+'mycontris' => 'यà¥\8bà¤\97दानहरà¥\82',
 'contribsub2' => ' {{GENDER:$3|$1}} ($2)को लागि',
 'nocontribs' => 'यस मापदण्ड अनुसार परिवर्त पाइएन।',
 'uctop' => '(वर्तमान)',
 'month' => 'महिना देखि (र पहिले):',
 'year' => 'वर्ष देखि( र पहिले):',
 
-'sp-contributions-newbies' => 'नयाà¤\81 à¤\96ाताà¤\95à¥\8b à¤²à¤¾à¤\97ि à¤®à¤¾à¤¤à¥\8dर à¤¯à¥\8bà¤\97दानहरà¥\81 देखाउने',
+'sp-contributions-newbies' => 'नयाà¤\81 à¤\96ाताà¤\95à¥\8b à¤¯à¥\8bà¤\97दानहरà¥\82 à¤®à¤¾à¤¤à¥\8dर देखाउने',
 'sp-contributions-newbies-sub' => 'नयाँ खाताहरुको लागि',
-'sp-contributions-newbies-title' => 'नयाà¤\81 à¤\96ाताहरà¥\81à¤\95à¥\8b à¤²à¤¾à¤\97ि à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dताà¤\95ा à¤¯à¥\8bà¤\97दानहरà¥\81',
+'sp-contributions-newbies-title' => 'नयाà¤\81 à¤\96ाताहरà¥\82à¤\95à¥\8b à¤²à¤¾à¤\97ि à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dताà¤\95ा à¤¯à¥\8bà¤\97दानहरà¥\82',
 'sp-contributions-blocklog' => 'रोकावट लग',
-'sp-contributions-deleted' => 'पà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dताà¤\95ा à¤¯à¥\8bà¤\97दानहरà¥\81 मेटाइयो',
+'sp-contributions-deleted' => 'पà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dताà¤\95ा à¤¯à¥\8bà¤\97दानहरà¥\82 मेटाइयो',
 'sp-contributions-uploads' => 'उर्ध्वभरणहरु',
 'sp-contributions-logs' => 'लगहरु',
 'sp-contributions-talk' => 'वार्ता',
@@ -2136,7 +2136,7 @@ $3द्वारा $1को ($4को  समय $5 मा) मेटाइए
 नवीनतम रोकाइ गरेको लग प्रविष्टि सन्दर्भको निम्ति तल दिएकोछ:',
 'sp-contributions-blocked-notice-anon' => 'यो IP ठेगानालाई अहिले रोक लगाइएको छ।
 नवीनतम रोकाइ गरेको लग प्रविष्टि सन्दर्भको निम्ति तल दिएकोछ:',
-'sp-contributions-search' => 'यà¥\8bà¤\97दानहरà¥\81 खोज्नुहोस्',
+'sp-contributions-search' => 'यà¥\8bà¤\97दानहरà¥\82 खोज्नुहोस्',
 'sp-contributions-username' => 'IP ठेगाना वा प्रयोगकर्ता नाम :',
 'sp-contributions-toponly' => 'नवीनतम संशोधनका सम्पादनहरु देखाउनुहोस्',
 'sp-contributions-submit' => 'खोज',
@@ -2237,7 +2237,7 @@ $3द्वारा $1को ($4को  समय $5 मा) मेटाइए
 'blocklink' => 'रोक्ने',
 'unblocklink' => 'रोक फुकुवा गर्ने',
 'change-blocklink' => 'रोकमा परिवर्तन गर्ने',
-'contribslink' => 'यà¥\8bà¤\97दानहरà¥\81',
+'contribslink' => 'यà¥\8bà¤\97दानहरà¥\82',
 'emaillink' => 'इमेल पठाउने',
 'autoblocker' => 'तपाईंको आई पी ठेगाना  "[[User:$1|$1]]" द्वारा  भर्खरै प्रयोग गरिएकोले स्वत: बन्देज गरिएको।
 $1को बन्देजको कारण : "$2" हो',
@@ -2345,7 +2345,7 @@ $1को बन्देजको कारण : "$2" हो',
 'movepage-max-pages' => 'अधिकतम $1 {{PLURAL:$1|पृष्ठ|पृष्ठहरु}} सारिसकिएको छ र अरु स्वत: सारिने छैन ।',
 'movelogpage' => 'लग सार्ने',
 'movelogpagetext' => 'सबै सारिएका पृष्ठहरुको सूची तल दिइएकोछ।',
-'movesubpage' => '{{PLURAL:$1|à¤\89पपà¥\83षà¥\8dठ|à¤\89पपà¥\83षà¥\8dठहरà¥\81}}',
+'movesubpage' => '{{PLURAL:$1|à¤\89पपà¥\83षà¥\8dठ|à¤\89पपà¥\83षà¥\8dठहरà¥\82}}',
 'movesubpagetext' => 'यस पृष्ठको $1 {{PLURAL:$1|सह-पृष्ठ|सह-पृष्ठहरु}} तल देखाइएको :',
 'movenosubpage' => 'यस पृष्ठका उप पृष्ठहरु छैनन्।',
 'movereason' => 'कारण :',
@@ -2370,8 +2370,8 @@ $1को बन्देजको कारण : "$2" हो',
 'move-leave-redirect' => 'अनुप्रेषण (redirect) छोडिराख्ने',
 
 # Export
-'export' => 'पà¥\83षà¥\8dठहरà¥\81 à¤ªà¤ à¤¾à¤\87ने',
-'exportall' => 'सबà¥\88 à¤ªà¥\83षà¥\8dठहरà¥\81 निर्यात गर्ने',
+'export' => 'पà¥\83षà¥\8dठहरà¥\82 à¤¨à¤¿à¤°à¥\8dयात à¤\97रà¥\8dने',
+'exportall' => 'सबà¥\88 à¤ªà¥\83षà¥\8dठहरà¥\82 निर्यात गर्ने',
 'exportcuronly' => 'हालको संस्करण मात्र थप्ने ,पूरा इतिहास हैन',
 'export-submit' => 'निर्यात',
 'export-addcattext' => 'श्रेणीबाट पृष्ठ थप्ने :',
@@ -2406,7 +2406,7 @@ $1को बन्देजको कारण : "$2" हो',
 'thumbnail_image-missing' => 'फाइल हराएको भान भइरहेछ: $1',
 
 # Special:Import
-'import' => 'पà¥\83षà¥\8dठहरà¥\81 आयात गर्नुहोस्',
+'import' => 'पà¥\83षà¥\8dठहरà¥\82 आयात गर्नुहोस्',
 'importinterwiki' => 'Transwiki आयात',
 'import-interwiki-source' => 'स्रोत विकि/ पृष्ठ :',
 'import-interwiki-history' => 'यो पृष्ठकोलागि सबै इतिहास संशोधनहरु प्रतिलिपि गर्ने',
@@ -2473,7 +2473,7 @@ $1को बन्देजको कारण : "$2" हो',
 'tooltip-ca-unwatch' => 'यो पृष्ठलाई तपाईँको अवलोकनसूचीबाट हटाउनुहोस्',
 'tooltip-search' => '{{SITENAME}} मा खोज्नुहोस्',
 'tooltip-search-go' => 'यदि यो नामको पृष्ठ रहेको छ भने त्यसमा जाने',
-'tooltip-search-fulltext' => 'यà¥\8b à¤ªà¤¾à¤ à¤\95à¥\8b à¤²à¤¾à¤\97ि à¤ªà¥\83षà¥\8dठहरà¥\81 खोज्नुहोस्',
+'tooltip-search-fulltext' => 'यà¥\8b à¤ªà¤¾à¤ à¤\95à¥\8b à¤²à¤¾à¤\97ि à¤ªà¥\83षà¥\8dठहरà¥\82 खोज्नुहोस्',
 'tooltip-p-logo' => 'मुख्य पृष्ठ',
 'tooltip-n-mainpage' => 'मुख्य पृष्ठमा जाने',
 'tooltip-n-mainpage-description' => 'मुख्य पृष्ठमा जानुहो्स्',
@@ -2488,7 +2488,7 @@ $1को बन्देजको कारण : "$2" हो',
 'tooltip-feed-atom' => 'यो पृष्ठको लागि Atom फिड',
 'tooltip-t-contributions' => 'यस प्रयोगकर्ताका योगदानहरूको सूची हेर्नुहोस्',
 'tooltip-t-emailuser' => 'यो प्रयोगकर्तालाई इमेल पठाउनुहोस्',
-'tooltip-t-upload' => 'फाà¤\87ल à¤\89रà¥\8dधà¥\8dवभरण(upload) गर्ने',
+'tooltip-t-upload' => 'फाà¤\87ल à¤\85पलà¥\8bड गर्ने',
 'tooltip-t-specialpages' => 'सबै विशेष पृष्ठहरूको सूची',
 'tooltip-t-print' => 'यो पृष्ठको मुद्रण योग्य संस्करण',
 'tooltip-t-permalink' => 'पृष्ठको यो पुनरावलोकनको लागि स्थाई लिङ्क',
@@ -2511,8 +2511,8 @@ $1को बन्देजको कारण : "$2" हो',
 'tooltip-watchlistedit-normal-submit' => 'शीर्षकहरू हटाउने',
 'tooltip-watchlistedit-raw-submit' => 'निगरानी सूची अध्यावधि गर्ने',
 'tooltip-recreate' => 'मेटिएको भए ता पनि यो पृष्ट पुन:निर्माण गर्नुहोस् ।',
-'tooltip-upload' => 'à¤\89रà¥\8dधà¥\8dवभरण(upload) सुरुगर्ने',
-'tooltip-rollback' => '"पà¥\82रà¥\8dवरà¥\81प" à¤²à¥\87 à¤¯à¥\8b à¤ªà¥\83षà¥\8dठà¤\95à¥\8b à¤¸à¤®à¥\8dपादन(हरà¥\81) à¤\96ारà¥\87à¤\9c à¤\97रà¥\80 à¤ªà¥\83षà¥\8dठलाà¤\88 à¤ªà¤\9bिलà¥\8dलà¥\8b à¤¸à¤®à¥\8dपादनमा à¤\8fà¤\95 à¤\95à¥\8dलिà¤\95मा à¤ªà¥\81रà¥\8dâ\80\8dयाà¤\87 दिन्छ',
+'tooltip-upload' => 'à¤\85पलà¥\8bड सुरुगर्ने',
+'tooltip-rollback' => '"पà¥\82रà¥\8dवरà¥\81प" à¤²à¥\87 à¤¯à¥\8b à¤ªà¥\83षà¥\8dठà¤\95à¥\8b à¤¸à¤®à¥\8dपादन(हरà¥\82) à¤\96ारà¥\87à¤\9c à¤\97रà¥\80 à¤ªà¥\83षà¥\8dठलाà¤\88 à¤\8fà¤\95 à¤\95à¥\8dलिà¤\95मा à¤ªà¤\9bिलà¥\8dलà¥\8b à¤¸à¤®à¥\8dपादनमा à¤ªà¥\81रà¥\8dâ\80\8dयाà¤\87दिन्छ',
 'tooltip-undo' => '"रद्द"ले पछिल्लो सम्पादन खारेज गरी पूर्वावलोकनमा देखाउँछ ।
 यसले सारांशमा कारण राख्न दिनेछ।',
 'tooltip-preferences-save' => 'अभिरुचिहरु संग्रह गर्नुहोस्',
@@ -2897,7 +2897,7 @@ $8',
 'exif-exposureprogram-1' => 'स्वयं',
 'exif-exposureprogram-2' => 'साधारण कार्यक्रम',
 'exif-exposureprogram-3' => 'एपर्चर प्राथमिकता',
-'exif-exposureprogram-4' => 'à¤टर प्राथमिकता',
+'exif-exposureprogram-4' => 'सटर प्राथमिकता',
 'exif-exposureprogram-5' => 'शृजनात्मक कार्यक्रम(गहिराइसँग बाझिएको)',
 'exif-exposureprogram-6' => 'क्रिया कार्यक्रम (तेज शटर गतितर्फ झु्केको)',
 
@@ -3338,12 +3338,12 @@ $5
 * <span class="mw-specialpagerestricted">निषेधित विशेष पृष्ठहरु।</span>
 * <span class="mw-specialpagecached">क्याश गरिएका विशेष पृष्ठहरु (अध्यावधिक नहुन सक्छ)।</span>',
 'specialpages-group-maintenance' => 'मर्मत प्रतिवेदनहरु',
-'specialpages-group-other' => 'à¤\85रà¥\81 à¤µà¤¿à¤¶à¥\87ष à¤ªà¥\83षà¥\8dठहरà¥\81',
+'specialpages-group-other' => 'à¤\85रà¥\82 à¤µà¤¿à¤¶à¥\87ष à¤ªà¥\83षà¥\8dठहरà¥\82',
 'specialpages-group-login' => 'प्रवेशगर्नुहोस/खाता शृजना गर्नुहोस',
 'specialpages-group-changes' => 'भर्खरैका परिवर्तन र लगहरु',
 'specialpages-group-media' => 'मेडिया प्रतिवेदन र उर्ध्वभरणहरु',
 'specialpages-group-users' => 'प्रयोगकर्ता र अधिकारहरु',
-'specialpages-group-highuse' => 'à¤\89à¤\9aà¥\8dà¤\9a à¤ªà¥\8dरयà¥\8bà¤\97 à¤­à¤\8fà¤\95ा à¤ªà¥\83षà¥\8dठहरà¥\81',
+'specialpages-group-highuse' => 'à¤\89à¤\9aà¥\8dà¤\9a à¤ªà¥\8dरयà¥\8bà¤\97 à¤­à¤\8fà¤\95ा à¤ªà¥\83षà¥\8dठहरà¥\82',
 'specialpages-group-pages' => 'पृष्ठहरूको सूची:',
 'specialpages-group-pagetools' => 'पृष्ठ उपकरणहरू',
 'specialpages-group-wiki' => 'विकि डाटा र औजारहरु',
@@ -3351,7 +3351,7 @@ $5
 'specialpages-group-spam' => 'स्पाम उपकरणहरु',
 
 # Special:BlankPage
-'blankpage' => 'à¤\96ालà¥\80 à¤ªà¥\83षà¥\8dठहरà¥\81',
+'blankpage' => 'à¤\96ालà¥\80 à¤ªà¥\83षà¥\8dठहरà¥\82',
 'intentionallyblankpage' => 'यो पृष्ठ जानी जानी खाली राखिएको हो ।',
 
 # External image whitelist
@@ -3378,7 +3378,7 @@ $5
 'tags-hitcount' => '$1 {{PLURAL:$1|परिवर्तन|परिवर्तनहरु}}',
 
 # Special:ComparePages
-'comparepages' => 'पà¥\83षà¥\8dठहरà¥\81 à¤¦à¤¾ज्ने',
+'comparepages' => 'पà¥\83षà¥\8dठहरà¥\82 à¤¦à¤¾à¤\81ज्ने',
 'compare-page1' => 'पृष्ठ 1',
 'compare-page2' => 'पृष्ठ 2',
 'compare-rev1' => 'संशोधन 1',
@@ -3394,7 +3394,7 @@ $5
 'dberr-again' => 'केही समय पर्खिएर पुन: लोड हुन दिनुहोस् ।',
 'dberr-info' => '(डेटाबेस सर्वर $1सित सम्पर्क साध्न सकिंदैन)',
 'dberr-usegoogle' => 'तपाईले अहिले गुगलबाट खोज गर्न प्रयास गर्न सक्नुहुन्छ।',
-'dberr-outofdate' => 'कृपय स्मरणमा राख्नुहोस हाम्रा लेखहरुको सुची जुन उनीहरुले राखेका छन् त्यो अद्यावधिक नहुन सक्छ ।',
+'dberr-outofdate' => 'कृपया स्मरणमा राख्नुहोस् हाम्रा लेखहरूको सूची जुन उनीहरूले राखेका छन् त्यो अद्यावधिक नहुन सक्छ ।',
 'dberr-cachederror' => 'यो अनुरोध गरिएको पृष्ठको क्याशमा रहेका प्रतिलिपी हो , र अद्यावधिक नहुन सक्छ ।',
 
 # HTML forms
index 5f29658..3378c4b 100644 (file)
@@ -8,6 +8,7 @@
  * @file
  *
  * @author Annabel
+ * @author Arent
  * @author AvatarTeam
  * @author B4bol4t
  * @author Basvb
@@ -37,6 +38,7 @@
  * @author Mwpnl
  * @author Naudefj
  * @author Niels
+ * @author Niknetniko
  * @author Paul B
  * @author Romaine
  * @author SPQRobin
@@ -387,7 +389,6 @@ $messages = array(
 'tog-numberheadings' => 'Koppen automatisch nummeren',
 'tog-showtoolbar' => 'Bewerkingswerkbalk weergeven',
 'tog-editondblclick' => 'Dubbelklikken voor bewerken',
-'tog-editsection' => 'Bewerken van deelpagina’s mogelijk maken via [bewerken]-koppelingen',
 'tog-editsectiononrightclick' => 'Bewerken van deelpagina’s mogelijk maken met een rechtermuisklik op een tussenkop',
 'tog-showtoc' => 'Inhoudsopgave weergeven (voor pagina’s met minstens 3 tussenkoppen)',
 'tog-rememberpassword' => 'Aanmeldgegevens onthouden (maximaal $1 {{PLURAL:$1|dag|dagen}})',
@@ -956,6 +957,8 @@ Voer een nieuw wachtwoord in om het aanmelden te voltooien:',
 'retypenew' => 'Herhaling nieuwe wachtwoord:',
 'resetpass_submit' => 'Wachtwoord instellen en aanmelden',
 'changepassword-success' => 'Uw wachtwoord is gewijzigd.',
+'changepassword-throttled' => 'U heeft recentelijk te veel mislukte aanmeldpogingen gedaan.
+Wacht alstublieft $1 voordat u het opnieuw probeert.',
 'resetpass_forbidden' => 'Wachtwoorden kunnen niet gewijzigd worden',
 'resetpass-no-info' => 'U dient aangemeld zijn voordat u deze pagina kunt gebruiken.',
 'resetpass-submit-loggedin' => 'Wachtwoord wijzigen',
@@ -1006,6 +1009,8 @@ Tijdelijk wachtwoord: $2',
 'changeemail-password' => 'Uw wachtwoord voor {{SITENAME}}:',
 'changeemail-submit' => 'E-mailadres wijzigen',
 'changeemail-cancel' => 'Annuleren',
+'changeemail-throttled' => 'U heeft recentelijk te veel mislukte aanmeldpogingen gedaan.
+Wacht alstublieft $1 voordat u het opnieuw probeert.',
 
 # Special:ResetTokens
 'resettokens' => 'Tokens opnieuw instellen',
@@ -1236,6 +1241,8 @@ Deze bestaat al.',
 'content-not-allowed-here' => 'De inhoud "$1" is niet toegestaan op pagina [[$2]].',
 'editwarning-warning' => 'Als u deze pagina verlaat verliest u mogelijk wijzigingen die u hebt gemaakt.
 Als u bent aangemeld, kunt u deze waarschuwing uitschakelen in het tabblad "{{int:prefs-editing}}" in uw voorkeuren.',
+'editpage-notsupportedcontentformat-title' => 'Inhoudsformaat niet ondersteund',
+'editpage-notsupportedcontentformat-text' => 'Het inhoudsformaat $1 wordt niet ondersteund door het inhoudsmodel $2.',
 
 # Content models
 'content-model-wikitext' => 'wikitekst',
@@ -1490,6 +1497,7 @@ Probeer een andere zoekopdracht.',
 'search-result-score' => 'Relevantie: $1%',
 'search-redirect' => '(doorverwijzing $1)',
 'search-section' => '(subkop $1)',
+'search-file-match' => '(komt overeen met de inhoud van het bestand)',
 'search-suggest' => 'Bedoelde u: $1',
 'search-interwiki-caption' => 'Zusterprojecten',
 'search-interwiki-default' => '$1 resultaten:',
@@ -2626,7 +2634,7 @@ Het verwijderen van dit soort pagina's is met rechten beperkt om het per ongeluk
 'delete-warning-toobig' => 'Deze pagina heeft een lange bewerkingsgeschiedenis, meer dan $1 {{PLURAL:$1|versie|versies}}.
 Het verwijderen van deze pagina kan de werking van de database van {{SITENAME}} verstoren.
 Wees voorzichtig.',
-'deleting-backlinks-warning' => "'''Waarschuwing:''' andere pagina's verwijzen naar de pagina die u wilt verwijderen.",
+'deleting-backlinks-warning' => "'''Waarschuwing:''' andere pagina's gebruiken of verwijzen naar de pagina die u wilt verwijderen.",
 
 # Rollback
 'rollback' => 'Wijzigingen ongedaan maken',
@@ -2931,7 +2939,7 @@ Zie ook de [[Special:BlockList|blokkadelijst]] voor de op dit moment actieve blo
 'range_block_disabled' => 'De mogelijkheid voor beheerders om een groep IP-adressen te blokkeren is uitgeschakeld.',
 'ipb_expiry_invalid' => 'Ongeldige duur.',
 'ipb_expiry_temp' => 'Blokkades voor verborgen gebruikers moeten permanent zijn.',
-'ipb_hide_invalid' => 'Het is niet mogelijk deze gebruiker te verbergen; mogelijk heeft deze te veel bewerkingen gemaakt.',
+'ipb_hide_invalid' => 'Het is niet mogelijk deze gebruiker te verbergen;  deze heeft meer dan {{PLURAL:$1|een bewerking|$1 bewerkingen}} gedaan.',
 'ipb_already_blocked' => '"$1" is al geblokkeerd',
 'ipb-needreblock' => '$1 is al geblokkeerd.
 Wilt u de instellingen wijzigen?',
@@ -4378,4 +4386,6 @@ Vrijwel alle tekst tussen dubbele accolades wordt gesubstitueerd.',
 'expand_templates_generate_rawhtml' => 'Ruwe HTML weergeven',
 'expand_templates_preview' => 'Voorvertoning',
 
+# Unknown messages
+'uploadinvalidxml' => 'De XML in het geüploade bestand kon niet worden geparst.',
 );
index fc692ab..9fe0b93 100644 (file)
@@ -330,7 +330,6 @@ $messages = array(
 'tog-numberheadings' => 'Vis nummererte overskrifter',
 'tog-showtoolbar' => 'Vis endringsverktøyline',
 'tog-editondblclick' => 'Endre sider med dobbeltklikk',
-'tog-editsection' => 'Endre avsnitt ved hjelp av [endre]-lenkje',
 'tog-editsectiononrightclick' => 'Endre avsnitt ved å høgreklikke på avsnittsoverskrifter',
 'tog-showtoc' => 'Vis innhaldsliste (for sider med meir enn tre bolkar)',
 'tog-rememberpassword' => 'Hugs innlogginga mi med denne nettlesaren (for høgst {{PLURAL:$1|éin dag|$1 dagar}})',
index fa0940b..53ce978 100644 (file)
@@ -301,7 +301,6 @@ $messages = array(
 'tog-numberheadings' => 'Numerotar automaticament los títols',
 'tog-showtoolbar' => 'Far veire la barra de menú',
 'tog-editondblclick' => 'Modificar las paginas amb un clic doble',
-'tog-editsection' => 'Modificar una seccion via los ligams [modificar]',
 'tog-editsectiononrightclick' => 'Modificar una seccion en fasent un clic drech suls títols de seccion',
 'tog-showtoc' => "Afichar l'ensenhador (per las paginas de mai de 3 seccions)",
 'tog-rememberpassword' => 'Se remembrar de mon senhal sus aqueste ordinator (al mai $1 {{PLURAL:$1|jorn|jorns}})',
index 060dd3d..9e74549 100644 (file)
@@ -264,12 +264,11 @@ $messages = array(
 'tog-hidepatrolled' => 'ନଗଦ ବଦଳରେ ଥିବା ଜଗାହୋଇଥିବା ବଦଳ ସବୁକୁ ଲୁଚାଇବେ',
 'tog-newpageshidepatrolled' => 'ନୂଆ ପୃଷ୍ଠାତାଲିକାରୁ ଜଗାହୋଇଥିବା ବଦଳସବୁକୁ ଲୁଚାଇବେ',
 'tog-extendwatchlist' => 'କେବଳ ନଗଦ ନୁହେଁ, ସବୁଯାକ ବଦଳକୁ ଦେଖାଇବା ନିମନ୍ତେ ଦେଖଣାତାଲିକାକୁ ବଢ଼ାଇବେ',
-'tog-usenewrc' => 'ନଗଦ ବଦଳରେ ପୃଷ୍ଠା ଅନୁଯାୟୀ ଗୋଷ୍ଠୀ ବଦଳ ଏବଂ ଦେଖଣା (ଜାଭାସ୍କ୍ରିପ୍ଟ ଲୋଡ଼ା)',
+'tog-usenewrc' => 'ନଗଦ ବଦଳରେ ପୃଷ୍ଠା ଅନୁଯାୟୀ ଗୋଷ୍ଠୀ ବଦଳ ଏବଂ ଦେଖଣା',
 'tog-numberheadings' => 'ଆପେଆପେ-ସଂଖ୍ୟାର ନାମଗୁଡ଼ିକ',
-'tog-showtoolbar' => 'ସମ୍ପାଦନା ଟୁଲବାର ଦେଖାଇବେ (ଜାଭାସ୍କ୍ରିପ୍ଟ ଲୋଡ଼ା)',
-'tog-editondblclick' => 'ଦୁଇଥର କ୍ଲିକରେ ପୃଷ୍ଠା ବଦଳାଇବେ (ଜାଭାସ୍କ୍ରିପ୍ଟ ଲୋଡ଼ା)',
-'tog-editsection' => '[ବଦଳାଇବେ] ଲିଙ୍କରେ ବିଭାଗର ସମ୍ପାଦନାକୁ ସଚଳ କରିବେ',
-'tog-editsectiononrightclick' => 'ବିଭାଗ ନାମରେ ଡାହାଣ କ୍ଲିକ କରି ବିଭାଗ ସମ୍ପାଦନାକୁ ସଚଳ କରିବେ (ଜାଭାସ୍କ୍ରିପ୍ଟ ଲୋଡ଼ା)',
+'tog-showtoolbar' => 'ସମ୍ପାଦନା ଟୁଲବାର ଦେଖାଇବେ',
+'tog-editondblclick' => 'ଦୁଇଥର କ୍ଲିକରେ ପୃଷ୍ଠା ବଦଳାଇବେ',
+'tog-editsectiononrightclick' => 'ବିଭାଗ ନାମରେ ଡାହାଣ କ୍ଲିକ କରି ବିଭାଗ ସମ୍ପାଦନାକୁ ସଚଳ କରିବେ',
 'tog-showtoc' => 'ସୂଚୀପତ୍ର ଦେଖାଇବେ (୩ରୁ ଅଧିକ ମୁଖ୍ୟ ନାମ ଥିଲେ)',
 'tog-rememberpassword' => 'ଏହି ବ୍ରାଉଜରରେ (ସର୍ବାଧିକ $1 {{PLURAL:$1|day|ଦିନ}}) ପାଇଁ ମୋ ଲଗ-ଇନ ମନେରଖିଥିବେ',
 'tog-watchcreations' => 'ମୋ ତିଆରି ପୃଷ୍ଠାସବୁକୁ ଏବଂ ମୋ ଅପଲୋଡ଼ଗୁଡ଼ିକୁ ମୋର ଦେଖଣାତାଲିକାରେ ଯୋଡ଼ନ୍ତୁ',
@@ -286,7 +285,7 @@ $messages = array(
 'tog-shownumberswatching' => 'ଦେଖୁଥିବା ବ୍ୟବହାରକାରୀଙ୍କ ସଂଖ୍ୟା ଦେଖାନ୍ତୁ',
 'tog-oldsig' => 'ଏବେକାର ଦସ୍ତଖତ:',
 'tog-fancysig' => 'ଦସ୍ତଖତକୁ ଉଇକିଟେକ୍ସଟ ଭାବରେ ଗଣିବେ (ଆପେଆପେ ଥିବା ଲିଙ୍କ ବିନା)',
-'tog-uselivepreview' => 'ସାଥà­\87 à¬¸à¬¾à¬¥à­\87 à¬\9aାଲିଥିବା à¬¦à­\87à¬\96ଣା à¬¬à­\8dà­\9fବହାର à¬\95ରିବà­\87 (à¬\9cାଭାସà­\8dà¬\95à­\8dରିପà­\8dà¬\9f à¬²à­\8bଡ଼ା)',
+'tog-uselivepreview' => 'ସାଥà­\87 à¬¸à¬¾à¬¥à­\87 à¬\9aାଲିଥିବା à¬¦à­\87à¬\96ଣା à¬¬à­\8dà­\9fବହାର à¬\95ରିବà­\87 (ପରà­\80à¬\95à­\8dଷାରà­\87 à¬\85à¬\9bି)',
 'tog-forceeditsummary' => 'ଖାଲି ସମ୍ପାଦନା ସାରକଥାକୁ ଯିବା ବେଳେ ମୋତେ ଜଣାଇବେ',
 'tog-watchlisthideown' => 'ମୋ ଦେଖଣା ତାଲିକାରେ ମୋ ନିଜର ସମ୍ପାଦନାଗୁଡ଼ିକ ଲୁଚାଇବେ',
 'tog-watchlisthidebots' => 'ଦେଖଣା ତାଲିକାରେ ବଟ ଦେଇ ବଦଳ ଗୁଡ଼ିକ ଲୁଚାଇବେ',
@@ -299,6 +298,7 @@ $messages = array(
 'tog-showhiddencats' => 'ଲୁଚାଯାଇଥିବା ଶ୍ରେଣୀଗୁଡ଼ିକ ଦେଖାଇବେ',
 'tog-norollbackdiff' => 'ରୋଲବ୍ୟାକ କଲାପରେ ତୁଳନା ଦେଖାନ୍ତୁ ନାହିଁ',
 'tog-useeditwarning' => 'ଯେତେବେଳେ ମୁଁ ଗୋଟିଏ ସାଇତାଯାଇନଥିବା ପୃଷ୍ଠାକୁ ବନ୍ଦ କରିଦିଏ ମୋତେ ଚେତାବନୀ ଦେବେ',
+'tog-prefershttps' => 'ଲଗ ଇନ କଲାପରେ ସର୍ବଦା ସୁରକ୍ଷିତ କନେକ୍ସନ ବ୍ୟବହାର କରିବେ',
 
 'underline-always' => 'ସବୁବେଳେ',
 'underline-never' => 'କେବେନୁହେଁ',
@@ -399,7 +399,7 @@ $messages = array(
 'newwindow' => '(ଏହା ନୂଆ ଉଇଣ୍ଡୋରେ ଖୋଲିବ)',
 'cancel' => 'ନାକଚ',
 'moredotdotdot' => 'ଅଧିକ...',
-'morenotlisted' => 'à¬\85ଧିà¬\95 à¬\95ିà¬\9bି à¬¤à¬¾à¬²à¬¿à¬\95ାରà­\87 à¬¨à¬¾à¬¹à¬¿à¬\81...',
+'morenotlisted' => 'à¬\8fହା à¬ªà­\81ରା à¬¹à­\8bà¬\87 à¬¨à¬¾à¬¹à¬¿à¬\81',
 'mypage' => 'ପୃଷ୍ଠା',
 'mytalk' => 'ଆଲୋଚନା',
 'anontalk' => 'ଏହି IP address ଉପରେ ଆଲୋଚନା',
@@ -454,6 +454,7 @@ $messages = array(
 'create-this-page' => 'ଏହି ପୃଷ୍ଠା ତିଆରି କରିବେ',
 'delete' => 'ଲିଭାଇବେ',
 'deletethispage' => 'ଏହି ପୃଷ୍ଠାଟି ଲିଭାଇବେ',
+'undeletethispage' => 'ଏହି ପୃଷ୍ଠାଟିକୁ ଲିଭାଇବେ ନାହିଁ',
 'undelete_short' => '{{PLURAL:$1|ଗୋଟିଏ ବଦଳ|$1ଟି ବଦଳ}} ଯାହା ଲିଭାସରିଛି ତାହାକୁ ପଛକୁ ଫେରାଇଦେବା',
 'viewdeleted_short' => '{{PLURAL:$1|ଗୋଟିଏ ଲିଭାଯାଇଥିବା ବଦଳ|$1ଟି ଲିଭାଯାଇଥିବା ବଦଳ}} ଦେଖାଇବେ',
 'protect' => 'କିଳିବେ',
@@ -942,10 +943,10 @@ $1 ଦ୍ଵାରା ପ୍ରତିରୋଧ କରାଯାଇଛି
 'newarticletext' => "ଆପଣ ଖୋଲିଥିବା ଲିଙ୍କଟିରେ ଏଯାଏଁ କିଛିବି ପୃଷ୍ଠା ନାହିଁ ।
 ଏହି ପୃଷ୍ଠାଟିକୁ ତିଆରି କରିବା ପାଇଁ ତଳ ବାକ୍ସରେ ଟାଇପ କରନ୍ତୁ (ଅଧିକ ଜାଣିବା ପାଇଁ [[{{MediaWiki:Helppage}}|ସାହାଯ୍ୟ ପୃଷ୍ଠା]] ଦେଖନ୍ତୁ) ।
 ଯଦି ଆପଣ ଏଠାକୁ ଭୁଲରେ ଆସିଯାଇଥାନ୍ତି ତେବେ ଆପଣଙ୍କ ବ୍ରାଉଜରର '''Back''' ପତିଟି ଦବାନ୍ତୁ ।",
-'anontalkpagetext' => "----''ଏହା ଏକ IP ଖାତା ଖୋଲିନଥିବା ବା ଖାତା ବ୍ୟବହାର କରିନଥିବା ଜଣେ ବେନାମି ସଭ୍ୟଙ୍କର ଆଲୋଚନା ପୃଷ୍ଠା ।
-ତà­\87ଣà­\81 à¬\86ମà­\8dଭà­\87 à¬¸à¬\82à¬\96à­\8dà­\9fା à¬¦à­\87à¬\87 à¬¸à­\82à¬\9aà­\80ତ IP à¬ à¬¿à¬\95ଣା à¬¦à­\87à¬\87 à¬¤à¬¾à¬¹à¬¾à¬\99à­\8dà¬\95à­\81 à¬\9cାଣିବା à¥¤
-ଏହି ପ୍ରକାରର IP ଠିକଣା ବହୁ ସଭ୍ୟଙ୍କ ଦେଇ ବଣ୍ଟା ବି ଯାଇପାରେ ।
-ଯଦି à¬\86ପଣ à¬\9cଣà­\87 à¬\85à¬\9cଣା à¬¸à¬­à­\8dà­\9f à¬\93 à¬­à¬¾à¬¬à­\81à¬\9bନà­\8dତି à¬\87à¬\86ଡà­\81 à¬¸à¬¿à¬\86ଡà­\81 à¬®à¬¤à¬¾à¬®à¬¤ à¬¸à¬¬à­\81 à¬\86ପଣà¬\99à­\8dà¬\95 à¬\89ପରà­\87 à¬¦à¬¿à¬\86ଯାà¬\87à¬\9bି à¬¤à­\87ବà­\87 à¬¦à­\9fାà¬\95ରି [[Special:UserLogin/signup|ନà­\82à¬\86 à¬\96ାତାà¬\9fିà¬\8f à¬\96à­\8bଲନà­\8dତà­\81]] à¬\95ିମà­\8dବା [[Special:UserLogin|à¬\86à¬\97ରà­\81 à¬¥à¬¿à¬¬à¬¾ à¬\96ାତାରà­\87 à¬²à¬\97 à¬\87ନ à¬\95ରନà­\8dତà­\81]] à¬¯à¬¾à¬¹à¬¾ à¬¬à­\87ନାମି à¬¸à¬­à­\8dà­\9fà¬\99à­\8dà¬\95à­\81 à¬¨à­\87à¬\87 à¬\89ପà­\81à¬\9cିଥିବା à¬¦à­\8dଵନà­\8dଦର à¬¸à¬®à¬¾à¬§à¬¾à¬¨ à¬\95ରିବ à¥¤''",
+'anontalkpagetext' => "----''ଏହା ଏକ ଖାତା ଖୋଲିନଥିବା ବା ଖାତା ବ୍ୟବହାର କରିନଥିବା ଜଣେ ବେନାମି ସଭ୍ୟଙ୍କର ଆଲୋଚନା ପୃଷ୍ଠା ।''
+ତେଣୁ ଆମ୍ଭେ ସଂଖ୍ୟା ଦେଇ ସୂଚୀତ IP ଠିକଣା ଦେଇ ତାଙ୍କୁ ଜାଣିବା ।
+ଏହି ପ୍ରକାରର ଗୋଟିଏ IP ଠିକଣା ବହୁ ସଭ୍ୟଙ୍କ ଦେଇ ବ୍ୟବହାର କରାଯାଇପାରେ । 
+ଯଦି à¬\86ପଣ à¬\9cଣà­\87 à¬\85à¬\9cଣା à¬¸à¬­à­\8dà­\9f à¬\93 à¬­à¬¾à¬¬à­\81à¬\9bନà­\8dତି à¬\87à¬\86ଡà­\81 à¬¸à¬¿à¬\86ଡà­\81 à¬®à¬¤à¬¾à¬®à¬¤ à¬¸à¬¬à­\81 à¬\86ପଣà¬\99à­\8dà¬\95 à¬ªà¬¾à¬\87à¬\81 à¬¦à¬¿à¬\86ଯାà¬\87à¬\9bି à¬¤à­\87ବà­\87 à¬¦à­\9fାà¬\95ରି [[Special:UserLogin/signup|ନà­\82à¬\86 à¬\96ାତାà¬\9fିà¬\8f à¬\96à­\8bଲନà­\8dତà­\81]] à¬\95ିମà­\8dବା [[Special:UserLogin|à¬\86à¬\97ରà­\81 à¬¥à¬¿à¬¬à¬¾ à¬\96ାତାରà­\87 à¬²à¬\97 à¬\87ନ à¬\95ରନà­\8dତà­\81]] à¬¯à¬¾à¬¹à¬¾ à¬¬à­\87ନାମି à¬¸à¬­à­\8dà­\9fà¬\99à­\8dà¬\95à­\81 à¬¨à­\87à¬\87 à¬\89ପà­\81à¬\9cିଥିବା à¬¦à­\8dଵନà­\8dଦର à¬¸à¬®à¬¾à¬§à¬¾à¬¨ à¬\95ରିବ à¥¤",
 'noarticletext' => 'ଏହି ପୃଷ୍ଠାଟିରେ କିଛି ବି ଲେଖା ନାହିଁ ।
 ଆପଣ [[Special:Search/{{PAGENAME}}|ଏହି ଲେଖାଟିର ନାଆଁ]] ବାକି ପୃଷ୍ଠାମାନଙ୍କରେ ଖୋଜି ପାରନ୍ତି,
 <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}}ରେ ଯୋଡ଼ାଯାଇଥିବା ବାକି ପୃଷ୍ଠାସବୁକୁ ଖୋଜି ପାରନ୍ତି],
@@ -1368,7 +1369,7 @@ $1",
 'prefs-email' => 'ଇ-ମେଲ ବିକଳ୍ପମାନ',
 'prefs-rendering' => 'ଦେଖଣା',
 'saveprefs' => 'ସାଇତିବେ [Save]',
-'restoreprefs' => 'ଆପେଆପେ ଥିବା ମୂଳ ସଜାଣିକୁ ଫେରିଯିବେ',
+'restoreprefs' => '(ସମସ୍ତ ସ୍ଥାନରେ) ଆରମ୍ଭରୁ ଥିବା ମୂଳ ସଜାଣିକୁ ଫେରିଯିବେ',
 'prefs-editing' => 'ସମ୍ପାଦନା',
 'rows' => 'ଧାଡ଼ି:',
 'columns' => 'ସ୍ତମ୍ଭସବୁ:',
@@ -2235,8 +2236,7 @@ URLଟି ଠିକ ଅଚିକି କି ନାଁ ଓ ସାଇଟଟି ସ
 'emailuser-title-target' => '{{GENDER:$1|user}}କୁ ଇ-ମେଲ କରନ୍ତୁ',
 'emailuser-title-notarget' => 'ବ୍ୟବହାରକାରୀ କୁ ଇ-ମେଲ',
 'emailpage' => 'ଇ-ମେଲ ବ୍ୟବହାରକାରୀ',
-'emailpagetext' => 'ଥିବା ଫର୍ମ ବ୍ୟବହାର କରି ଆପଣ ଏହି {{GENDER:$1|user}} ଇ-ମେଲ କରିପାରିବେ ।
-[[Special:Preferences|ଆପଣଙ୍କ ପସନ୍ଦ]]ରେ ଥିବା ଇ-ମେଲ ଠିକଣା ପ୍ରେରକ ଭାବରେ ଦେଖାଯିବ, ତେଣୁ ଚିଠି ପାଇଥିବା ସଭ୍ୟ ଆପଣଙ୍କୁ ସିଧା ସଳଖ ଉତ୍ତର ଦେଇପାରିବ ।',
+'emailpagetext' => 'ଆପଣ ତଳେ ଥିବା ଫର୍ମ ବ୍ୟବହାର କରି ଏହି {{GENDER:$1|ସଭ୍ୟ}}ଙ୍କୁ ଇମେଲ କରିପାରିବେ । [[Special:Preferences|ଆପଣଙ୍କ ପସନ୍ଦ]]ରେ ଥିବା ଇମେଲ ଠିକଣା "ପ୍ରେରକ" ଭାବରେ ଦେଖାଯିବ, ତେଣୁ ଇମେଲ ପାଇଥିବା ସଭ୍ୟ ଆପଣଙ୍କୁ ସିଧା ସଳଖ ଉତ୍ତର ଦେଇପାରିବେ ।',
 'usermailererror' => 'ମେଲ ଭିତରେ କିଛି ଅସୁବିଧା ଅଛି ବୋଲି ଜାଣିବାକୁ ମିଳିଲା:',
 'defemailsubject' => '{{SITENAME}} "$1" ସଭ୍ୟଙ୍କ ଠାରୁ ଇ-ମେଲ କରିବେ',
 'usermaildisabled' => 'ବ୍ୟବହାରକାରୀଙ୍କ ଈ-ମେଲ ଅଚଳ କରାଗଲା',
index 1add0e9..cd8138c 100644 (file)
@@ -663,7 +663,7 @@ $2',
 'passwordtooshort' => 'Паролтæ хъуамæ уой уæддæр {{PLURAL:$1|1 дамгъæйы|$1 дамгъæйы}} дæргъæн.',
 'password-name-match' => 'Дæ парол ма хъуамæ уа дæ фæсномыгы хуызæн.',
 'password-login-forbidden' => 'Ацы фæсномыг æмæ паролæй нæй гæнæн архайын.',
-'mailmypassword' => 'РаÑ\80виÑ\82 Ð¼Ã¦Ð¼ Ð½Ð¾Ð³ пароль',
+'mailmypassword' => 'Ð\91аив пароль',
 'passwordremindertitle' => 'Ног рæстæгмæ пароль {{grammar:dative|{{SITENAME}}}}',
 'passwordremindertext' => 'Чидæр (æвæццæгæн ды, $1 IP адрисæй) æрдомтта ног парол {{grammar:dative|{{SITENAME}}}} ($4). "$2" архайæгæн арæзт æрцыд рæстæгмæ парол. Парол у "$3". Кæд уый ды уыдтæ, уæд дын ныр хъæудзæн бахизын æмæ равзарын ног парол.
 Дæ рæстæгмæ парол ма кусдзæнис {{PLURAL:$5|иу бон|$5 боны}}.
@@ -1196,7 +1196,7 @@ ASCII нысæнттæм чи нæ хауы, уыдон ивыны бынаты
 'rclistfrom' => 'Равдисын ивдтытæ амæй фæстæ: $1',
 'rcshowhideminor' => '$1 чысыл ивдтытæ',
 'rcshowhidebots' => '$1 роботты',
-'rcshowhideliu' => '$1, йæхи чи бацамыдта, уыцы архайджыты',
+'rcshowhideliu' => '$1 регистрацигонд архайæджы',
 'rcshowhideanons' => '$1 æнæном архайджыты',
 'rcshowhidepatr' => '$1 бæрæггонд ивдтæ',
 'rcshowhidemine' => '$1 мæ ивдтытæ',
@@ -1211,7 +1211,7 @@ $3',
 'boteditletter' => 'б',
 'rc_categories_any' => 'Кæцы фæнды',
 'newsectionsummary' => '/* $1 */ ног хай',
-'rc-enhanced-expand' => 'Лæмбынæг информаци равдисын (домы JavaScript)',
+'rc-enhanced-expand' => 'Лæмбынæг информаци равдисын',
 'rc-enhanced-hide' => 'Айсын лæмбынæг информаци',
 'rc-old-title' => 'фыццаг арæзт æрцыд куыд "$1"',
 
@@ -1645,7 +1645,7 @@ $3',
 'file-info-size' => '$1 × $2 пикселы, файлы уæз: $3, MIME тип: $4',
 'file-nohires' => 'Нæй ын стырдæр фæлтæр .',
 'svg-long-desc' => 'SVG файл, номиналон $1 × $2 пикселы, файлы бæрц: $3',
-'show-big-image' => 'Æнæхъæнæй',
+'show-big-image' => 'Оригиналы файл',
 
 # Special:NewFiles
 'newimages' => 'Ног нывты галерей',
index 6d52eaf..36de77f 100644 (file)
@@ -140,9 +140,9 @@ $messages = array(
 'category-empty' => '"Die Sachgrubb hodd kä Said odda Medje."',
 'hidden-categories' => '{{PLURAL:$1|Vaschdegldi Sachgrubb|Vaschdeglde Sachgrubbe}}',
 'hidden-category-category' => 'Verschdegelde Grubbe',
-'category-subcat-count' => '{{PLURAL:$2|Die Sachgrubb hod die Unnagrubb.|Die Sachgrubb hod {{PLURAL:$1|Unnagrubb|$1 Unnagrubbe}}, vun gsomd $2.}}',
+'category-subcat-count' => '{{PLURAL:$2|Die Sachgrubb hodd die Unnagrubb.|Die Sachgrubb hodd {{PLURAL:$1|Unnagrubb|$1 Unnagrubbe}}, vun gsomd $2.}}',
 'category-subcat-count-limited' => 'Die Sachgrubb hod die {{PLURAL:$1|Unagrubb|$1 Unagrubbe}}.',
-'category-article-count' => '{{PLURAL:$2|Indɐ Sachgrubb hodds die Said.|Die {{PLURAL:$1|Said|$1 Saide}} gibbds inde Sachgrubb, vun gsomd $2.}}',
+'category-article-count' => '{{PLURAL:$2|Die Sachgrubb hodd bloß die Said.|Die {{PLURAL:$1|Said|$1 Saide}} gibbds inde Sachgrubb, vun gsomd $2.}}',
 'category-article-count-limited' => 'Die {{PLURAL:$1|Said|$1 Saide}} hodds inde Sachgrubb.',
 'category-file-count' => "{{PLURAL:$2|Die Sachgrubb hodd ä Said.|Die {{PLURAL:$1|Said isch änni vun $2 Saide:|S'werren $1 vun gsomd $2 Saide gzaischd:}}}}",
 'category-file-count-limited' => 'Die {{PLURAL:$1|Dadai|$1 Dadije}} hodds inde Sachgrubb.',
@@ -217,7 +217,7 @@ $messages = array(
 'articlepage' => 'Inhald õgugge',
 'talk' => 'Dischbediere',
 'views' => 'Uffruf',
-'toolbox' => 'Wergzaischkischd',
+'toolbox' => 'Wergzaisch',
 'userpage' => 'Middawaidasaid õgugge',
 'projectpage' => 'Brojegdsaid õgugge',
 'imagepage' => 'Dadaisaid õgugge',
@@ -348,7 +348,7 @@ S konn soi, dasses ä odda mea Zaische drin hodd, wu im Tidl vunde Said nedd gbr
 'yourname' => 'Middawaidanõme:',
 'yourpassword' => 'Kennword:',
 'yourpasswordagain' => 'Kennword nomol oigewe:',
-'remembermypassword' => 'Moi Kennword uffm Rechna merge (hegschdns fa $1 {{PLURAL:$1|Daach|Daach}})',
+'remembermypassword' => 'Moi Kennword uffm Brausa merge (hegschdns fa $1 {{PLURAL:$1|Daach|Daach}})',
 'login' => 'Õmelde',
 'nav-login-createaccount' => 'Õmelde / Kondo õleesche',
 'loginprompt' => 'Cookies mugschd fa {{SITENAME}} schun õhawe.',
@@ -374,7 +374,7 @@ Nemmen onnare.',
 'passwordtooshort' => 'Kennword muss {{PLURAL:$1|1 Zaische|$1 Zaische}} hawe.',
 'password-name-match' => 'Doi Kennword deaf nedd so heese wie du.',
 'password-login-forbidden' => 'De Nõme uns Kennword sinn fabode.',
-'mailmypassword' => 'Naijs Kennword iwwa E-Mail schigge',
+'mailmypassword' => 'Kennword zriggsedze',
 'accountcreated' => 'Kondo õgleeschd',
 'login-abort-generic' => 'Hodd nedd gklabbd - Abgbroche',
 'loginlanguagelabel' => 'Schbrooch: $1',
@@ -500,8 +500,8 @@ Ealaidarung: '''({{int:cur}})''' = Unnaschied zu jezd,
 '''({{int:last}})''' = Unnaschied zude vorischi Ausgab, '''{{int:minoreditletter}}''' = gleni Ännarung.",
 'history-fieldset-title' => 'Gugg die Gschischd',
 'history-show-deleted' => 'Bloß gleschdi Saide zaische',
-'histfirst' => 'Ã\84ldschde',
-'histlast' => 'Naijschde',
+'histfirst' => 'äldschde',
+'histlast' => 'naijschde',
 'historyempty' => '(lea)',
 
 # Revision feed
@@ -542,6 +542,7 @@ Ealaidarung: '''({{int:cur}})''' = Unnaschied zu jezd,
 'compareselectedversions' => 'Ausgawe midnonna vaglaische',
 'showhideselectedversions' => 'Zaisch/Vaschdeggl gwehldi Ausgawe',
 'editundo' => 'zriggnemme',
+'diff-multi' => '({{PLURAL:$1|Ä dzwische lischndi Ännarung|$1 dzwische lischende Ännarunge}} by {{PLURAL:$2|än Middawaida|$2 Middawaida}} nedd gzaischd)',
 
 # Search results
 'searchresults' => 'Eagewnis nochgugge',
@@ -549,8 +550,8 @@ Ealaidarung: '''({{int:cur}})''' = Unnaschied zu jezd,
 'notextmatches' => 'Kä Iwwaoinschdimmunge midm Tegschd',
 'prevn' => 'ledschda {{PLURAL:$1|$1}}',
 'nextn' => 'negschd {{PLURAL:$1|$1}}',
-'prevn-title' => 'Frijari $1 {{PLURAL:$1|Eagewnis|Eagewnis}}',
-'nextn-title' => 'Negschdi $1 {{PLURAL:$1|Eagewnis|Eagewnis}}',
+'prevn-title' => 'Frijari $1 {{PLURAL:$1|Eagewniss|Eagewnisse}}',
+'nextn-title' => 'Negschdi $1 {{PLURAL:$1|Eagewniss|Eagewnisse}}',
 'shown-title' => 'Zaisch $1 {{PLURAL:$1|Eagewnis}} bro Said',
 'viewprevnext' => 'Gugg ($1 {{int:pipe-separator}} $2) ($3)',
 'searchmenu-exists' => "'''Dohods ä Said \"[[:\$1]]\".'''",
@@ -600,7 +601,6 @@ Ealaidarung: '''({{int:cur}})''' = Unnaschied zu jezd,
 'rows' => 'Zaile',
 'columns' => 'Schbalde',
 'searchresultshead' => 'Nochgugge',
-'resultsperpage' => 'Dreffa bro Said',
 'stub-threshold-disabled' => 'Abgschdeld',
 'guesstimezone' => 'Aus em Browser iwwernemme',
 'timezoneregion-africa' => 'Afrika',
@@ -684,7 +684,7 @@ Doi Address werd ned gzaischd, wõnse midda babbln.',
 'rclistfrom' => 'Zaisch die ledschde Ännarunge ab $1',
 'rcshowhideminor' => 'Glenni Ännarunge $1',
 'rcshowhidebots' => 'Bots $1',
-'rcshowhideliu' => 'Õgmelda Middawaida $1',
+'rcshowhideliu' => 'Õgmelde Middawaida $1',
 'rcshowhideanons' => 'Ned õgmelda Middawaida $1',
 'rcshowhidepatr' => '$1 iwabriefde Ännarunge',
 'rcshowhidemine' => 'Moi Beawaidunge $1',
@@ -698,7 +698,7 @@ Doi Address werd ned gzaischd, wõnse midda babbln.',
 'boteditletter' => 'B',
 'rc_categories' => 'Oigschrengd uff Sachgrubbe (abgdeeld middm "|")',
 'rc_categories_any' => 'Ebbes',
-'rc-enhanced-expand' => 'Änzlhaide zaische (dozu brauchds JavaScript)',
+'rc-enhanced-expand' => 'Änzlhaide zaische',
 'rc-enhanced-hide' => 'Õgawe vaschdeggle',
 
 # Recent changes linked
@@ -941,7 +941,7 @@ Der Schutzstatus vun derre Said kannscht ännere, awwer des hot kää Aifluss uf
 'contributions' => '{{GENDER:$1|Wassa gemachd hodd}}',
 'contributions-title' => 'Middawaidabaidräsch vun $1',
 'mycontris' => 'Baidräsch',
-'contribsub2' => 'Fa $1 ($2)',
+'contribsub2' => 'Fa {{GENDER:$3|$1}} ($2)',
 'uctop' => '(geschewedisch)',
 'month' => 'än Monad (un frieja):',
 'year' => 'Abm Johr (un frieja):',
@@ -1117,7 +1117,7 @@ Konnschdn Grund inde Zommefassung õgewwe.",
 'file-info-size' => '$1 × $2 Pixels, Dadaigreß: $3, MIME-Type: $4',
 'file-nohires' => 'Ke heheri Ufflesung vafieschba.',
 'svg-long-desc' => 'SVG-Datei, Grundgreß $1 × $2 Pixels, Dadaigreß: $3',
-'show-big-image' => 'Volli Ufflesung',
+'show-big-image' => 'Uaschbringlischi Dadai',
 
 # Special:NewFiles
 'showhidebots' => '(Bots $1)',
@@ -1175,6 +1175,16 @@ Wonn die Dadai vaännad worre isch, donn konns soi, daß zusedzlischi Õgawe fa
 'specialpages-group-pagetools' => 'Wergzaisch fa Saide',
 'specialpages-group-wiki' => 'Daade un Wergzaisch',
 
+# External image whitelist
+'external_image_whitelist' => " #Loss die Zail wiese isch.<pre>
+#Geb unne Deel vunde regulere Ausdrigg (de Deel zwischede //) oi.
+#Die werren midde URLs vun aissare Bilda vaglische.
+#Die wu passen werren gzaischd un schunschd sieschdn n'Ling'g.
+#Zaile, wu midd # ofongen sinnen Kommenda.
+#Glä- odda Großschraiwung isch do egal.
+
+#Deel vun regulere Ausdrigg nochde Zeil oidrache. Loss die Zail do uuvaännad.</pre>",
+
 # Special:Tags
 'tag-filter' => '[[Special:Tags|Bschildarungs]]-Filda:',
 'tags-edit' => 'bearwaide',
index 0790312..174e8d2 100644 (file)
@@ -54,6 +54,7 @@
  * @author Stlmch
  * @author Stv
  * @author Szczepan1990
+ * @author Tar Lócesilion
  * @author Timpul
  * @author ToSter
  * @author Tsca
@@ -325,7 +326,6 @@ $messages = array(
 'tog-numberheadings' => 'Automatyczna numeracja nagłówków',
 'tog-showtoolbar' => 'Pokaż pasek narzędzi',
 'tog-editondblclick' => 'Podwójne kliknięcie rozpoczyna edycję',
-'tog-editsection' => 'Możliwość edycji poszczególnych sekcji strony (link [edytuj])',
 'tog-editsectiononrightclick' => 'Kliknięcie prawym klawiszem myszy na tytule sekcji rozpoczyna jej edycję',
 'tog-showtoc' => 'Pokazuj spis treści (na stronach z więcej niż 3 nagłówkami)',
 'tog-rememberpassword' => 'Zapamiętaj moje hasło w przeglądarce (maksymalnie przez $1 {{PLURAL:$1|dzień|dni}})',
@@ -1258,7 +1258,7 @@ Szczegółowe informacje mogą znajdować się w [{{fullurl:{{#Special:Log}}/del
 'rev-suppressed-no-diff' => "Nie można wyświetlić różnic, ponieważ jedna z wersji została '''usunięta'''.",
 'rev-deleted-unhide-diff' => "Jedna z porównywanych wersji została '''usunięta'''.
 Szczegółowe informacje mogą znajdować się w [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} rejestrze usunięć].
-Jeśli chcesz możesz [$1 obejrzeć porównanie wersji].",
+Jeśli chcesz, możesz [$1 obejrzeć porównanie wersji].",
 'rev-suppressed-unhide-diff' => "Jedna z porównywanych wersji została '''ukryta'''.
 Szczegółowe informacje mogą znajdować się w [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} rejestrze ukrywania].
 Jeśli chcesz możesz [$1 obejrzeć porównanie wersji].",
@@ -1569,8 +1569,8 @@ Jeśli zdecydujesz się je podać, zostaną użyte, by udokumentować Twoje auto
 'userrights-nodatabase' => 'Baza danych $1 nie istnieje lub nie jest lokalna.',
 'userrights-nologin' => 'Musisz [[Special:UserLogin|zalogować się]] na konto administratora, by nadawać uprawnienia użytkownikom.',
 'userrights-notallowed' => 'Nie jesteś upoważniony do nadawania i odbierania uprawnień użytkownikom.',
-'userrights-changeable-col' => 'Grupy, które możesz wybrać',
-'userrights-unchangeable-col' => 'Grupy, których nie możesz wybrać',
+'userrights-changeable-col' => 'Grupy, które możesz wybrać:',
+'userrights-unchangeable-col' => 'Grupy, których nie możesz wybrać:',
 'userrights-conflict' => 'Konflikt zmiany uprawnień użytkownika! Proszę sprawdzić i potwierdzić swoje zmiany.',
 'userrights-removed-self' => 'Pomyślnie odebrałeś sobie uprawnienia. W związku z tym nie masz już dostępu do tej strony.',
 
@@ -1858,6 +1858,7 @@ Cofnij się i załaduj plik pod inną nazwą. [[File:$1|thumb|center|$1]]',
 'file-exists-duplicate' => 'Ten plik jest kopią {{PLURAL:$1|pliku|następujących plików:}}',
 'file-deleted-duplicate' => 'Identyczny do tego plik ([[:$1]]) został wcześniej usunięty.
 Sprawdź historię usunięć tamtego pliku zanim prześlesz go ponownie.',
+'file-deleted-duplicate-notitle' => 'Plik jest identyczny z plikiem, który został wcześniej usunięty, a jego nazwa została ukryta. Należy poprosić kogoś z możliwością przeglądania ukrytych danych, aby przeanalizował sytuację przed przystąpieniem do jego ponownego przesłania.',
 'uploadwarning' => 'Ostrzeżenie o przesyłaniu',
 'uploadwarning-text' => 'Zmień poniższy opis pliku i spróbuj ponownie.',
 'savefile' => 'Zapisz plik',
@@ -2203,7 +2204,7 @@ Każdy wiersz zawiera linki do pierwszego i drugiego przekierowania oraz link, d
 'ninterwikis' => '$1 {{PLURAL:$1|interwiki|interwiki|interwiki}}',
 'nlinks' => '$1 {{PLURAL:$1|link|linki|linków}}',
 'nmembers' => '$1 {{PLURAL:$1|element|elementy|elementów}}',
-'nmemberschanged' => '$1 → $2 {{PLURAL:$1|element|elementy|elementów}}',
+'nmemberschanged' => '$1 → $2 {{PLURAL:$2|element|elementy|elementów}}',
 'nrevisions' => '$1 {{PLURAL:$1|wersja|wersje|wersji}}',
 'nviews' => 'odwiedzono $1 {{PLURAL:$1|raz|razy}}',
 'nimagelinks' => 'Używane na $1 {{PLURAL:$1|stronie|stronach}}',
@@ -2515,7 +2516,7 @@ Zobacz na stronie $2 rejestr ostatnio wykonanych usunięć.',
 Usuwanie jej zostało ograniczone ze względu na możliwość zakłócenia pracy {{GRAMMAR:D.lp|{{SITENAME}}}}.',
 'delete-warning-toobig' => 'Ta strona ma bardzo długą historię edycji – ponad $1 {{PLURAL:$1|zmianę|zmiany|zmian}}.<br />
 Bądź ostrożny, ponieważ usunięcie jej może spowodować zakłócenia w pracy {{GRAMMAR:D.lp|{{SITENAME}}}}.',
-'deleting-backlinks-warning' => "''' Uwaga:''' Do strony, masz zamiar usunąć, odwołują się inne strony.",
+'deleting-backlinks-warning' => "''' Uwaga:''' Do strony, którą masz zamiar usunąć, odwołują się inne strony.",
 
 # Rollback
 'rollback' => 'Cofnij edycję',
@@ -2817,7 +2818,7 @@ By przejrzeć listę obecnie aktywnych blokad, przejdź na stronę [[Special:Blo
 'range_block_disabled' => 'Możliwość blokowania zakresu adresów IP została wyłączona.',
 'ipb_expiry_invalid' => 'Błędny czas wygaśnięcia blokady.',
 'ipb_expiry_temp' => 'Ukryte blokowanie nazwy użytkownika należy wykonać trwale.',
-'ipb_hide_invalid' => 'Ukrycie konta tego użytkownika nie jest możliwe, prawdopodobnie wykonał on zbyt wiele edycji.',
+'ipb_hide_invalid' => 'Ukrycie konta tego użytkownika nie jest możliwe, wykonał on więcej niż {{PLURAL:$1|jedną edycję|$1 edycje|$1 edycji}}.',
 'ipb_already_blocked' => '„$1” jest już zablokowany',
 'ipb-needreblock' => '$1 jest już zablokowany. Czy chcesz zmienić ustawienia blokady?',
 'ipb-otherblocks-header' => '{{PLURAL:$1|Inna blokada|Inne blokady}}',
@@ -4007,6 +4008,10 @@ Możesz także użyć [[Special:EditWatchlist|standardowego edytora obserwowanyc
 'version-ext-colheader-license' => 'Licencja',
 'version-ext-colheader-description' => 'Opis',
 'version-ext-colheader-credits' => 'Autorzy',
+'version-license-title' => 'Licencja dla $1',
+'version-license-not-found' => 'Nie znaleziono szczegółowych informacji licencyjnych dla tego rozszerzenia.',
+'version-credits-title' => 'Lista autorów dla $1',
+'version-credits-not-found' => 'Dla tego rozszerzenia nie ma szczegółowych informacji o autorach.',
 'version-poweredby-credits' => "Ta wiki korzysta z oprogramowania '''[https://www.mediawiki.org/ MediaWiki]''', copyright © 2001‐$1 $2.",
 'version-poweredby-others' => 'inni',
 'version-poweredby-translators' => 'tłumacze translatewiki.net',
index 4aae495..b688e10 100644 (file)
@@ -53,7 +53,6 @@ $messages = array(
 'tog-numberheadings' => 'Tìtoj ëd paràgraf<br />che as nùmero daspërlor',
 'tog-showtoolbar' => "Smon-e la bara dj'utiss ëd modìfica",
 'tog-editondblclick' => 'Dobia sgnacà për modifiché la pàgina',
-'tog-editsection' => "Abilité le modìfiche ëd session con j'anliure [modifiché]",
 'tog-editsectiononrightclick' => 'Abilité la modìfica dle session ën sgnacand-je ansima ai tìtoj col tast drit dël rat',
 'tog-showtoc' => "Smon-e la tàula dij contnù (për le pàgine che l'han pì che 3 session)",
 'tog-rememberpassword' => "Visesse ëd mia ciav ansima a 's navigador (për al pi $1 {{PLURAL:$1|di}})",
@@ -602,6 +601,8 @@ S'a decid ëd butelo, a sarà dovrà për dé a l'utent ël mérit ëd sò trava
 'retypenew' => 'Che a scriva torna soa neuva ciav:',
 'resetpass_submit' => 'Argistré la ciav e rintré ant ël sistema',
 'changepassword-success' => "Soa ciav a l'é stàita modificà sensa problema!",
+'changepassword-throttled' => "A l'ha fàit tròpi tentativ recent d'intré ant ël sistema.
+Për piasì, ch'a speta $1 prima ëd prové torna.",
 'resetpass_forbidden' => 'Le ciav as peulo pa cambiesse',
 'resetpass-no-info' => 'A dev esse rintrà ant ël sustema për acede diretament a sta pàgina.',
 'resetpass-submit-loggedin' => "Cangé 'd ciav",
@@ -654,6 +655,8 @@ Ciav provisòria: $2',
 'changeemail-password' => 'Soa ciav su {{SITENAME}}:',
 'changeemail-submit' => "Cangé l'adrëssa ëd pòsta eletrònica",
 'changeemail-cancel' => 'Anulé',
+'changeemail-throttled' => "A l'ha fàit tròpi tentativ ëd rintré ant ël sistema.
+Për piasì, ch'a speta $1 prima ëd prové torna.",
 
 # Special:ResetTokens
 'resettokens' => 'Riamposté ij geton',
@@ -871,6 +874,8 @@ A esist già.",
 'content-not-allowed-here' => "Ël contnù «$1» a l'é nen autorisà an sla pàgina [[$2]]",
 'editwarning-warning' => "Chité sta pàgina-sì a peul feje perde tute le modìfiche ch'a l'ha fàit.
 S'a l'é rintrà ant ël sistema, a peul disabilité st'avis ant la session «Modìfica» dij sò gust.",
+'editpage-notsupportedcontentformat-title' => 'Formà ëd contnù nen mantnù',
+'editpage-notsupportedcontentformat-text' => "Ël formà ëd contnù $1 a l'é nen mantnù dal model Ëd contnù $2.",
 
 # Content models
 'content-model-wikitext' => 'test wiki',
@@ -1121,6 +1126,7 @@ Sòn a l'é normalment causà da l'andèje dapress a na veja liura stòrica a na
 'search-result-score' => 'Arlevansa: $1%',
 'search-redirect' => '(ridiression $1)',
 'search-section' => '(session $1)',
+'search-file-match' => "(a corëspond al contnù d'archivi)",
 'search-suggest' => 'Vorìi-lo pa dì: $1',
 'search-interwiki-caption' => 'Proget frej',
 'search-interwiki-default' => 'Arzultà da $1:',
@@ -2236,7 +2242,7 @@ Lë scancelassion ëd pàgine parèj a l'é stàita limità për evité ch'as fa
 'delete-warning-toobig' => "Sta pàgina-sì a l'ha na stòria motobin longa, bele pì che $1 {{PLURAL:$1|revision|revision}}.
 A scancelela as peul fesse darmagi a j'operassion dla base ëd dat ëd {{SITENAME}};
 ch'a daga da ment a lòn ch'a fa.",
-'deleting-backlinks-warning' => "'''Avis:''' D'àutre pàgine a l'han na liura a la pàgina che chiel a veul ëscancelé.",
+'deleting-backlinks-warning' => "'''Avis:''' D'àutre pàgine a l'han na liurao a transcludo a la pàgina che chiel a veul ëscancelé.",
 
 # Rollback
 'rollback' => 'Gavé via le modìfiche',
@@ -2535,7 +2541,7 @@ coj che sio ij blocagi ativ al dì d'ancheuj.",
 'range_block_disabled' => "La possibilità che n'aministrator a fasa dij blocagi a ragg a l'é disabilità.",
 'ipb_expiry_invalid' => 'Temp dë scadensa nen bon.',
 'ipb_expiry_temp' => 'Ij blocagi djë stranòm ëstërmà a devo esse përmanent.',
-'ipb_hide_invalid' => 'Impossìbil scancelé ës cont; a podrìa avèj tròpe modìfiche.',
+'ipb_hide_invalid' => "Impossìbil scancelé ës cont; a l'ha pi ëd {{PLURAL:$1|na modìfica|$1 modìfiche}}.",
 'ipb_already_blocked' => "«$1» a l'é già blocà",
 'ipb-needreblock' => "$1 a l'é già blocà. Veul-lo cambié j'ampostassion?",
 'ipb-otherblocks-header' => '{{PLURAL:$1|Àutr|Àutri}} blocagi',
@@ -3960,4 +3966,7 @@ An efet, a espand praticament tut lòn ch'a-i é antrames dle grafe dobie.",
 'expand_templates_generate_rawhtml' => "Smon-e l'HTML sempi",
 'expand_templates_preview' => 'Preuva',
 
+# Unknown messages
+'createaccount-hook-aborted' => '$1',
+'uploadinvalidxml' => "L'XML ant l'archivi carià a l'ha nen podù esse analisà.",
 );
index a8b2ffb..ac82929 100644 (file)
@@ -32,7 +32,6 @@ $messages = array(
 'tog-numberheadings' => 'آپ نمبر دین والیاں سرخیاں',
 'tog-showtoolbar' => 'ایڈٹ ٹولبار وکھاؤ',
 'tog-editondblclick' => 'صفیاں تے ڈبل کلک کرن تے تبدیلیاں لیاؤ',
-'tog-editsection' => 'سیکشن ایڈیٹنگ جوڑاں نال بناؤ',
 'tog-editsectiononrightclick' => 'سیکشن سرخی تے تبدیلی لیاؤ سجی کلک نال',
 'tog-showtoc' => 'آرٹیکل دی لسٹ دسو (3 توں چوکھیاں سرخیاں والے صفیاں دی)',
 'tog-rememberpassword' => 'اس براؤزر تے میرا ورتن ناں یاد رکھو ($1 {{PLURAL:$1|دن|دناں}} واسطے)',
index 65a4bde..bee5a8f 100644 (file)
@@ -24,7 +24,6 @@ $messages = array(
 'tog-numberheadings' => 'Autōmatiska galwasrīndan nummerinsna',
 'tog-showtoolbar' => 'Waidinnais sawinzlin stēisan pagaptin (JavaScript)',
 'tog-editondblclick' => 'Redigīs pāusans pra dwigubban pellis gnesnan (JavaScript)',
-'tog-editsection' => 'Ermazīnginais redigīsnan stēisan pāusas sekciōnin pra "[redigīs]" autengīnsenin',
 'tog-editsectiononrightclick' => 'Ermazīnginais redigīsnan stēisan pāusas sekciōnin pra tikrōman pellis knuppas gnesnan na tenesses tītelin',
 'tog-showtoc' => 'Waidinnais ēnturas listin (en pāusamans sen tūls nikāi 3 galwasrīndans)',
 'tog-rememberpassword' => 'Pamēnais enēisenes infōrmaciōnins en šismu kōmputerin (per maksimum of $1 {{PLURAL:$1|deinā|dēinans}})',
index 23447c7..321d400 100644 (file)
@@ -25,6 +25,7 @@
  * @author Indech
  * @author Jens Liebenau
  * @author Jorge Morais
+ * @author Josep Maria 15.
  * @author Kaganer
  * @author Leonardo.stabile
  * @author Lijealso
@@ -330,7 +331,6 @@ $messages = array(
 'tog-numberheadings' => 'Auto-numerar cabeçalhos',
 'tog-showtoolbar' => 'Mostrar barra de edição',
 'tog-editondblclick' => 'Editar páginas quando houver um clique duplo',
-'tog-editsection' => 'Possibilitar a edição de secções com links [editar]',
 'tog-editsectiononrightclick' => 'Possibilitar a edição de seções por clique com o botão direito no título da seção',
 'tog-showtoc' => 'Mostrar índice (para páginas com mais de três seções)',
 'tog-rememberpassword' => 'Recordar os meus dados neste browser (no máximo, durante $1 {{PLURAL:$1|dia|dias}})',
@@ -1166,6 +1166,7 @@ Ela já existia.',
 'content-not-allowed-here' => 'Conteúdo do tipo "$1" não é permitido na página [[$2]]',
 'editwarning-warning' => 'Sair desta página fará com que você perca quaisquer alterações feitas por você.
 Se você se autenticou, pode desabilitar este aviso na seção "Edição" das suas preferências.',
+'editpage-notsupportedcontentformat-title' => 'Formato de conteúdo não suportado',
 
 # Content models
 'content-model-wikitext' => 'wikitexto',
@@ -1737,7 +1738,7 @@ Se optar por revelá-lo, ele será utilizado para atribuir-lhe crédito pelo seu
 'enhancedrc-history' => 'histórico',
 'recentchanges' => 'Mudanças recentes',
 'recentchanges-legend' => 'Opções das mudanças recentes',
-'recentchanges-summary' => 'Acompanhe nesta página as mudanças mais recentes da wiki.',
+'recentchanges-summary' => 'Acompanha nesta página as mudanças mais recentes desta wiki.',
 'recentchanges-noresult' => 'Nenhuma alteração correspondente a esses critérios foi realizada durante o período selecionado.',
 'recentchanges-feed-description' => "Acompanhe neste ''feed'' as mudanças mais recentes da wiki.",
 'recentchanges-label-newpage' => 'Esta edição criou uma nova página',
@@ -2151,6 +2152,7 @@ Talvez queira editar a descrição na [$2 página original de descrição do fic
 'randompage-nopages' => 'Não há páginas {{PLURAL:$2|no seguinte espaço nominal|nos seguintes espaços nominais}}: $1.',
 
 # Random page in category
+'randomincategory-invalidcategory' => '"$1" não é um nome de categoria válido',
 'randomincategory-nopages' => 'Não há páginas na categoria [[:Category:$1|$1]].',
 'randomincategory-selectcategory' => 'Obter página aleatória da categoria: $1 $2',
 'randomincategory-selectcategory-submit' => 'Ir',
@@ -2253,6 +2255,7 @@ Agora redirecciona para [[$2]].',
 'protectedpages' => 'Páginas protegidas',
 'protectedpages-indef' => 'Apenas proteções indefinidas',
 'protectedpages-cascade' => 'Apenas proteções em cascata',
+'protectedpages-noredirect' => 'Esconder redirecionamentos',
 'protectedpagesempty' => 'Neste momento, nenhuma das páginas está protegida com estes parâmetros.',
 'protectedtitles' => 'Títulos protegidos',
 'protectedtitlesempty' => 'Neste momento, nenhum dos títulos está protegido com estes parâmetros.',
@@ -2531,6 +2534,7 @@ A eliminação de páginas como esta foi restringida na {{SITENAME}}, para evita
 'delete-warning-toobig' => 'Esta página tem um histórico de edições longo, com mais de $1 {{PLURAL:$1|edição|edições}}.
 Eliminá-la poderá causar problemas na base de dados da {{SITENAME}};
 prossiga com precaução.',
+'deleting-backlinks-warning' => "'''Aviso:''' Outras páginas têm ligação à página que está prestes a eliminar.",
 
 # Rollback
 'rollback' => 'Reverter edições',
@@ -2829,7 +2833,7 @@ Consulte a [[Special:BlockList|lista de bloqueios]] para obter a lista de bloque
 '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.',
-'ipb_hide_invalid' => 'Não foi possível suprimir esta conta; ela poderá ter demasiadas edições.',
+'ipb_hide_invalid' => 'Não foi possível suprimir esta conta; ela possui mais de {{PLURAL:$1|uma edição|$1 edições}}.',
 'ipb_already_blocked' => '"$1" já se encontra bloqueado',
 'ipb-needreblock' => '$1 já se encontra bloqueado. Deseja alterar as configurações?',
 'ipb-otherblocks-header' => '{{PLURAL:$1|Outro bloqueio|Outros bloqueios}}',
@@ -3956,7 +3960,8 @@ Também pode [[Special:EditWatchlist|editar a lista da maneira convencional]].',
 'version-hook-name' => 'Nome do hook',
 'version-hook-subscribedby' => 'Subscrito por',
 'version-version' => '(Versão $1)',
-'version-license' => 'Licença',
+'version-license' => 'Licença do MediaWiki',
+'version-credits-not-found' => 'Nenhuma informação detalhada acerca dos créditos foi encontrada para esta extensão.',
 'version-poweredby-credits' => "Esta é uma wiki '''[https://www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
 'version-poweredby-others' => 'outros',
 'version-credits-summary' => 'Gostaríamos de reconhecer as seguintes pessoas pela sua contribuição para o [[Special:Version|MediaWiki]].',
@@ -4205,6 +4210,7 @@ Caso contrário, pode facilmente usar o formulário abaixo. O seu comentário se
 'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|byte|bytes}}',
 'limitreport-templateargumentsize' => 'Tamanho dos argumentos da predefinição',
 'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|byte|bytes}}',
+'limitreport-expensivefunctioncount' => 'Número de funções do analisador custosas',
 
 # Special:ExpandTemplates
 'expandtemplates' => 'Expandir predefinições',
index 38398f1..2af9609 100644 (file)
@@ -338,7 +338,6 @@ $messages = array(
 'tog-numberheadings' => 'Auto-numerar cabeçalhos',
 'tog-showtoolbar' => 'Mostrar barra de ferramentas de edição',
 'tog-editondblclick' => 'Editar páginas quando houver clique duplo',
-'tog-editsection' => 'Ativar a edição de seções com links [editar]',
 'tog-editsectiononrightclick' => 'Habilitar edição de seção por clique com o botão direito no título da seção (requer JavaScript)',
 'tog-showtoc' => 'Mostrar Tabela de Conteúdos (para páginas com mais de três cabeçalhos)',
 'tog-rememberpassword' => 'Recordar meus dados de acesso neste navegador (por no máximo $1 {{PLURAL:$1|dia|dias}})',
@@ -1168,6 +1167,8 @@ Ela já existia.',
 'content-not-allowed-here' => 'Conteúdo do tipo "$1" não é permitido na página [[$2]]',
 'editwarning-warning' => 'Abandonar esta página pode fazer com que você perca todas as alterações que fez.
 Se você estiver autenticado, você pode desabilitar este aviso na seção "Edição" de suas preferências.',
+'editpage-notsupportedcontentformat-title' => 'Formato do conteúdo não suportado',
+'editpage-notsupportedcontentformat-text' => 'O formato de conteúdo $1 não é suportando pelo modelo de conteúdo $2.',
 
 # Content models
 'content-model-wikitext' => 'wikitexto',
@@ -1552,6 +1553,7 @@ Caso decida fornecê-lo, este será utilizado para dar-lhe crédito pelo seu tra
 'prefs-tokenwatchlist' => 'Senha',
 'prefs-diffs' => 'Diferenças',
 'prefs-help-prefershttps' => 'Esta preferência terá efeito no seu próximo início de sessão.',
+'prefs-tabs-navigation-hint' => 'Dica: Você pode usar as teclas de seta esquerda e direita para navegar entre as abas da lista de abas.',
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => 'Parece válido',
@@ -2206,7 +2208,7 @@ Entradas <del>riscadas</del> foram resolvidas.',
 'withoutinterwiki-legend' => 'Prefixo',
 'withoutinterwiki-submit' => 'Exibir',
 
-'fewestrevisions' => 'Páginas de conteúdo com menos edições',
+'fewestrevisions' => 'Páginas com menos edições',
 
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|byte|bytes}}',
@@ -2214,7 +2216,7 @@ Entradas <del>riscadas</del> foram resolvidas.',
 'ninterwikis' => '$1 {{PLURAL:$1|interwiki|Interwikis}}',
 'nlinks' => '$1 {{PLURAL:$1|link|links}}',
 'nmembers' => '$1 {{PLURAL:$1|membro|membros}}',
-'nmemberschanged' => '$2{{PLURAL:$2|membro|membros}}',
+'nmemberschanged' => '$1 → $2 {{PLURAL:$2|membro|membros}}',
 'nrevisions' => '$1 {{PLURAL:$1|revisão|revisões}}',
 'nviews' => '$1 {{PLURAL:$1|visita|visitas}}',
 'nimagelinks' => 'Utilizada em $1 {{PLURAL:$1|página|páginas}}',
@@ -2253,6 +2255,7 @@ Entradas <del>riscadas</del> foram resolvidas.',
 'protectedpages' => 'Páginas protegidas',
 'protectedpages-indef' => 'Proteções infinitas apenas',
 'protectedpages-cascade' => 'Apenas proteções progressivas',
+'protectedpages-noredirect' => 'Ocultar redirecionamentos',
 'protectedpagesempty' => 'Neste momento, nenhuma das páginas está protegida com estes parâmetros.',
 'protectedtitles' => 'Títulos protegidos',
 'protectedtitlesempty' => 'Neste momento, nenhum dos títulos está protegido com estes parâmetros.',
@@ -2530,6 +2533,7 @@ A eliminação de tais páginas foi restrita, a fim de se evitarem problemas aci
 'delete-warning-toobig' => 'Esta página possui um longo histórico de edições, com mais de $1 {{PLURAL:$1|edição|edições}}.
 Eliminá-la poderá causar problemas na base de dados de {{SITENAME}};
 prossiga com cuidado.',
+'deleting-backlinks-warning' => "'''Cuidado:''' Outras páginas redirecionam para a página que você está prestes a deletar.",
 
 # Rollback
 'rollback' => 'Reverter edições',
@@ -2762,6 +2766,7 @@ Isto só deve ser feito para prevenir vandalismo, e de acordo com a [[{{MediaWik
 Consulte 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-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',
 'ipb-unblock' => 'Desbloquear um usuário ou endereço de IP',
@@ -3857,7 +3862,7 @@ Por favor, confirme que realmente deseja recriar esta página.",
 
 # Language selector for translatable SVGs
 'img-lang-default' => '(Idioma padrão)',
-'img-lang-info' => 'Renderizar essa imagem em $1 $2',
+'img-lang-info' => 'Renderizar essa imagem em $1. $2',
 'img-lang-go' => 'Ir',
 
 # Table pager
@@ -3939,7 +3944,17 @@ Você também pode [[Special:EditWatchlist|editar a lista da maneira convenciona
 'version-hook-name' => 'Nome do hook',
 'version-hook-subscribedby' => 'Subscrito por',
 'version-version' => '(Versão $1)',
-'version-license' => 'Licença',
+'version-license' => 'Licença do MediaWiki',
+'version-ext-license' => 'Licença',
+'version-ext-colheader-name' => 'Extensão',
+'version-ext-colheader-version' => 'Versão',
+'version-ext-colheader-license' => 'Licença',
+'version-ext-colheader-description' => 'Descrição',
+'version-ext-colheader-credits' => 'Autores',
+'version-license-title' => 'Licença para $1',
+'version-license-not-found' => 'Nenhuma informação detalhada dessa licença foi encontrada para esta extensão.',
+'version-credits-title' => 'Créditos para $1',
+'version-credits-not-found' => 'Nenhuma informação detalhada de crédito foi encontrada para esta extensão.',
 'version-poweredby-credits' => "Este é um wiki '''[https://www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
 'version-poweredby-others' => 'outros',
 'version-poweredby-translators' => 'tradutores da translatewiki.net',
@@ -3959,11 +3974,12 @@ Em conjunto com este programa deve ter recebido [{{SERVER}}{{SCRIPTPATH}}/COPYIN
 # Special:Redirect
 'redirect' => 'Redirecionar por arquivo, usuário ou ID de revisão',
 'redirect-legend' => 'Redirecionar para um arquivo ou página',
-'redirect-summary' => 'Esta página especial redireciona a um arquivo (dado o nome do arquivo), a uma página (dado um ID de revisão) ou a uma página de usuário (dado o ID do usuário). Uso: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/revision/328429]], ou [[{{#Special:Redirect}}/user/101]].',
+'redirect-summary' => 'Esta página especial redireciona a um arquivo (dado o nome do arquivo), a uma página (dado um ID de revisão ou ID da página) ou a uma página de usuário (dado o ID do usuário). Uso: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], or [[{{#Special:Redirect}}/user/101]].',
 'redirect-submit' => 'Ir',
 'redirect-lookup' => 'Buscar',
 'redirect-value' => 'Valor:',
 'redirect-user' => 'ID do usuário',
+'redirect-page' => 'ID da página',
 'redirect-revision' => 'Revisão da página',
 'redirect-file' => 'Nome do arquivo',
 'redirect-not-exists' => 'Valor não encontrado',
@@ -4157,6 +4173,7 @@ Caso contrário, você poderá usar o formulário simplificado a seguir. Seu com
 'api-error-overwrite' => 'Não é permitido sobrescrever um arquivo já existente.',
 'api-error-stashfailed' => 'Erro interno: o servidor não conseguiu armazenar o arquivo temporário.',
 'api-error-publishfailed' => 'Erro interno: O servidor falhou ao publicar o arquivo temporário.',
+'api-error-stasherror' => 'Houve um erro durante o upload do arquivo para a pilha.',
 'api-error-timeout' => 'O servidor não respondeu dentro do tempo esperado.',
 'api-error-unclassified' => 'Ocorreu um erro desconhecido',
 'api-error-unknown-code' => 'Erro desconhecido: "$1"',
@@ -4193,7 +4210,7 @@ Caso contrário, você poderá usar o formulário simplificado a seguir. Seu com
 'limitreport-templateargumentsize' => 'Argumento do tamanho da predefinição',
 'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|byte|bytes}}',
 'limitreport-expansiondepth' => 'Máxima profundidade de expansão',
-'limitreport-expensivefunctioncount' => 'Conta da função expansiva do analizador',
+'limitreport-expensivefunctioncount' => 'Número de funções do analisador custosas',
 
 # Special:ExpandTemplates
 'expandtemplates' => 'Expandir predefinições',
@@ -4206,10 +4223,14 @@ Na verdade, expande tudo que está entre chaves duplas.',
 'expand_templates_input' => 'Texto de entrada:',
 'expand_templates_output' => 'Resultado',
 'expand_templates_xml_output' => 'Resultado XML',
+'expand_templates_html_output' => 'Saída HTML puro',
 'expand_templates_ok' => 'Expandir',
 'expand_templates_remove_comments' => 'Remover comentários',
 'expand_templates_remove_nowiki' => 'Suprima marcações <nowiki> no resultado',
 'expand_templates_generate_xml' => 'Mostrar árvore de análise (parse) do XML',
+'expand_templates_generate_rawhtml' => 'Mostrar HTML puro',
 'expand_templates_preview' => 'Pré-visualização',
 
+# Unknown messages
+'uploadinvalidxml' => 'O XML no arquivo enviado não pôde ser analisado.',
 );
index 80b8bc4..ebb470f 100644 (file)
@@ -58,6 +58,7 @@
  * @author Iniquity
  * @author Iwan Novirion
  * @author Jon Harald Søby
+ * @author Joseph
  * @author Karduelis
  * @author Kazu89
  * @author Kghbln
@@ -180,7 +181,6 @@ Offers user to use alternative representation of [[Special:RecentChanges]] and w
 This is the toolbar: [[Image:Toolbar.png]]",
 'tog-editondblclick' => "{{Gender}}
 [[Special:Preferences]], tab 'Edit'. Offers user to open edit page on double click.",
-'tog-editsection' => "[[Special:Preferences]], tab 'Edit'. Offers user to add links in sub headings for editing sections. {{Gender}}",
 'tog-editsectiononrightclick' => "{{Gender}}
 [[Special:Preferences]], tab 'Edit'. Offers user to edit a section by clicking on a section title.",
 'tog-showtoc' => "[[Special:Preferences]], tab 'Misc'.
@@ -1557,7 +1557,7 @@ Parameters:
 * $3 - a password (randomly generated)
 * $4 - a URL to the wiki ('<' + server name + script name + '>')
 * $5 - (Unused) number of days to password expiry date",
-'login-throttled' => 'Error message shown at [[Special:UserLogin]] after the user has tried to login with incorrect password too many times; also used by [[Special:ChangeEmail]] and [[Special:ChangePassword]].
+'login-throttled' => 'Error message shown at [[Special:UserLogin]] after the user has tried to login with incorrect password too many times.
 
 The user has to wait a certain time before trying to log in again.
 
@@ -1575,7 +1575,8 @@ Parameters:
 
 This is a protection against robots trying to find the password by trying lots of them.
 The number of attempts and waiting time are configured via [[mw:Manual:$wgPasswordAttemptThrottle|$wgPasswordAttemptThrottle]].
-This message is used in html.',
+This message is used in html.
+{{identical|Login throttled}}',
 'login-abort-generic' => 'The generic unsuccessful login message is used unless otherwise specified by hook writers',
 'loginlanguagelabel' => 'Used on [[Special:UserLogin]] if $wgLoginLanguageSelector is true. Parameters:
 * $1 - a pipe-separated list built from the names that appear in the message {{msg-mw|Loginlanguagelinks}}.
@@ -1598,11 +1599,32 @@ Used on the account creation form when creating another user's account. Similar
 'resetpass_header' => 'Header on box on special page [[Special:ChangePassword]].
 
 {{Identical|Reset password}}',
-'oldpassword' => "Used on the 'User profile' tab of 'my preferences'. This is the text next to an entry box for the old password in the 'change password' section.",
+'oldpassword' => "Used on the 'User profile' tab of 'my preferences'. This is the text next to an entry box for the old password in the 'change password' section.
+{{Identical|Old password}}",
 'newpassword' => '{{Identical|New password}}',
 'retypenew' => "Appears on the 'User profile' tab of the 'Preferences' special page in the 'Change password' section. It appears next to the text box for entering the new password a second time.",
 'resetpass_submit' => 'Submit button on [[Special:ChangePassword]]',
 'changepassword-success' => 'Used in [[Special:ChangePassword]].',
+'changepassword-throttled' => 'Error message shown at [[Special:ChangePassword]] after the user has tried to login with incorrect password too many times.
+
+The user has to wait a certain time before trying to log in again.
+
+Parameters:
+* $1 - the time to wait before the next login attempt. Automatically formatted using the following duration messages:
+** {{msg-mw|Duration-millennia}}
+** {{msg-mw|Duration-centuries}}
+** {{msg-mw|Duration-decades}}
+** {{msg-mw|Duration-years}}
+** {{msg-mw|Duration-weeks}}
+** {{msg-mw|Duration-days}}
+** {{msg-mw|Duration-hours}}
+** {{msg-mw|Duration-minutes}}
+** {{msg-mw|Duration-seconds}}
+
+This is a protection against robots trying to find the password by trying lots of them.
+The number of attempts and waiting time are configured via [[mw:Manual:$wgPasswordAttemptThrottle|$wgPasswordAttemptThrottle]].
+This message is used in html.
+{{identical|Login throttled}}',
 'resetpass_forbidden' => "Used as error message in changing password. Maybe the external auth plugin won't allow local password changes.",
 'resetpass-no-info' => 'Error message for [[Special:ChangePassword]].
 
@@ -1692,6 +1714,26 @@ Parameters:
 'changeemail-cancel' => 'Cancel button on [[Special:ChangeEmail]]
 
 {{Identical|Cancel}}',
+'changeemail-throttled' => 'Error message shown at [[Special:ChangeEmail]] after the user has tried to login with incorrect password too many times.
+
+The user has to wait a certain time before trying to log in again.
+
+Parameters:
+* $1 - the time to wait before the next login attempt. Automatically formatted using the following duration messages:
+** {{msg-mw|Duration-millennia}}
+** {{msg-mw|Duration-centuries}}
+** {{msg-mw|Duration-decades}}
+** {{msg-mw|Duration-years}}
+** {{msg-mw|Duration-weeks}}
+** {{msg-mw|Duration-days}}
+** {{msg-mw|Duration-hours}}
+** {{msg-mw|Duration-minutes}}
+** {{msg-mw|Duration-seconds}}
+
+This is a protection against robots trying to find the password by trying lots of them.
+The number of attempts and waiting time are configured via [[mw:Manual:$wgPasswordAttemptThrottle|$wgPasswordAttemptThrottle]].
+This message is used in html.
+{{identical|Login throttled}}',
 
 # Special:ResetTokens
 'resettokens' => '{{doc-special|ResetTokens}}
@@ -2138,6 +2180,10 @@ Parameters:
 'editwarning-warning' => "{{doc-important|Do ''not'' use <nowiki>{{int:prefs-editing}}</nowiki> for \"Editing\". It is forbidden in this message, see [[mwr:68405]].}}
 
 but you can see the text of that button here: {{msg-mw|Prefs-editing}}",
+'editpage-notsupportedcontentformat-title' => 'Title of error page shown when using an incompatible format on EditPage',
+'editpage-notsupportedcontentformat-text' => 'Error message shown when using an incompatible format on EditPage. Parameters:
+* $1 - the format id
+* $2 - the content model name',
 
 # Content models
 'content-model-wikitext' => 'Name for the wikitext content model, used when decribing what type of content a page contains.
@@ -2910,6 +2956,7 @@ Parameters:
 * \$1 - a link to the redirect to the page (so, \$1 is the page that the search result is redirected '''from''')",
 'search-section' => 'This text will be shown on the search result listing after the page title of a result if the search algorithm thinks that section is more relevant than the rest of the page. $1 is a section title.
 {{Identical|Section}}',
+'search-file-match' => 'This text will be shown on the search result listing after the page title of a result if the search engine got search results from the contents of files, rather than the pages.',
 'search-suggest' => 'Used for "Did you mean" suggestions:
 * $1 - suggested link',
 'search-interwiki-caption' => 'Used in [[Special:Search]], when showing search results from other wikis.',
@@ -3606,7 +3653,8 @@ Preceded by legend example {{msg-mw|Recentchanges-legend-plusminus}}.',
 'recentchanges-legend-heading' => 'Used as a heading for legend box on [[Special:RecentChanges]] and [[Special:Watchlist]].
 {{Identical|Legend}}',
 'recentchanges-legend-newpage' => 'Used as legend in [[Special:RecentChanges]]. Preceded by {{msg-mw|Recentchanges-label-newpage}}.',
-'recentchanges-legend-plusminus' => 'A plus/minus sign with a number for the legend.',
+'recentchanges-legend-plusminus' => '{{optional}}
+A plus/minus sign with a number for the legend.',
 'rcnotefrom' => 'This message is displayed at [[Special:RecentChanges]] when viewing recentchanges from some specific time.
 
 The corresponding message is {{msg-mw|Rclistfrom}} (without split of date and time, [[bugzilla:19104|Bug 19104]]).
@@ -5609,7 +5657,7 @@ See also:
 * $1 - the upper limit of number of revisions
 See also:
 * {{msg-mw|Delete-toobig}}',
-'deleting-backlinks-warning' => 'A warning shown when a page that is being deleted has links to it.',
+'deleting-backlinks-warning' => 'A warning shown when a page that is being deleted has at least one link to it or is transcluded in at least one page.',
 
 # Rollback
 'rollback' => '{{Identical|Rollback}}',
@@ -6591,7 +6639,8 @@ See also:
 * {{msg-mw|Ip range toolarge}}',
 'ipb_expiry_invalid' => 'Used as error message in [[Special:Block]].',
 'ipb_expiry_temp' => 'Warning message displayed on [[Special:BlockIP]] if the option "hide username" is selected but the expiry time is not infinite.',
-'ipb_hide_invalid' => 'Used as error message in [[Special:Block]].',
+'ipb_hide_invalid' => 'Used as error message in [[Special:Block]].
+* $1 - Number of edits (Value of [[mw:Manual:$wgHideUserContribLimit]])',
 'ipb_already_blocked' => '{{Identical|$1 is already blocked}}',
 'ipb-needreblock' => 'Used in [[Special:Block]].
 * $1 - target username',
@@ -7141,6 +7190,7 @@ See also:
 'allmessages-filter-submit' => 'Used on [[Special:Allmessages]].
 
 {{Identical|Go}}',
+'allmessages-filter-translate' => 'Used on [[Special:Allmessages]]. Label for a link to translatewiki.net for a message to translate.',
 
 # Thumbnails
 'thumbnail-more' => '[[Image:Yes.png|thumb|This:]]
@@ -9559,7 +9609,9 @@ Most languages use a space, but some Asian languages, such as Thai and Chinese,
 'percent' => '{{optional}}',
 'parentheses' => '{{optional}}',
 'brackets' => '{{Optional}}',
-'quotation-marks' => 'Quotation marks, for quoting, sometimes titles etc., depending on the language.
+'quotation-marks' => '{{optional}}
+
+Quotation marks, for quoting, sometimes titles etc., depending on the language.
 
 See: [[w:Non-English usage of quotation marks|Non-English usage of quotation marks on Wikipedia]].
 
@@ -10620,4 +10672,7 @@ test
 'expand_templates_generate_rawhtml' => 'Used as checkbox label.',
 'expand_templates_preview' => '{{Identical|Preview}}',
 
+# Unknown messages
+'createaccount-hook-aborted' => 'Placeholder message to return with API errors on account create; passes through the message from a hook {{notranslate}}',
+'uploadinvalidxml' => 'Error message displayed when the uploaded file contains XML that cannot be properly parsed and checked.',
 );
index e884afe..2d6aeb3 100644 (file)
@@ -274,7 +274,6 @@ $messages = array(
 'tog-numberheadings' => "Uma siq'ikunata kikinmanta yupay",
 'tog-showtoolbar' => "Llamk'apuna sillwita rikuchiy",
 'tog-editondblclick' => "P'anqakunata llamk'apuy iskaylla ñit'iywan",
-'tog-editsection' => "Rakirilla llamk'apuyta saqillay [qillqay] t'inkiwan",
 'tog-editsectiononrightclick' => "Rakirilla llamk'apuyta saqillay paña butunta rakirip sutinpi ñit'ispa",
 'tog-showtoc' => "Yuyarina wachuchasqata rikuchiy (kimsamanta aswan uma siq'iyuq p'anqakunapaq)",
 'tog-rememberpassword' => "Ruraqpa sutiyta yaykuna rimaytapas yuyaykuy kay llika wamp'unapi ({{PLURAL:$1|huk p'unchawkama|$1 p'unchawkama}})",
index 4ba0fb1..2742a28 100644 (file)
@@ -54,7 +54,6 @@ $messages = array(
 'tog-numberheadings' => 'Numerar automaticamain ils titels',
 'tog-showtoolbar' => "Mussar la trav d'utensils per modifitgar",
 'tog-editondblclick' => 'Modifitgar paginas cun in clic dubel',
-'tog-editsection' => 'Mussar colliaziuns [modifitgar] per modifitgar singulas secziuns',
 'tog-editsectiononrightclick' => 'Activar la pussaivladad da modifitgar secziuns cun in clic dretg sin il titel',
 'tog-showtoc' => 'Mussar ina tabla da cuntegn sin paginas cun dapli che trais tetels',
 'tog-rememberpassword' => "S'annunziar permanantamain cun quest navigatur (per maximalmain $1 {{PLURAL:$1|di|dis}})",
index be0858e..e354412 100644 (file)
@@ -308,7 +308,6 @@ $messages = array(
 'tog-numberheadings' => 'Numerotează automat secțiunile',
 'tog-showtoolbar' => 'Afișează bara de unelte pentru modificare',
 'tog-editondblclick' => 'Modifică paginile prin dublu clic',
-'tog-editsection' => 'Activează modificarea secțiunilor prin legăturile [modifică]',
 'tog-editsectiononrightclick' => 'Activează modificarea secţiunilor prin clic dreapta pe titlul secțiunii',
 'tog-showtoc' => 'Arată cuprinsul (pentru paginile cu mai mult de 3 paragrafe cu titlu)',
 'tog-rememberpassword' => 'Autentificare automată de la acest navigator (expiră după $1 {{PLURAL:$1|zi|zile|de zile}})',
@@ -1134,6 +1133,8 @@ Ea există deja.',
 'content-not-allowed-here' => 'Conținutul de tip „$1” nu este permis pe pagina [[$2]]',
 'editwarning-warning' => 'Părăsind această pagină, există riscul pierderii modificărilor efectuate.
 Dacă sunteți autentificat, puteți dezactiva această avertizare în secțiunea „Modificare” a preferințelor dumneavoastră.',
+'editpage-notsupportedcontentformat-title' => 'Formatul conținutului nu este acceptat',
+'editpage-notsupportedcontentformat-text' => 'Formatul de conținut $1 nu este acceptat de modelul de conținut $2.',
 
 # Content models
 'content-model-wikitext' => 'wikitext',
@@ -1383,6 +1384,7 @@ Detalii se pot găsi în [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE
 'search-result-score' => 'Relevanță: $1%',
 'search-redirect' => '(redirecționare către $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',
 'search-interwiki-caption' => 'Proiecte înrudite',
 'search-interwiki-default' => '$1 rezultate:',
@@ -2488,7 +2490,7 @@ Accesați $2 pentru o listă cu elementele recent șterse.',
 'delete-warning-toobig' => 'Această pagină are un istoric al modificărilor mult prea mare, cu mai mult de $1 {{PLURAL:$1|versiune|versiuni|de versiuni}}.
 Ștergerea sa poate afecta baza de date a sitului {{SITENAME}};
 acționați cu precauție.',
-'deleting-backlinks-warning' => "'''Atenție:''' Alte pagini se leagă de pagina pe care doriți să o ștergeți.",
+'deleting-backlinks-warning' => "'''Atenție:''' Alte pagini se leagă sau sunt transcluse din pagina pe care doriți să o ștergeți.",
 
 # Rollback
 'rollback' => 'Editări de revenire',
@@ -2786,7 +2788,7 @@ Jurnalul suprimărilor este indicat mai jos:',
 'range_block_disabled' => 'Abilitatea dezvoltatorilor de a bloca serii de adrese este dezactivată.',
 'ipb_expiry_invalid' => 'Dată de expirare invalidă.',
 'ipb_expiry_temp' => 'Blocarea numelor de utilizator ascunse trebuie să fie permanentă.',
-'ipb_hide_invalid' => 'Imposibil de a suprima acest cont; acesta poate avea prea multe modificări.',
+'ipb_hide_invalid' => 'Imposibil de suprimat acest cont; acesta are mai mult de {{PLURAL:$1|o modificare|$1 modificări|$1 de modificări}}.',
 'ipb_already_blocked' => '„$1” este deja blocat',
 'ipb-needreblock' => '$1 este deja blocat. Doriți să modificați parametrii?',
 'ipb-otherblocks-header' => '{{PLURAL:$1|Altă blocare|Alte blocări}}',
@@ -4182,4 +4184,6 @@ MediaWiki este distribuit în speranța că va fi folositor, dar FĂRĂ VREO GAR
 'expand_templates_generate_rawhtml' => 'Arată HTML brut',
 'expand_templates_preview' => 'Previzualizare',
 
+# Unknown messages
+'uploadinvalidxml' => 'Nu s-a putut analiza conținutul XML din fișierul încărcat.',
 );
index a013382..4772c41 100644 (file)
@@ -35,7 +35,6 @@ $messages = array(
 'tog-numberheadings' => 'Testate auto-numerate',
 'tog-showtoolbar' => "Fà vedè 'a barra de le cangiaminde",
 'tog-editondblclick' => "Cange le pàggene cu 'nu doppie clic",
-'tog-editsection' => "Abbilite le cangiaminde d'a sezione ausanne le collagaminde [cange]",
 'tog-editsectiononrightclick' => "Abbilite le cangiaminde d'a sezione ausanne 'u pulsande destre d'u sciorge cazzanne sus a 'u titole",
 'tog-showtoc' => "Fa vedè 'a tabbelle de le condenute (pe le pàggene cu cchiù de 3 testate)",
 'tog-rememberpassword' => "Arrecuèrdete 'u nome mije sus a stu browser (pe 'nu massime de $1 {{PLURAL:$1|sciurne}})",
@@ -241,7 +240,7 @@ $messages = array(
 'articlepage' => "Vide 'a pàgene de le condenute",
 'talk' => "'Ngazzaminde",
 'views' => 'Visite',
-'toolbox' => 'Cascette de le struminde',
+'toolbox' => 'Struminde',
 'userpage' => "Vide a pàgene de l'utende",
 'projectpage' => 'Vide a pàgene de le pruggette',
 'imagepage' => 'Vide a pàgene de le file',
@@ -436,7 +435,7 @@ L\'amministratore ca l\'ha bloccate dèje sta spiegazione: "$3".',
 'invalidtitle-knownnamespace' => 'Titole invalide cu \'u namespace "$2" e teste "$3"',
 'invalidtitle-unknownnamespace' => 'Titele invalide cu numere de namespace scanusciute $1 e teste "$2"',
 'exception-nologin' => 'Non ge sì collegate',
-'exception-nologin-text' => "Sta pàgene o azione richiede ca a trasè jndr'à sta uicchi.",
+'exception-nologin-text' => "Pe piacere [[Special:Userlogin|tràse]] pe avè l'accesse a sta pàgene o a sta azione.",
 
 # Virus scanner
 'virus-badscanner' => "Configurazione ca fece schife: Virus scanner scanusciute: ''$1''",
@@ -483,9 +482,12 @@ No te sce scurdanne de cangià le [[Special:Preferences|{{SITENAME}} preferenze
 'gotaccount' => "Tine già 'nu cunde? '''$1'''.",
 'gotaccountlink' => 'Tràse',
 'userlogin-resetlink' => "T'è scurdate le dettaglie pe trasè?",
-'userlogin-resetpassword-link' => "Azzere 'a passuord toje",
+'userlogin-resetpassword-link' => "T'è scurdate 'a passuord toje?",
 'helplogin-url' => 'Help:Trasenne',
 'userlogin-helplink' => "[[{{MediaWiki:helplogin-url}}|Aijute cu 'a trasute]]",
+'userlogin-loggedin' => "Tu ste jndre ggià cumme a {{GENDER:$1|$1}}.
+Ause 'u module aqquà sotte pe trasè cumme a 'n'otre utende.",
+'userlogin-createanother' => "Ccreje 'n'otre cunde",
 'createacct-join' => "Mitte le 'mbormaziune tune aqquà sotte.",
 'createacct-another-join' => "Mitte le 'mbormaziune d'u cunde nuève aqquà sotte.",
 'createacct-emailrequired' => 'Indirizze email',
@@ -540,7 +542,7 @@ Mitta n'otra vota.",
 'passwordtooshort' => 'Le password onne a essere almene {{PLURAL:$1|1 carattere|$1 carattere}}.',
 'password-name-match' => "'A password toje adda essere diverse da 'u nome utende tue.",
 'password-login-forbidden' => "L'ause de stu nome utende e passuord onne state vietate.",
-'mailmypassword' => 'Passuord nova pe e-mail',
+'mailmypassword' => "Azzere 'a passuord",
 'passwordremindertitle' => 'Passuord temboranea nova pe {{SITENAME}}',
 'passwordremindertext' => "Quacchedune (pò essere tu, da quiste indirizze IP \$1) ha cerchete 'na nova password pe {{SITENAME}} (\$4).
 'Na password temboranea pe l'utende \"\$2\" ha state ccrejete e ha state 'mbostete a \"\$3\".
@@ -553,16 +555,16 @@ Ce quacche otre 'nvece ha fatte sta rechieste, o ce tu t'è recurdate 'a passwor
 'passwordsent' => "'Na nova passuord ha state mannete a l'indirizze e-mail reggistrete pe \"\$1\".
 Pe piacere, colleghete n'otra vota quanne l'è ricevute.",
 'blocked-mailpassword' => "L'indirizze IP tue jè blocchete pe le cangiaminde e accussì tu non ge puè ausà 'a funzione de recupere d'a password pe prevenìe l'abbuse.",
-'eauthentsent' => "'N'e-mail de conferme ha state mannete a l'indirizze ca tu è ditte.
-Apprime ca otre e-mail avènene mannete a 'u cunde tue, tu ha seguì le 'struzione ca stonne jndr'à l'e-mail, pe confermà l'iscrizione.",
+'eauthentsent' => "'N'e-mail de conferme ha state mannate a l'indirizze ca tu è ditte.
+Apprime ca otre e-mail avènene mannate a 'u cunde tune, tu ha seguì le 'struzione ca stonne jndr'à l'e-mail, pe confermà ca 'u cunde jè une de le tune.",
 'throttled-mailpassword' => "'Nu arrecordatore de passuord ha stete già mannate jndr'à {{PLURAL:$1|l'urtema ore|l'urteme $1 ore}}.
 Pe prevenì l'abbuse, sulamende 'nu arrecordatore de passuord avene mannate ogne {{PLURAL:$1|ore|$1 ore}}.",
 'mailerror' => "Errore mannanne 'a mail: $1",
 'acct_creation_throttle_hit' => "Le visitature de sta Uicchi ca stonne ausene stu indirizze IP onne ccrejete {{PLURAL:$1|'nu cunde utende|$1 cunde utinde}} jndr'à l'urteme giurne, e onne raggiunde 'u numere massime ca se pò fà jndr'à stu periode.
 'U resultete jè ca le visitature ca stonne ausene stu indirizze IP non ge ponne ccrejà otre cunde utinde nuève jndr'à stu mumende.",
-'emailauthenticated' => "L'indirizze e-mail ca ne date ha state autendichete 'u sciurne $2 a le $3.",
-'emailnotauthenticated' => "L'indirizze e-mail tue non g'a state angore autendichete.
-Nisciuna mail t'avène mannete pe tutte le seguende dettaglie.",
+'emailauthenticated' => "L'indirizze e-mail ca ne date ha state confermate 'u sciurne $2 a le $3.",
+'emailnotauthenticated' => "L'indirizze e-mail tune non g'a state angore confermate.
+Nisciuna mail t'avène mannate pe tutte le seguende dettaglie.",
 'noemailprefs' => "Specifiche 'n'indirizze e-mail pe ste dettaglie ca onne essere fatiete.",
 'emailconfirmlink' => "Conferme l'indirizze e-mail tue",
 'invalidemailaddress' => "L'indirizze e-mail non ge pò essere accettete cumme l'è scritte purcè tène 'nu formete invalide.
@@ -613,7 +615,7 @@ Pò essere ca tu è già cangete 'a password toje o è richieste una temboranea
 # Special:PasswordReset
 'passwordreset' => "Azzere 'a passuord",
 'passwordreset-text-one' => "Comblete stu module pe azzerà 'a passuord toje.",
-'passwordreset-text-many' => "{{PLURAL:$1|Inghie une de le cambe de date pe azzerà 'a passuord toje.}}",
+'passwordreset-text-many' => "{{PLURAL:$1|Inghie une de le cambe pe azzerà 'a passuord toje.}}",
 'passwordreset-legend' => "Azzere 'a passuord",
 'passwordreset-disabled' => "'U reset de le passuord ha state desabbilitate sus a sta uicchi.",
 'passwordreset-emaildisabled' => "Le funziune de l'email onne state disabbilitate sus a sta uicchi.",
@@ -1004,18 +1006,19 @@ Tu puè vedè ste differenze; pò essere ca stonne cchiù 'mbormaziune jndr'à l
 Otre amministrature sus a {{SITENAME}}ponne angore trasè jndr'à 'u condenute scunnute e 'u ponne scangellà 'n'otra vote ausanne st'inderfacce, senze 'mbostà otre restriziune.",
 'revdelete-confirm' => 'Pe piacere conferme ca tu vuè ccu face sta cose, ce tu è capite le conseguenze e ce quidde ca ste face jè in accorde cu le [[{{MediaWiki:Policy-url}}|reghele]] de Uicchipèdie.',
 'revdelete-suppress-text' => "'A soppressione adda essere ausate '''sulamende''' jndr'à le case seguende:
+* 'Mbormaziune potenzialmende offenzive
 * Date personale inopportune
-*: ''indirizze, numere de telefono, codice fiscale, ecc.''",
+*: ''indirizze, numere de telefono, codece fiscale, ecc.''",
 'revdelete-legend' => "'Mboste le restriziune sus 'a visibbilità",
-'revdelete-hide-text' => "Scunne 'u teste d'a revisione",
+'revdelete-hide-text' => "Teste d'a revisione",
 'revdelete-hide-image' => "Scunne 'u codenute d'u fail",
 'revdelete-hide-name' => 'Scunne azione e obbiettive',
-'revdelete-hide-comment' => 'Scunne le commende de le cangiaminde',
-'revdelete-hide-user' => "Scunne 'u nome utende/IP de quidde ca ha fatte 'u cangiamende",
+'revdelete-hide-comment' => "Cange 'u riepiloghe",
+'revdelete-hide-user' => "Nome utende/IP de quidde ca ha fatte 'u cangiamende",
 'revdelete-hide-restricted' => "Live le date da l'amministratore cumme pe l'otre utinde",
 'revdelete-radio-same' => '(non scè cangianne)',
-'revdelete-radio-set' => 'Sine',
-'revdelete-radio-unset' => 'None',
+'revdelete-radio-set' => 'Scunnute',
+'revdelete-radio-unset' => 'Visibbile',
 'revdelete-suppress' => "Live le date da l'amministrature cumme pe l'otre",
 'revdelete-unsuppress' => 'Live le restriziune sus a le revisiune repristinate',
 'revdelete-log' => 'Mutive:',
@@ -1432,8 +1435,8 @@ Ce tu 'u mitte, a fatje ca è fatte t'avène ricanusciute.",
 'action-block' => "blocche st'utende pe le cangiaminde",
 'action-protect' => "cange 'u levèlle de protezzione pe sta pàgene",
 'action-rollback' => "Annulle velocemende le cangiaminde de l'urteme utende ca ha cangiate 'na pàgena particolare",
-'action-import' => "'mborte sta pàgene da n'otra Uicchi",
-'action-importupload' => "'mborte sta pàgene da 'nu carecamende de 'nu file",
+'action-import' => "'mborte le pàggene da n'otra Uicchi",
+'action-importupload' => "'mborte le pàggene da 'nu carecamende de 'nu file",
 'action-patrol' => "signe l'otre cangiaminde cumme condrollate",
 'action-autopatrol' => 'signà le cangiaminde tue cumme condrollate',
 'action-unwatchedpages' => "vide 'a liste de le pàggene ca non ge sonde condrollete",
@@ -1460,12 +1463,12 @@ Ce tu 'u mitte, a fatje ca è fatte t'avène ricanusciute.",
 'recentchanges-label-minor' => "Quiste ète 'nu cangiamende stuèdeche",
 'recentchanges-label-bot' => "Stu cangiamende ha state fatte da 'nu bot",
 'recentchanges-label-unpatrolled' => "Stu cangiamende non g'à state angore condrollate",
-'recentchanges-legend-newpage' => '$1 - pàgena nove',
+'recentchanges-legend-newpage' => "('ndruche pure [[Special:NewPages|elenghe de le pàggene nuève]])",
 'rcnotefrom' => "Sotte stonne le cangiaminde da '''$2''' (fine a '''$1''' mustrete).",
 'rclistfrom' => 'Fà vedè le urteme cangiaminde partenne da $1',
 'rcshowhideminor' => '$1 cangiaminde stuèdeche',
 'rcshowhidebots' => '$1 bot',
-'rcshowhideliu' => '$1 utende reggistrete',
+'rcshowhideliu' => '$1 utinde reggistrate',
 'rcshowhideanons' => '$1 utende scanusciute',
 'rcshowhidepatr' => '$1 cangiaminde condrollete',
 'rcshowhidemine' => '$1 cangiaminde mie',
@@ -1983,6 +1986,7 @@ Mò s'avène redirette a [[$2]].",
 'listusers' => "Liste de l'utende",
 'listusers-editsonly' => "Fà vedè sulamende l'utinde cu cangiaminde fatte",
 'listusers-creationsort' => 'Arrenghete pe date de ccreazione',
+'listusers-desc' => "Arranghe jndr'à 'n'ordine ca scenne",
 'usereditcount' => '$1 {{PLURAL:$1|cangiamende|cangiaminde}}',
 'usercreated' => "{{GENDER:$3|Ccrejate}} 'u $1 a le ore $2",
 'newpages' => 'Pàggene nuève',
@@ -2198,14 +2202,14 @@ Le cangiaminde future a sta pàgene e 'a pàgene de le 'ngazzaminde associete le
 
 Riepileghe de le cangiaminde: \$PAGESUMMARY \$PAGEMINOREDIT
 
-Condatte l'editore:
+Condatte 'u cangiatore:
 mail: \$PAGEEDITOR_EMAIL
 uicchi: \$PAGEEDITOR_WIKI
 
 Non ge stonne otre notifiche ce tu face otre attivitate senze ca tu visite sta pàgene.
-Tu puè pure azzerà 'a spunde de le notifiche pe tutte le pàggene condrollate jndr'à lista toje.
+Tu puè pure azzerà 'a spunde de le notifiche pe tutte le pàggene condrollate jndr'à l'elenghe tune.
 
-             Statte Bbuene, 'u sisteme de notificaziune de {{SITENAME}}
+Statte Bbuene, 'u sisteme de notificaziune de {{SITENAME}}
 
 --
 Pe cangià le 'mbostaziune de notifeche de l'email toje, vè vide
@@ -2214,7 +2218,7 @@ Pe cangià le 'mbostaziune de notifeche de l'email toje, vè vide
 Pe cangià le 'mbostaziune de l'elenghe de le pàggene condrollate tune, vè vide
 {{canonicalurl:{{#special:EditWatchlist}}}}
 
-Pe scangellà 'a pàgene da 'a liste de le pàggene condrollate, vè vide
+Pe scangellà 'a pàgene da l'elenghe de le pàggene condrollate, vè vide
 \$UNWATCHURL
 
 Segnalaziune e otre assistenze:
@@ -2246,9 +2250,11 @@ Vide $2 pe \'na reggistrazione de le scangellaziune recende.',
 'deleteotherreason' => 'Otre mutive de cchiù:',
 'deletereasonotherlist' => 'Otre mutive',
 'deletereason-dropdown' => "*Mutive comune de scangellaminde
-** Richieste de l'autore
+** Rummate
+** Vandalisme
 ** Violazione d'u Copyright
-** Vandalisme",
+** Richieste de l'autore
+** Redirezionamende scuasciate",
 'delete-edit-reasonlist' => 'Mutive de scangellazione de le cangiaminde',
 'delete-toobig' => "Sta pàgene tène 'na storie de cangiaminde troppe longhe, sus a $1 {{PLURAL:$1|revisione|revisiune}}.
 'U scangellamende de stuèzze de pàgene avène ristrette pe prevenì 'ngasinaminde accidentale de {{SITENAME}}.",
@@ -2271,7 +2277,7 @@ quacche otre ha cangiate o annullate ggià 'a pàgene.
 L'urteme cangiamende d'a pàgene ere de [[User:$3|$3]] ([[User talk:$3|'Ngazzaminde]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
 'editcomment' => "'U riepileghe d'u cangiamende ere: \"''\$1''\".",
 'revertpage' => "Cangiaminde annullate da [[Special:Contributions/$2|$2]] ([[User talk:$2|Talk]]) a l'urtema versione da [[User:$1|$1]]",
-'revertpage-nouser' => "Le cangiaminde annullate da (nome utende luate) a l'urtema revisione da [[User:$1|$1]]",
+'revertpage-nouser' => "Le cangiaminde annullate da 'n'utende scunnute a l'urtema revisione da {{GENDER:$1|[[User:$1|$1]]}}",
 'rollback-success' => "Cangiaminde annullate da $1;
 turnate rete a l'urtema versione da $2.",
 
@@ -2417,7 +2423,7 @@ $1",
 'contributions' => "Condrebbute de l'{{GENDER:$1|utende}}",
 'contributions-title' => "Condrebbute de l'utende pe $1",
 'mycontris' => 'Condrebbute mie',
-'contribsub2' => 'Pe $1 ($2)',
+'contribsub2' => 'Pe {{GENDER:$3|$1}} ($2)',
 'nocontribs' => 'Nisciune cangiamende ha state acchiate cu ste criterie.',
 'uctop' => '(de mò)',
 'month' => "Da 'u mese (e cchiù recende):",
@@ -2561,7 +2567,7 @@ Vide 'a [[Special:BlockList|liste de le IP bloccate]] pa liste de le operaziune
 'range_block_disabled' => "L'abbilità de le amministrature de ccrejà blocche a indervalle jè disabbilitate.",
 'ipb_expiry_invalid' => "L'orarije de scadenze non g'è valide.",
 'ipb_expiry_temp' => "Le blocche sus a le nome de l'utinde scunnute onna essere permanende.",
-'ipb_hide_invalid' => 'Non ge se pò scangellà stu cunde utende; tène troppe cangiaminde.',
+'ipb_hide_invalid' => "Non ge se pò scangellà stu cunde utende; tène cchiù de troppe  {{PLURAL:$1|'nu cangiamede|$1 cangiaminde}}.",
 'ipb_already_blocked' => '"$1" jè ggià blocchete',
 'ipb-needreblock' => "$1 ha state già blocchete. Vuè cu cange le 'mbostaziune?",
 'ipb-otherblocks-header' => 'Otre {{PLURAL:$1|blocche|blocche}}',
@@ -2894,6 +2900,7 @@ Puè vedè sulamende 'u sorgende.",
 Permette de aggiungere 'nu mutive jndr'à 'u riepileghe",
 'tooltip-preferences-save' => 'Reggistre le preferenze',
 'tooltip-summary' => "Mitte 'nu riepileghe piccinne",
+'interlanguage-link-title' => '$1 - $2',
 
 # Stylesheets
 'common.css' => "/* 'U CSS ca se iacchie aqquà avène applicate a tutte le masckere */",
@@ -3046,7 +3053,7 @@ Ce l'esegue sus a 'u sisteme tue pò essere ca se combromette.",
 'svg-long-desc' => "Fail SVG, nominalmende sonde $1 × $2 pixel, dimenzione d'u fail: $3",
 'svg-long-desc-animated' => "File SVG animate, nominalmende sonde $1 × $2 pixel, dimenzione d'u file: $3",
 'svg-long-error' => 'File SVG invalide: $1',
-'show-big-image' => 'Risoluzione chiena chiena',
+'show-big-image' => 'File origgenale',
 'show-big-image-preview' => 'Dimenziune de sta andeprime: $1.',
 'show-big-image-other' => 'Otre {{PLURAL:$2|resoluzione|resoluziune}}: $1.',
 'show-big-image-size' => '$1 x $2 pixel',
@@ -3079,7 +3086,7 @@ Ce l'esegue sus a 'u sisteme tue pò essere ca se combromette.",
 'seconds' => '{{PLURAL:$1|seconde|seconde}}',
 'minutes' => '{{PLURAL:$1|$1 minute|$1 minute}}',
 'hours' => '{{PLURAL:$1|$1ore|$1 ore}}',
-'days' => '{{PLURAL:$1|$1 sciurne|$1 sciurne}}',
+'days' => '{{PLURAL:$1|$1 sciurne}}',
 'weeks' => '{{PLURAL:$1|$1 sumàne}}',
 'months' => '{{PLURAL:$1|$1 mese|$1 mise}}',
 'years' => '{{PLURAL:$1|$1 anne}}',
@@ -3725,6 +3732,9 @@ Pe piacere conferme ca tu vuè avveramende reccrejà sta pàgene.",
 'imgmultigo' => 'Veje!',
 'imgmultigoto' => "Veje 'a pàgene $1",
 
+# Language selector for translatable SVGs
+'img-lang-go' => 'Véje',
+
 # Table pager
 'ascending_abbrev' => 'asc',
 'descending_abbrev' => 'desc',
@@ -3888,6 +3898,13 @@ Tu puè pure [[Special:EditWatchlist|ausà 'u cangiatore standàrd]].",
 'version-version' => '(Versione $1)',
 'version-svn-revision' => '(r$2)',
 'version-license' => 'Licenze',
+'version-ext-license' => 'Licenze',
+'version-ext-colheader-name' => 'Estenzione',
+'version-ext-colheader-version' => 'Versione',
+'version-ext-colheader-license' => 'Licenze',
+'version-ext-colheader-description' => 'Descrizione',
+'version-ext-colheader-credits' => 'Auture',
+'version-license-title' => 'Licenziate pe $1',
 'version-poweredby-credits' => "Sta Uicchi jè fatte da '''[https://www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
 'version-poweredby-others' => 'otre',
 'version-poweredby-translators' => 'tradutture de translatewiki.net',
@@ -3907,11 +3924,12 @@ Avisse avè ricevute [{{SERVER}}{{SCRIPTPATH}}/COPYING 'na copie d'a GNU (Licenz
 # Special:Redirect
 'redirect' => "Redirette da 'u file, utende o ID d'a revisione",
 'redirect-legend' => "Redirette a 'nu file o 'na pàgene",
-'redirect-summary' => "Sta pàgena speciale redirezione a 'nu file (date 'u nome d'u file), 'na pàgene (fate 'n'ID de revisione), o 'na pàgene utende (date 'n'ID numeriche de l'utende).",
+'redirect-summary' => "Sta pàgena speciale redirezione a 'nu file (date 'u nome d'u file), 'na pàgene (date 'n'ID de revisione), o 'na pàgene utende (date 'n'ID numeriche de l'utende). Ause: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/revision/328429]], o [[{{#Special:Redirect}}/user/101]].",
 'redirect-submit' => 'Véje',
 'redirect-lookup' => 'Mappature:',
 'redirect-value' => 'Valore:',
 'redirect-user' => "ID de l'utende",
+'redirect-page' => "ID d'a pàgene",
 'redirect-revision' => "Revisione d'a pàgene",
 'redirect-file' => "Nome d'u file",
 'redirect-not-exists' => 'Valore non acchiate',
@@ -3929,9 +3947,9 @@ Avisse avè ricevute [{{SERVER}}{{SCRIPTPATH}}/COPYING 'na copie d'a GNU (Licenz
 
 # Special:SpecialPages
 'specialpages' => 'Pàggene speciele',
+'specialpages-note-top' => 'Leggende',
 'specialpages-note' => '* Pàggene speciale normale.
-* <span class="mw-specialpagerestricted">Pàggene speciale cu le restriziune.</span>
-* <span class="mw-specialpagecached">Pàggene speciale in memorie cache (ponne essere vecchie).</span>',
+* <span class="mw-specialpagerestricted">Pàggene speciale cu le restriziune.</span>',
 'specialpages-group-maintenance' => "Report d'a manutenzione",
 'specialpages-group-other' => 'Otre pàggene speciele',
 'specialpages-group-login' => 'Tràse / Reggistrate',
@@ -3969,7 +3987,10 @@ Avisse avè ricevute [{{SERVER}}{{SCRIPTPATH}}/COPYING 'na copie d'a GNU (Licenz
 'tags-tag' => "Nome d'u tag",
 'tags-display-header' => "Accumme parene sus 'a liste de le cangiaminde",
 'tags-description-header' => "Descriziona comblete d'u significhete",
+'tags-active-header' => 'Attive?',
 'tags-hitcount-header' => 'Cangiaminde taggate',
+'tags-active-yes' => 'Sìne',
+'tags-active-no' => 'None',
 'tags-edit' => 'cange',
 'tags-hitcount' => '$1 {{PLURAL:$1|cangiamende|cangiaminde}}',
 
@@ -4114,10 +4135,10 @@ Ce nò, tu puè ausà 'u module facile aqquà sotte. 'U commende tune avène agg
 # Durations
 'duration-seconds' => '{{PLURAL:$1|seconde|seconde}}',
 'duration-minutes' => '{{PLURAL:$1|minute|minute}}',
-'duration-hours' => '{{PLURAL:$1|ore|ore}}',
+'duration-hours' => '$1 {{PLURAL:$1|ore}}',
 'duration-days' => '$1 {{PLURAL:$1|sciurne|sciurne}}',
-'duration-weeks' => '{{PLURAL:$1|sumàne|sumàne}}',
-'duration-years' => '{{PLURAL:$1|anne|anne}}',
+'duration-weeks' => '$1 {{PLURAL:$1|sumàne}}',
+'duration-years' => '$1 {{PLURAL:$1|anne}}',
 'duration-decades' => '$1 {{PLURAL:$1|decade|decade}}',
 'duration-centuries' => '$1 {{PLURAL:$1|sechele|sechele}}',
 'duration-millennia' => '$1 {{PLURAL:$1|millennie|millennie}}',
@@ -4157,4 +4178,6 @@ In pratiche tutte quidde ca stè jndr'à le doppie parendesi graffe.<br />",
 'expand_templates_generate_xml' => "Fà vedè l'arvule de l'analisi XML",
 'expand_templates_preview' => 'Andeprime',
 
+# Unknown messages
+'uploadinvalidxml' => "L'XML jndr'à 'u file carecate non ge pò essere analizzate.",
 );
index 756a108..f34c369 100644 (file)
@@ -453,7 +453,6 @@ $messages = array(
 'tog-numberheadings' => 'Автоматически нумеровать заголовки',
 'tog-showtoolbar' => 'Показывать верхнюю панель инструментов при редактировании',
 'tog-editondblclick' => 'Править страницы по двойному щелчку',
-'tog-editsection' => 'Показывать ссылку «править» для каждой секции',
 'tog-editsectiononrightclick' => 'Править секции при правом щелчке мышью на заголовке',
 'tog-showtoc' => 'Показывать оглавление (для страниц более чем с 3 заголовками)',
 'tog-rememberpassword' => 'Помнить мою учётную запись в этом браузере (не более $1 {{PLURAL:$1|дня|дней}})',
@@ -464,8 +463,8 @@ $messages = array(
 'tog-minordefault' => 'Помечать по умолчанию правки как малозначимые',
 'tog-previewontop' => 'Помещать предпросмотр перед окном редактирования',
 'tog-previewonfirst' => 'Показывать предпросмотр при переходе к редактированию',
-'tog-enotifwatchlistpages' => 'Уведомлять по эл. почте об изменениях страниц и файлов из списка наблюдения',
-'tog-enotifusertalkpages' => 'Уведомлять по эл. почте об изменении персональной страницы обсуждения',
+'tog-enotifwatchlistpages' => 'Уведомлять по электронной почте об изменениях страниц и файлов из списка наблюдения',
+'tog-enotifusertalkpages' => 'Уведомлять по электронной почте об изменении персональной страницы обсуждения',
 'tog-enotifminoredits' => 'Уведомлять даже при незначительных изменениях страниц и файлов',
 'tog-enotifrevealaddr' => 'Показывать мой почтовый адрес в сообщениях оповещения',
 'tog-shownumberswatching' => 'Показывать число участников, включивших страницу в свой список наблюдения',
@@ -478,7 +477,7 @@ $messages = array(
 'tog-watchlisthideminor' => 'Скрывать малые правки из списка наблюдения',
 'tog-watchlisthideliu' => 'Скрывать правки представившихся участников из списка наблюдения',
 'tog-watchlisthideanons' => 'Скрывать правки анонимных участников из списка наблюдения',
-'tog-watchlisthidepatrolled' => 'СкÑ\80Ñ\8bваÑ\82Ñ\8c Ð¾Ñ\82паÑ\82Ñ\80Ñ\83лиÑ\80ованнÑ\8bе Ð¿Ñ\80авки Ð² Ñ\81пиÑ\81ке наблюдения',
+'tog-watchlisthidepatrolled' => 'СкÑ\80Ñ\8bваÑ\82Ñ\8c Ð¾Ñ\82паÑ\82Ñ\80Ñ\83лиÑ\80ованнÑ\8bе Ð¿Ñ\80авки Ð¸Ð· Ñ\81пиÑ\81ка наблюдения',
 'tog-ccmeonemails' => 'Отправлять мне копии писем, которые я посылаю другим участникам',
 'tog-diffonly' => 'Не показывать содержание страницы под сравнением двух версий',
 'tog-showhiddencats' => 'Показывать скрытые категории',
@@ -804,7 +803,7 @@ $1',
 'formerror' => 'Ошибка: невозможно передать данные формы',
 'badarticleerror' => 'Это действие не может быть выполнено на данной странице.',
 'cannotdelete' => 'Невозможно удалить или переименовать страницу или файл «$1».
\92озможно, Ñ\81Ñ\82Ñ\80аниÑ\86а Ñ\83же Ð±Ñ\8bла Ñ\83далена.',
\92озможно, Ñ\83же Ð±Ñ\8bло Ð¿Ñ\80оизведено Ñ\83даление.',
 'cannotdelete-title' => 'Нельзя удалить страницу «$1»',
 'delete-hook-aborted' => 'Правка отменена процедурой-перехватчиком.
 Дополнительных пояснений не приведено.',
@@ -863,7 +862,7 @@ $2',
 'yourname' => 'Имя учётной записи:',
 'userlogin-yourname' => 'Имя учётной записи',
 'userlogin-yourname-ph' => 'Введите имя вашей учётной записи',
-'createacct-another-username-ph' => 'Введите имя вашей учётной записи',
+'createacct-another-username-ph' => 'Введите имя учётной записи',
 'yourpassword' => 'Пароль:',
 'userlogin-yourpassword' => 'Пароль',
 'userlogin-yourpassword-ph' => 'Введите свой пароль',
@@ -897,7 +896,7 @@ $2',
 'helplogin-url' => 'Help:Представление системе',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Помощь со входом в систему]]',
 'userlogin-loggedin' => 'Вы уже вошли как {{GENDER:$1|$1}}.
\98Ñ\81полÑ\8cзÑ\83йÑ\82е Ñ\84оÑ\80мÑ\83 Ð½Ð¸Ð¶Ðµ, Ñ\87Ñ\82обÑ\8b Ð²Ð¾Ð¹Ñ\82и Ð¿Ð¾Ð´ Ð´Ñ\80Ñ\83гим Ð¿Ð¾Ð»Ñ\8cзоваÑ\82елем.',
\98Ñ\81полÑ\8cзÑ\83йÑ\82е Ñ\84оÑ\80мÑ\83 Ð½Ð¸Ð¶Ðµ, Ñ\87Ñ\82обÑ\8b Ð²Ð¾Ð¹Ñ\82и Ð¿Ð¾Ð´ Ð´Ñ\80Ñ\83гой Ñ\83Ñ\87Ñ\91Ñ\82ной Ð·Ð°Ð¿Ð¸Ñ\81Ñ\8cÑ\8e.',
 'userlogin-createanother' => 'Создать другую учётную запись',
 'createacct-join' => 'Введите свои данные ниже.',
 'createacct-another-join' => 'Введите данные новой учётной записи ниже.',
@@ -905,7 +904,7 @@ $2',
 'createacct-emailoptional' => 'Адрес электронной почты (необязательно)',
 'createacct-email-ph' => 'Введите свой адрес электронной почты',
 'createacct-another-email-ph' => 'Введите адрес электронной почты',
-'createaccountmail' => 'Ð\98Ñ\81полÑ\8cзоваÑ\82Ñ\8c Ñ\81генеÑ\80иÑ\80ованнÑ\8bй Ñ\81лÑ\83Ñ\87айнÑ\8bм Ð¾Ð±Ñ\80азом Ð²Ñ\80еменнÑ\8bй Ð¿Ð°Ñ\80олÑ\8c Ð¸ Ð²Ñ\8bÑ\81лаÑ\82Ñ\8c Ð¼Ð½Ðµ ÐµÐ³Ð¾ Ð½Ð° Ñ\83казаннÑ\8bй Ð°Ð´Ñ\80еÑ\81 Ñ\8dлекÑ\82Ñ\80онной Ð¿Ð¾Ñ\87Ñ\82Ñ\8b',
+'createaccountmail' => 'Использовать сгенерированный случайным образом временный пароль и выслать его на указанный адрес электронной почты',
 'createacct-realname' => 'Настоящее имя (необязательно)',
 'createaccountreason' => 'Причина:',
 'createacct-reason' => 'Причина',
@@ -914,7 +913,7 @@ $2',
 'createacct-imgcaptcha-ph' => 'Введите текст, который вы видите выше',
 'createacct-submit' => 'Создать учётную запись',
 'createacct-another-submit' => 'Создать ещё одну учётную запись',
-'createacct-benefit-heading' => '{{SITENAME}} создают такие же люди, как вы.',
+'createacct-benefit-heading' => '{{SITENAME}} — совместный труд таких же людей, как вы.',
 'createacct-benefit-body1' => '{{PLURAL:$1|правка|правок|правки}}',
 'createacct-benefit-body2' => '{{PLURAL:$1|статья|статей|статьи}}',
 'createacct-benefit-body3' => '{{PLURAL:$1|участник|участников|участника}} за последнее время',
@@ -1007,6 +1006,8 @@ $2',
 'retypenew' => 'Повторите ввод нового пароля:',
 'resetpass_submit' => 'Установить пароль и представиться',
 'changepassword-success' => 'Ваш пароль был успешно изменён!',
+'changepassword-throttled' => 'Вы сделали слишком много попыток представиться системе.
+Пожалуйста, подождите $1 перед тем, как попробовать снова.',
 'resetpass_forbidden' => 'Пароль не может быть изменён',
 'resetpass-no-info' => 'Чтобы обращаться непосредственно к этой странице, вам следует представиться системе.',
 'resetpass-submit-loggedin' => 'Изменить пароль',
@@ -1064,6 +1065,8 @@ $2
 'changeemail-password' => 'Ваш пароль для проекта «{{SITENAME}}»:',
 'changeemail-submit' => 'Изменить адрес',
 'changeemail-cancel' => 'Отмена',
+'changeemail-throttled' => 'Вы сделали слишком много попыток представиться системе.
+Пожалуйста, подождите $1 перед тем, как попробовать снова.',
 
 # Special:ResetTokens
 'resettokens' => 'Сбросить токены',
@@ -1288,6 +1291,8 @@ $2
 'content-not-allowed-here' => 'Содержимое "$1" недопустимо на странице [[$2]]',
 'editwarning-warning' => 'Переход на другую страницу может привести к потере сделанных вами изменений.
 Если вы зарегистрированы в системе, то вы можете отключить это предупреждение в разделе «Редактирование» ваших настроек.',
+'editpage-notsupportedcontentformat-title' => 'Формат содержимого не поддерживается',
+'editpage-notsupportedcontentformat-text' => 'Формат содержимого $1 не поддерживается моделью содержимого $2.',
 
 # Content models
 'content-model-wikitext' => 'вики-текст',
@@ -1537,6 +1542,7 @@ $1",
 'search-result-score' => 'Релевантность: $1%.',
 'search-redirect' => '(перенаправление с $1)',
 'search-section' => '(раздел «$1»)',
+'search-file-match' => '(совпадает с содержимым файла)',
 'search-suggest' => 'Возможно, вы имели в виду «$1».',
 'search-interwiki-caption' => 'Родственные проекты',
 'search-interwiki-default' => '$1 результ.:',
@@ -1984,6 +1990,8 @@ $1",
 Если вы всё-таки хотите загрузить этот файл, пожалуйста, вернитесь назад и измените имя файла. [[File:$1|thumb|center|$1]]',
 'file-exists-duplicate' => 'Этот файл является дубликатом {{PLURAL:$1|1=следующего файла|следующих файлов}}:',
 'file-deleted-duplicate' => 'Подобный файл ([[:$1]]) уже удалялся. Пожалуйста, ознакомьтесь с историей удаления файла, прежде чем загружать его снова.',
+'file-deleted-duplicate-notitle' => 'Файл, идентичный этому файлу, был ранее удалён, а имя файла было запрещено.
+Вам следует попросить кого-нибудь с правами просмотра данных по запрещённым файлам, чтобы он проанализировал ситуацию перед тем, как загружать файл снова.',
 'uploadwarning' => 'Предупреждение',
 'uploadwarning-text' => 'Пожалуйста, измените представленное ниже описание файла и попробуйте ещё раз.',
 'savefile' => 'Записать файл',
@@ -2362,6 +2370,7 @@ $1',
 'protectedpages' => 'Защищённые страницы',
 'protectedpages-indef' => 'Только бессрочные защиты',
 'protectedpages-cascade' => 'Только каскадная защита',
+'protectedpages-noredirect' => 'Скрыть перенаправления',
 'protectedpagesempty' => 'В настоящий момент нет защищённых страниц с указанными параметрами',
 'protectedtitles' => 'Защищённые названия',
 'protectedtitlesempty' => 'В настоящий момент нет запрещённых названий с указанными параметрами.',
@@ -2640,7 +2649,7 @@ $UNWATCHURL
 'delete-warning-toobig' => 'У этой страницы очень длинная история изменений, более $1 {{PLURAL:$1|версии|версий}}.
 Её удаление может привести к нарушению нормальной работы базы данных сайта «{{SITENAME}}»;
 действуйте с осторожностью.',
-'deleting-backlinks-warning' => "'''Ð\9fÑ\80едÑ\83пÑ\80еждение.''' Ð\9dекоÑ\82оÑ\80Ñ\8bе Ð´Ñ\80Ñ\83гие Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\8b Ñ\81Ñ\81Ñ\8bлаÑ\8eÑ\82Ñ\81Ñ\8f Ð½Ð° Ð´Ð°Ð½Ð½Ñ\83Ñ\8e Ñ\83далÑ\8fемÑ\83Ñ\8e Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83.",
+'deleting-backlinks-warning' => "'''Ð\9fÑ\80едÑ\83пÑ\80еждение.''' Ð\94Ñ\80Ñ\83гие Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\8b Ñ\81Ñ\81Ñ\8bлаÑ\8eÑ\82Ñ\81Ñ\8f Ð¸Ð»Ð¸ Ñ\81одеÑ\80жаÑ\82 Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83, ÐºÐ¾Ñ\82оÑ\80Ñ\83Ñ\8e Ð²Ñ\8b Ñ\81обиÑ\80аеÑ\82еÑ\81Ñ\8c Ñ\83далиÑ\82Ñ\8c.",
 
 # Rollback
 'rollback' => 'Откатить изменения',
@@ -2874,6 +2883,7 @@ $1',
 См. [[Special:BlockList|список заблокированных IP-адресов]] для просмотра блокировок.',
 'ipb-blockingself' => 'Вы пытаетесь заблокировать себя самого! Вы уверены, что вы хотите это сделать?',
 'ipb-confirmhideuser' => 'Вы намереваетесь заблокировать участника и скрыть его имя. Оно не будет отображаться в списках и журналах. Вы уверены, что хотите это сделать?',
+'ipb-confirmaction' => 'Если вы уверены, что вы действительно хотите сделать это, пожалуйста, поставьте ниже отметку «{{int:ipb-confirm}}».',
 'ipb-edit-dropdown' => 'Править список причин',
 'ipb-unblock-addr' => 'Разблокировать $1',
 'ipb-unblock' => 'Разблокировать участника или IP-адрес',
@@ -2935,7 +2945,7 @@ $1',
 'range_block_disabled' => 'Администраторам запрещено блокировать диапазоны.',
 'ipb_expiry_invalid' => 'Недопустимый период действия.',
 'ipb_expiry_temp' => 'Блокировки с сокрытием имени участника должны быть бессрочными.',
-'ipb_hide_invalid' => 'Ð\9dевозможно Ñ\81кÑ\80Ñ\8bÑ\82Ñ\8c Ñ\83Ñ\87Ñ\91Ñ\82нÑ\83Ñ\8e Ð·Ð°Ð¿Ð¸Ñ\81Ñ\8c, Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾, Ñ\81 Ð½ÐµÑ\91 Ñ\81делано Ñ\81лиÑ\88ком Ð¼Ð½Ð¾Ð³Ð¾ Ð¿Ñ\80авок.',
+'ipb_hide_invalid' => 'Ð\9dевозможно Ñ\81кÑ\80Ñ\8bÑ\82Ñ\8c Ñ\8dÑ\82Ñ\83 Ñ\83Ñ\87Ñ\91Ñ\82нÑ\83Ñ\8e Ð·Ð°Ð¿Ð¸Ñ\81Ñ\8c, Ñ\81 Ð½ÐµÑ\91 Ñ\81делано Ð±Ð¾Ð»ÐµÐµ {{PLURAL:$1|одной Ð¿Ñ\80авки|$1 Ð¿Ñ\80авок}}.',
 'ipb_already_blocked' => '«$1» уже заблокирован.',
 'ipb-needreblock' => '$1 уже {{GENDER:$1|заблокирован|заблокирована}}. Хотите изменить параметры блокировки?',
 'ipb-otherblocks-header' => '{{PLURAL:$1|1=Другая блокировка|Другие блокировки}}',
@@ -4153,6 +4163,16 @@ $5
 'version-hook-subscribedby' => 'Подписан на',
 'version-version' => '(Версия $1)',
 'version-license' => 'Лицензия MediaWiki',
+'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' => 'Лицензия для $1',
+'version-license-not-found' => 'Для этого расширения нет подробных сведений о лицензии.',
+'version-credits-title' => 'Список авторов для $1',
+'version-credits-not-found' => 'Для этого расширения нет подробных сведений об авторах.',
 'version-poweredby-credits' => "Эта вики работает на движке '''[https://www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
 'version-poweredby-others' => 'другие',
 'version-poweredby-translators' => 'переводчики translatewiki.net',
@@ -4179,6 +4199,7 @@ MediaWiki распространяется в надежде, что она бу
 'redirect-lookup' => 'Поиск:',
 'redirect-value' => 'Значение:',
 'redirect-user' => 'Идентификатор участника',
+'redirect-page' => 'Идентификатор страницы',
 'redirect-revision' => 'Версия страницы',
 'redirect-file' => 'Название файла',
 'redirect-not-exists' => 'Значение не найдено',
@@ -4372,6 +4393,7 @@ MediaWiki распространяется в надежде, что она бу
 'api-error-overwrite' => 'Не допускается замена существующего файла.',
 'api-error-stashfailed' => 'Внутренняя ошибка: сервер не смог сохранить временный файл.',
 'api-error-publishfailed' => 'Внутренняя ошибка: сервер не смог сохранить временный файл.',
+'api-error-stasherror' => 'При загрузке файла в хранилище произошла ошибка.',
 'api-error-timeout' => 'Сервер не отвечает в течение ожидаемого времени.',
 'api-error-unclassified' => 'Произошла неизвестная ошибка',
 'api-error-unknown-code' => 'Неизвестная ошибка: «$1»',
@@ -4420,10 +4442,14 @@ MediaWiki распространяется в надежде, что она бу
 'expand_templates_input' => 'Входной текст:',
 'expand_templates_output' => 'Результат',
 'expand_templates_xml_output' => 'XML вывод',
+'expand_templates_html_output' => 'HTML-вывод',
 'expand_templates_ok' => 'OK',
 'expand_templates_remove_comments' => 'Удалить комментарии',
 'expand_templates_remove_nowiki' => 'Подавлять теги <nowiki> в результате',
 'expand_templates_generate_xml' => 'Показать дерево разбора XML',
+'expand_templates_generate_rawhtml' => 'Показать HTML',
 'expand_templates_preview' => 'Предпросмотр',
 
+# Unknown messages
+'uploadinvalidxml' => 'XML в загруженном файле не может быть проанализирован.',
 );
index 3a6041d..c7b28de 100644 (file)
@@ -127,7 +127,6 @@ $messages = array(
 'tog-numberheadings' => 'Автоматічно чісловати надписы',
 'tog-showtoolbar' => 'Вказати панел інштрументів',
 'tog-editondblclick' => 'Едітовати двоїтым кликом',
-'tog-editsection' => 'Дозволити едітованя секції сторінкы через одказ [едіт.]',
 'tog-editsectiononrightclick' => 'Дозволити едітованя секції сторінкы через кликаня правов клапков мышкы на надписы сторінок',
 'tog-showtoc' => 'Вказовати обсяг (на сторінках з веце як трёма надписами)',
 'tog-rememberpassword' => 'Запамнятати моє приголошіня на тім переглядачу (максімално $1 {{PLURAL:$1|день|днів}})',
index 1d0f27e..1686aec 100644 (file)
@@ -288,7 +288,6 @@ $messages = array(
 'tog-numberheadings' => 'शीर्षकान् स्वयमेव सक्रमांकीकरोतु।',
 'tog-showtoolbar' => 'सम्पादन-उपकरण-पट्टिका दर्श्यताम् (जावालिपिः अपेक्ष्यते)',
 'tog-editondblclick' => 'द्विक्लिक्कारेण पृष्ठानि सम्पाद्यन्ताम् (जावालिपिः अपेक्ष्यते)',
-'tog-editsection' => '[संपादयतु़] इति संबंधनद्वारा विभाग-संपादनं समर्थयतु।',
 'tog-editsectiononrightclick' => 'विभागशीर्षकाणामुपरि दक्षिणक्लिक्करणेन विभागसम्पादनं समर्थ्यताम् (जावालिपिः अपेक्ष्यते)।',
 'tog-showtoc' => 'विषयानुक्रमणिका दर्श्यताम् (त्र्यधिकशीर्षकयुतेषु पृष्ठेषु)।',
 'tog-rememberpassword' => 'अस्मिन् सङ्गणके मम प्रवेशः स्मर्यताम् (अधिकतमम् $1 {{PLURAL:$1|दिनम्|दिनानि}})',
index 5298a22..c2492ba 100644 (file)
@@ -55,7 +55,6 @@ $messages = array(
 'tog-numberheadings' => 'Бас тыллары нүөмэрдээ',
 'tog-showtoolbar' => 'Көннөрүү үстүрүмүөннэрин көрдөр',
 'tog-editondblclick' => 'Хоһулатан иккитэ баттаан сирэйи уларытыы',
-'tog-editsection' => '[Көннөрүү] диэн ыйынньыгынан сиэксийэны көннөрүү',
 'tog-editsectiononrightclick' => 'Сиэксийэ баһыгар уҥа тимэҕинэн баттаан сиэксийэни көннөрүү',
 'tog-showtoc' => 'Иһинээҕитин көрдөр (ыстатыйа үстэн ордук бас тыллаах буоллаҕына)',
 'tog-rememberpassword' => 'Миигин бу браузерга сигээ ($1 {{PLURAL:$1|күн|күнтэн ордуга суох}})',
index 32c6c06..25474e2 100644 (file)
@@ -163,7 +163,6 @@ $messages = array(
 'tog-numberheadings' => 'Nummirazzioni automàtica dî tìtuli di paràgrafu',
 'tog-showtoolbar' => 'Ammustra la barra dî strumenta pi lu canciamentu',
 'tog-editondblclick' => "Duppiu click pi canciari l'artìculu (richiedi Javascript)",
-'tog-editsection' => 'Abbìlita lu canciamentu dî sezzioni tràmiti lu culligamentu [cancia]',
 'tog-editsectiononrightclick' => 'Abbìlita lu canciamentu dî sezzioni tràmiti duppiu click supra lu tìtulu dâ sezzioni (richiedi Javascript)',
 'tog-showtoc' => "Ammustra l'ìndici (pi artìculi cu cchiù di 3 sezzioni)",
 'tog-rememberpassword' => 'Arricorda la password supra stu navigaturi (pi ô massimu $1 {{PLURAL:$1|jornu|jorna}})',
index 035f28f..80bca92 100644 (file)
@@ -8,6 +8,7 @@
  * @file
  *
  * @author Kaganer
+ * @author Kolega2357
  * @author Nemo bis
  * @author OC Ripper
  * @author לערי ריינהארט
@@ -217,7 +218,6 @@ $messages = array(
 'tog-numberheadings' => 'Automatski numeriši podnaslove',
 'tog-showtoolbar' => 'Pokaži alatnu traku (potreban JavaScript)',
 'tog-editondblclick' => 'Izmijeni stranice dvostrukim klikom (potreban JavaScript)',
-'tog-editsection' => 'Omogući uređivanje sekcija preko [uredi] linkova',
 'tog-editsectiononrightclick' => 'Uključite uređivanje odjeljka sa pritiskom na desno dugme miša u naslovu odjeljka (JavaScript)',
 'tog-showtoc' => 'Prikaži sadržaj (u svim stranicama sa više od tri podnaslova)',
 'tog-rememberpassword' => 'Upamti moju prijavu za ovaj preglednik (za maksimum od $1 {{PLURAL:$1|dan|dana}})',
@@ -262,7 +262,7 @@ $messages = array(
 
 # Dates
 'sunday' => 'nedjelja',
-'monday' => 'ponedjeljak',
+'monday' => 'Ponedjeljak / Понедељак',
 'tuesday' => 'utorak',
 'wednesday' => 'srijeda',
 'thursday' => 'četvrtak',
@@ -346,18 +346,18 @@ $messages = array(
 'about' => 'O...',
 'article' => 'Stranica sadržaja (članak)',
 'newwindow' => '(otvara se u novom prozoru)',
-'cancel' => 'Poništi',
+'cancel' => 'Odustani - Одустани',
 'moredotdotdot' => 'Još...',
 'morenotlisted' => 'Više nije prikazano...',
 'mypage' => 'Stranica',
-'mytalk' => 'Razgovor',
+'mytalk' => 'Moj razgovor / Мој разговор',
 'anontalk' => 'Razgovor za ovu IP adresu',
 'navigation' => 'Navigacija',
 'and' => '&#32;i',
 
 # Cologne Blue skin
 'qbfind' => 'Pronađite',
-'qbbrowse' => 'Prelistajte',
+'qbbrowse' => 'Pregledaj - Прегледај',
 'qbedit' => 'Uredi',
 'qbpageoptions' => 'Opcije stranice',
 'qbmyoptions' => 'Moje opcije',
@@ -382,18 +382,18 @@ $messages = array(
 'variants' => 'Varijante',
 
 'navigation-heading' => 'Navigacijski meni',
-'errorpagetitle' => 'Greška',
+'errorpagetitle' => 'Greška - Грешка',
 'returnto' => 'Povratak na $1.',
 'tagline' => 'Izvor: {{SITENAME}}',
 'help' => 'Pomoć',
-'search' => 'Pretraga',
+'search' => 'Traži / Тражи',
 'searchbutton' => 'Traži',
-'go' => 'Idi',
+'go' => 'Idi - Иди',
 'searcharticle' => 'Idi',
 'history' => 'Historija stranice',
 'history_short' => 'Historija',
 'updatedmarker' => 'promjene od moje zadnje posjete',
-'printableversion' => 'Verzija za ispis',
+'printableversion' => 'Za štampanje / За штампање',
 'permalink' => 'Trajni link',
 'print' => 'Štampa',
 'view' => 'Vidi',
@@ -401,22 +401,22 @@ $messages = array(
 'create' => 'Napravi',
 'editthispage' => 'Uredite ovu stranicu',
 'create-this-page' => 'Stvori ovu stranicu',
-'delete' => 'Obriši',
+'delete' => 'Obrisati - Обрисати',
 'deletethispage' => 'Obriši ovu stranicu',
 'undeletethispage' => 'Vrati ovu stranicu',
 'undelete_short' => 'Vrati obrisanih {{PLURAL:$1|$1 izmjenu|$1 izmjene|$1 izmjena}}',
 'viewdeleted_short' => 'Pogledaj {{PLURAL:$1|jednu obrisanu izmjenu|$1 obrisane izmjene|$1 obrisanih izmjena}}',
-'protect' => 'Zaštiti',
+'protect' => 'Zaštiti / Заштити',
 'protect_change' => 'promijeni',
 'protectthispage' => 'Zaštiti ovu stranicu',
 'unprotect' => 'Promijeni zaštitu',
 'unprotectthispage' => 'Promijeni zaštitu za ovu stranicu',
-'newpage' => 'Nova stranica',
+'newpage' => 'Nova stranica / Нова страница',
 'talkpage' => 'Razgovaraj o ovoj stranici',
 'talkpagelinktext' => 'Razgovor',
 'specialpage' => 'Posebna stranica',
 'personaltools' => 'Lični alati',
-'postcomment' => 'Nova sekcija',
+'postcomment' => 'Pošaljite komentar - Пошаљите коментар',
 'articlepage' => 'Pogledaj stranicu sa sadržajem (članak)',
 'talk' => 'Razgovor',
 'views' => 'Pregledi',
@@ -429,7 +429,7 @@ $messages = array(
 'viewhelppage' => 'Pogledajte stranicu za pomoć',
 'categorypage' => 'Pogledajte stranicu kategorije',
 'viewtalkpage' => 'Pogledajte raspravu',
-'otherlanguages' => 'Na drugim jezicima',
+'otherlanguages' => 'Drugi jezici / Други језици',
 'redirectedfrom' => '(Preusmjereno sa $1)',
 'redirectpagesub' => 'Preusmjeri stranicu',
 'lastmodifiedat' => 'Ova stranica je posljednji put izmijenjena $1, $2.',
@@ -458,8 +458,8 @@ $1',
 'disclaimerpage' => 'Project:Uslovi korištenja, pravne napomene i odricanje odgovornosti',
 'edithelp' => 'Pomoć pri uređivanju',
 'helppage' => 'Help:Sadržaj',
-'mainpage' => 'Glavna strana',
-'mainpage-description' => 'Glavna strana',
+'mainpage' => 'Glavna stranica / Главна страница',
+'mainpage-description' => 'Glavna stranica / Главна страница',
 'policy-url' => 'Project:Pravila',
 'portal' => 'Portal zajednice',
 'portal-url' => 'Project:Portal_zajednice',
@@ -487,8 +487,8 @@ $1',
 'editlink' => 'uredi',
 'viewsourcelink' => 'pogledaj kod',
 'editsectionhint' => 'Uredi sekciju: $1',
-'toc' => 'Sadržaj',
-'showtoc' => 'prikaži',
+'toc' => 'Sadržaj / Садржај',
+'showtoc' => 'prikaži / прикажи',
 'hidetoc' => 'sakrij',
 'collapsible-collapse' => 'Sakrij',
 'collapsible-expand' => 'Proširi',
@@ -507,13 +507,13 @@ $1',
 'sort-ascending' => 'Poredaj rastuće',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main' => 'Stranica',
-'nstab-user' => 'Korisnička stranica',
+'nstab-main' => 'Članak / Чланак',
+'nstab-user' => 'Korisnik / Корисник',
 'nstab-media' => 'Mediji',
 'nstab-special' => 'Posebna stranica',
 'nstab-project' => 'Stranica projekta',
 'nstab-image' => 'Datoteka',
-'nstab-mediawiki' => 'Poruka',
+'nstab-mediawiki' => 'Poruka / Порука',
 'nstab-template' => 'Šablon',
 'nstab-help' => 'Stranica pomoći',
 'nstab-category' => 'Kategorija',
@@ -529,7 +529,7 @@ Moguće je i da je ovo greška u softveru koji koristi {{SITENAME}}.',
 Lista valjanih posebnih stranica se može naći na [[Special:SpecialPages|{{int:specialpages}}]].',
 
 # General errors
-'error' => 'Greška',
+'error' => 'Greška - Грешка',
 'databaseerror' => 'Greška u bazi podataka',
 'laggedslavemode' => "'''Upozorenje''': Stranica ne mora sadržavati posljednja ažuriranja.",
 'readonly' => 'Baza podataka je zaključana',
@@ -632,21 +632,21 @@ Ne zaboravite izmijeniti vlastite [[Special:Preferences|{{SITENAME}} postavke]].
 'yourdomainname' => 'Vaš domen:',
 'password-change-forbidden' => 'Ne možete da promenite lozinku na ovom vikiju.',
 'externaldberror' => 'Došlo je do greške pri vanjskoj autorizaciji baze podataka ili vam nije dopušteno osvježavanje Vašeg vanjskog korisničkog računa.',
-'login' => 'Prijavi se',
+'login' => 'Prijavi me - Пријави ме',
 'nav-login-createaccount' => 'Prijavi se / Registruj se',
 'loginprompt' => "Morate imati kolačiće ('''cookies''') omogućene da biste se prijavili na {{SITENAME}}.",
 'userlogin' => 'Prijavi se / stvori korisnički račun',
 'userloginnocreate' => 'Prijavi se',
-'logout' => 'Odjavi me',
+'logout' => 'Odjavi se - Одјави се',
 'userlogout' => 'Odjava',
 'notloggedin' => 'Niste prijavljeni',
 'userlogin-noaccount' => 'Nemate račun?',
 'userlogin-joinproject' => 'Pridružite se {{SITENAME}}',
 'nologin' => "Nemate korisničko ime? '''$1'''.",
 'nologinlink' => 'Otvorite račun',
-'createaccount' => 'Napravi korisnički račun',
+'createaccount' => 'Napraviti novi nalog / Направити нови налог',
 'gotaccount' => "Imate račun? '''$1'''.",
-'gotaccountlink' => 'Prijavi se',
+'gotaccountlink' => 'Prijavite se - Пријавите се',
 'userlogin-resetlink' => 'Zaboravili ste detalje vaše prijave?',
 'userlogin-resetpassword-link' => 'Resetirajte svoju lozinku/zaporku',
 'helplogin-url' => 'Help:Logiranje',
@@ -687,7 +687,7 @@ Molimo Vas da ih omogućite i da pokušate ponovo sa prijavom.",
 Provjerite da li su cookies omogućeni, ponovo učitajte ovu stranicu i pokušajte ponovo.',
 'noname' => 'Niste izabrali ispravno korisničko ime.',
 'loginsuccesstitle' => 'Prijavljivanje uspješno',
-'loginsuccess' => "'''Sad ste prijavljeni na {{SITENAME}} kao \"\$1\".'''",
+'loginsuccess' => 'Trenutno ste prijavljeni na {{SITENAME}} kao "$1".',
 'nosuchuser' => 'Ne postoji korisnik sa imenom "$1".
 Korisnička imena razlikuju velika i mala slova.
 Provjerite vaše kucanje ili [[Special:UserLogin/signup|napravite novi korisnički račun]].',
@@ -730,7 +730,7 @@ Molimo vas da unesete ispravnu adresu ili ostavite prazno polje.',
 'cannotchangeemail' => 'Na ovom wikiju ne možete promeniti e-mail adresu računa.',
 'emaildisabled' => 'Ova web-stranica ne može da šalje e-poruke.',
 'accountcreated' => 'Korisnički račun je napravljen',
-'accountcreatedtext' => 'Korisnički račun za [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|razgovor]]) je napravljen.',
+'accountcreatedtext' => 'Korisnički račun za $1 je kreiran. Кориснички налог за $1 је креиран.',
 'createaccount-title' => 'Pravljenje korisničkog računa za {{SITENAME}}',
 'createaccount-text' => 'Neko je napravio korisnički račun za vašu e-mail adresu na {{SITENAME}} ($4) sa imenom "$2", i sa šifrom "$3".
 Trebali biste se prijaviti i promjeniti šifru.
@@ -837,13 +837,13 @@ Privremena šifra: $2',
 # Edit pages
 'summary' => 'Sažetak:',
 'subject' => 'Tema/naslov:',
-'minoredit' => 'Ovo je manja izmjena',
+'minoredit' => 'Mala izmjena - Мала измена',
 'watchthis' => 'Prati ovu stranicu',
-'savearticle' => 'Snimi stranicu',
-'preview' => 'Pretpregled',
-'showpreview' => 'Prikaži izgled',
+'savearticle' => 'Sačuvaj - Сачувај',
+'preview' => 'Pretpregled / Претпреглед',
+'showpreview' => 'Pretpregled - Претпреглед',
 'showlivepreview' => 'Pretpregled uživo',
-'showdiff' => 'Prikaži izmjene',
+'showdiff' => 'Prikaži izmjene - Прикажи измене',
 'anoneditwarning' => "'''Upozorenje:''' Niste prijavljeni.
 Vaša IP adresa će biti zabilježena u historiji ove stranice.",
 'anonpreviewwarning' => "''Niste prijavljeni. Vaša IP adresa će biti zabilježena u historiji ove stranice.''",
@@ -891,13 +891,17 @@ Molimo da postavite i verifikujete Vašu e-mail adresu putem Vaših [[Special:Pr
 'nosuchsectiontitle' => 'Ne mogu pronaći sekciju',
 'nosuchsectiontext' => 'Pokušali ste uređivati sekciju koja ne postoji.
 Možda je premještena ili obrisana dok ste pregledavali stranicu.',
-'loginreqtitle' => 'Potrebno je prijavljivanje',
+'loginreqtitle' => 'Potrebno je da se [[{{ns:-1}}:Userlogin|prijavite]]',
 'loginreqlink' => 'prijavi se',
 'loginreqpagetext' => 'Morate $1 da bi ste vidjeli druge stranice.',
-'accmailtitle' => 'Lozinka poslana.',
-'accmailtext' => "Nasumično odabrana lozinka za nalog [[User talk:$1|$1]] je poslata na adresu $2.
+'accmailtitle' => 'Šifra je poslana!
 
-Lozinka za ovaj novi račun može biti promijenjena na stranici ''[[Special:ChangePassword|izmjene šifre]]'' nakon prijave.",
+
+Шифра је послата!',
+'accmailtext' => "Šifra za nalog '$1' je poslana na adresu $2.
+
+
+Шифра за налог '$1' је послата на адресу $2.",
 'newarticle' => '(Novi)',
 'newarticletext' => "Preko linka ste došli na stranicu koja još uvijek ne postoji.
 * Ako želite stvoriti stranicu, počnite tipkati u okviru dolje (v. [[{{MediaWiki:Helppage}}|stranicu za pomoć]] za više informacija).
@@ -971,7 +975,7 @@ Moraćete da unesete svoje promjene u postojeći tekst.
 Molimo Vas promijenite ga prije sljedećeg uređivanja članaka. Znakovi koji nisu po ASCII standardu će se u prozoru za izmjene pojaviti kao heksadecimalni kodovi.'''",
 'editingold' => "'''PAŽNJA:  Vi mijenjate stariju reviziju ove stranice.
 Ako je snimite, sve promjene učinjene od ove revizije će biti izgubljene.'''",
-'yourdiff' => 'Razlike',
+'yourdiff' => 'Razlike / Разлике',
 'copyrightwarning' => "Molimo da uzmete u obzir kako se smatra da su svi doprinosi u {{SITENAME}} izdani pod $2 (v. $1 za detalje).
 Ukoliko ne želite da vaše pisanje bude nemilosrdno uređivano i redistribuirano po tuđoj volji, onda ga nemojte ovdje objavljivati.<br />
 Također obećavate kako ste ga napisali sami ili kopirali iz izvora u javnoj domeni ili sličnog slobodnog izvora.
@@ -981,10 +985,13 @@ Također nam garantujete da ste ovo Vi napisali, ili da ste ga kopirali iz javne
 '''NE ŠALJITE DJELA ZAŠTIĆENA AUTORSKIM PRAVOM BEZ DOZVOLE!'''",
 'longpageerror' => "'''Greška: tekst koji ste uneli je veličine {{PLURAL:$1|jedan kilobajt|$1 kilobajta|$1 kilobajta}}, što je veće od {{PLURAL:$2|dozvoljenog jednog kilobajta|dozvoljena $2 kilobajta|dozvoljenih $2 kilobajta}}.'''
 Stranica ne može biti sačuvana.",
-'readonlywarning' => "'''PAŽNJA: Baza je zaključana zbog održavanja, tako da nećete moći da sačuvate svoje izmjene za sada.'''
-Možda želite da kopirate i nalijepite tekst u tekst editor i sačuvate ga za kasnije.
-
-Administrator koji je zaključao bazu je naveo slijedeće objašnjenje: $1",
+'readonlywarning' => "<font color=\"#FF0000\">'''PAŽNJA:'''</font> Baza je upravo zaključana zbog održavanja,
+tako da nećete moći da snimite svoje izmene upravo sada. Možda želite da iskopirate i nalepite
+tekst u tekst editor i snimite ga za kasnije.
+<br>
+<font color=\"#FF0000\">'''ПАЖЊА:'''</font> База је управо закључана због одржавања,
+тако да нећете моћи да снимите своје измене управо сада. Можда желите да ископирате и налепите
+текст у текст едитор и снимите га за касније.",
 'protectedpagewarning' => "'''PAŽNJA: Ova stranica je zaključana tako da samo korisnici sa administratorskim privilegijama mogu da je mijenjaju.'''
 Posljednja stavka u registru je prikazana ispod kao referenca:",
 'semiprotectedpagewarning' => "'''Pažnja:''' Ova stranica je zaključana tako da je samo registrovani korisnici mogu uređivati.
@@ -1083,7 +1090,7 @@ Razlog koji je naveo $3 je ''$2''",
 'currentrevisionlink' => 'Trenutna verzija',
 'cur' => 'tren',
 'next' => 'slijed',
-'last' => 'preth',
+'last' => 'preth - претх',
 'page_first' => 'prva',
 'page_last' => 'zadnja',
 'histlegend' => "Odabir razlika: označite radio dugme verzija za usporedbu i pritisnite enter ili dugme na dnu.<br />
@@ -1156,7 +1163,7 @@ Drugi administratori projekta {{SITENAME}} će i dalje moći pristupiti sakriven
 'revdelete-hide-image' => 'Sakrij sadržaj datoteke',
 'revdelete-hide-name' => 'Sakrij akciju i cilj',
 'revdelete-hide-comment' => 'Sakrij izmjene komentara',
-'revdelete-hide-user' => 'Sakrij korisničko ime urednika/IP',
+'revdelete-hide-user' => 'Sakrij korisničko ime / IP adresu korisnika koji je uređivao stranicu',
 'revdelete-hide-restricted' => 'Ograniči podatke za administratore kao i za druge korisnike',
 'revdelete-radio-same' => '(ne mijenjaj)',
 'revdelete-radio-set' => 'Da',
@@ -1238,7 +1245,7 @@ Korištenje navigacionih linkova će resetovati ovaj stupac.',
 'lineno' => 'Linija $1:',
 'compareselectedversions' => 'Uporedite označene verzije',
 'showhideselectedversions' => 'Pokaži/sakrij odabrane verzije',
-'editundo' => 'ukloni ovu izmjenu',
+'editundo' => 'ukloni ovu izmjenu - уклони ову измену',
 'diff-empty' => '(nema razlike)',
 'diff-multi' => '({{PLURAL:$1|Nije prikazana jedna međuverzija|Nisu prikazane $1 međuverzije|Nije prikazano $1 međuverzija}}) od strane {{PLURAL:$2|korisnika|korisnika}}',
 'diff-multi-manyusers' => '({{PLURAL:$1|Nije prikazana jedna međuverzija|Nisu prikazane $1 međuverzije|Nije prikazano $1 međuverzija}}) od strane {{PLURAL:$2|korisnika|korisnika}}',
@@ -1302,8 +1309,8 @@ Uzmite u obzir da njegovi indeksi za ovu Wiki ne moraju biti ažurirani.',
 'search-error' => 'Dogodila se pogreška prilikom pretraživanja: $1',
 
 # Preferences page
-'preferences' => 'Postavke',
-'mypreferences' => 'Postavke',
+'preferences' => 'Postavke / Подешавања',
+'mypreferences' => 'Moje postavke / Моја подешавања',
 'prefs-edits' => 'Broj izmjena:',
 'prefs-skin' => 'Izgled (skin)',
 'skin-preview' => 'Pretpregled',
@@ -1314,7 +1321,7 @@ Uzmite u obzir da njegovi indeksi za ovu Wiki ne moraju biti ažurirani.',
 'prefs-user-pages' => 'Korisničke stranice',
 'prefs-personal' => 'Korisnički profil',
 'prefs-rc' => 'Podešavanje nedavnih izmjena',
-'prefs-watchlist' => 'Praćene stranice',
+'prefs-watchlist' => 'Praćene stranice / Списак надгледања',
 'prefs-watchlist-days' => 'Broj dana za prikaz u spisku praćenja:',
 'prefs-watchlist-days-max' => '(najviše $1 {{PLURAL:$1|dan|dana}})',
 'prefs-watchlist-edits' => 'Najveći broj izmjena za prikaz u proširenom spisku praćenja:',
@@ -1339,7 +1346,7 @@ Uzmite u obzir da njegovi indeksi za ovu Wiki ne moraju biti ažurirani.',
 'recentchangescount' => 'Broj uređivanja za prikaz po pretpostavkama:',
 'prefs-help-recentchangescount' => 'Ovo uključuje nedavne izmjene, historije stranice i registre.',
 'savedprefs' => 'Vaša postavke su snimljene.',
-'timezonelegend' => 'Vremenska zona:',
+'timezonelegend' => 'Vremenska zona / Временска зона',
 'localtime' => 'Lokalno vrijeme:',
 'timezoneuseserverdefault' => 'Koristi postavke wikija ($1)',
 'timezoneuseoffset' => 'Ostalo (odredi odstupanje)',
@@ -1367,7 +1374,7 @@ Uzmite u obzir da njegovi indeksi za ovu Wiki ne moraju biti ažurirani.',
 'prefs-reset-intro' => 'Možete koristiti ovu stranicu da poništite Vaše postavke na ovom sajtu na pretpostavljene vrijednosti.
 Ovo se ne može vratiti unazad.',
 'prefs-emailconfirm-label' => 'E-mail potvrda:',
-'youremail' => 'E-mail:',
+'youremail' => 'Vaša e-pošta / Ваша е-пошта*',
 'username' => 'Ime {{GENDER:$1|korisnika|korisnice}}:',
 'uid' => '{{GENDER:$1|Korisnički}} ID:',
 'prefs-memberingroups' => '{{GENDER:$2|Korisnik|Korisnica}} je član {{PLURAL:$1|grupe|grupâ}}:',
@@ -1419,7 +1426,7 @@ Ako izaberete da date ime, biće korišteno za pripisivanje Vašeg rada.',
 'userrights' => 'Postavke korisničkih prava',
 'userrights-lookup-user' => 'Menadžment korisničkih prava',
 'userrights-user-editname' => 'Unesi korisničko ime:',
-'editusergroup' => 'Uredi korisničke grupe',
+'editusergroup' => 'Menjaj Grupe Korisnika',
 'editinguser' => "Mijenjate korisnička prava {{GENDER:$1|korisnika|korisnice|korisnika}} '''[[User:$1|$1]]''' $2",
 'userrights-editusergroup' => 'Uredi korisničke grupe',
 'saveusergroups' => 'Snimi korisničke grupe',
@@ -1447,7 +1454,7 @@ Ako izaberete da date ime, biće korišteno za pripisivanje Vašeg rada.',
 'group-sysop' => 'Administratori',
 'group-bureaucrat' => 'Birokrati',
 'group-suppress' => 'Nadzornici',
-'group-all' => '(sve)',
+'group-all' => '(svi)',
 
 'group-user-member' => '{{GENDER:$1|korisnik|korisnica|korisnik}}',
 'group-autoconfirmed-member' => '{{GENDER:$1|automatski potvrđen korisnik|automatski potvrđena korisnica|automatski potvrđen korisnik}}',
@@ -1584,7 +1591,7 @@ Ako izaberete da date ime, biće korišteno za pripisivanje Vašeg rada.',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|izmjena|izmjene|izmjena}}',
-'recentchanges' => 'Nedavne izmjene',
+'recentchanges' => 'Nedavne izmjene / Скорашње измене',
 'recentchanges-legend' => 'Postavke za Nedavne promjene',
 'recentchanges-summary' => 'Na ovoj stranici možete pratiti nedavne izmjene.',
 'recentchanges-noresult' => 'Bez promjena tokom cijelog perioda koji ispunjava ove kriterije.',
@@ -1595,18 +1602,23 @@ Ako izaberete da date ime, biće korišteno za pripisivanje Vašeg rada.',
 'recentchanges-label-unpatrolled' => 'Ova izmjena još nije patrolirana',
 'recentchanges-legend-newpage' => '$1 - nova stranica',
 'rcnotefrom' => "Ispod {{PLURAL:$1|je '''$1''' izmjena|su '''$1''' zadnje izmjene|su '''$1''' zadnjih izmjena}} u {{PLURAL:$2|posljednjem '''$2''' danu|posljednja '''$2''' dana|posljednjih '''$2''' dana}}, od $4, $5.",
-'rclistfrom' => 'Prikaži nove izmjene počevši od $1',
-'rcshowhideminor' => '$1 male izmjene',
-'rcshowhidebots' => '$1 botove',
+'rclistfrom' => 'Prikaži nove poruke od / Прикажи нове поруке од $1',
+'rcshowhideminor' => '$1 male izmjene / мале измене',
+'rcshowhidebots' => '$1 botove / ботове',
 'rcshowhideliu' => '$1 prijavljene korisnike',
-'rcshowhideanons' => '$1 anonimne korisnike',
-'rcshowhidepatr' => '$1 patrolirane izmjene',
-'rcshowhidemine' => '$1 moje izmjene',
-'rclinks' => 'Prikaži najskorijih $1 izmjena u posljednjih $2 dana<br />$3',
+'rcshowhideanons' => '$1 anonimne / анонимне',
+'rcshowhidepatr' => '$1 označene / означене',
+'rcshowhidemine' => '$1 vlastite izmjene / сопствене измене',
+'rclinks' => '<br>
+Prikaži zadnjih / Прикажи последњих $1 promjena / промена<br>
+u zadnjih / у последњних $2 dana / дана<br />
+<br>
+$3
+<br>',
 'diff' => 'razl',
 'hist' => 'hist',
 'hide' => 'Sakrij',
-'show' => 'Prikaži',
+'show' => 'prikaži / прикажи',
 'minoreditletter' => 'm',
 'newpageletter' => 'N',
 'boteditletter' => 'b',
@@ -1620,7 +1632,7 @@ Ako izaberete da date ime, biće korišteno za pripisivanje Vašeg rada.',
 'rc-old-title' => 'prvobitno kreirano kao "$1"',
 
 # Recent changes linked
-'recentchangeslinked' => 'Srodne izmjene',
+'recentchangeslinked' => 'Srodne izmjene / Сродне измене',
 'recentchangeslinked-feed' => 'Srodne izmjene',
 'recentchangeslinked-toolbox' => 'Srodne izmjene',
 'recentchangeslinked-title' => 'Srodne promjene sa "$1"',
@@ -1657,11 +1669,11 @@ Da bi ste prikazali datoteku na stranici, koristite link na jedan od slijedećih
 'uploadlogpagetext' => 'Ispod je popis najnovijih postavljanja datoteka.
 Vidi [[Special:NewFiles|galeriju novih datoteka]] za slikovitiji pregled.',
 'filename' => 'Ime datoteke',
-'filedesc' => 'Sažetak',
+'filedesc' => 'Sažetak - Сажетак',
 'fileuploadsummary' => 'Sažetak:',
 'filereuploadsummary' => 'Izmjene datoteke:',
 'filestatus' => 'Status autorskih prava:',
-'filesource' => 'Izvor:',
+'filesource' => 'Izvor - Извор',
 'uploadedfiles' => 'Postavljene datoteke',
 'ignorewarning' => 'Zanemari upozorenja i sačuvaj datoteku',
 'ignorewarnings' => 'Zanemari sva upozorenja',
@@ -1866,7 +1878,7 @@ Molimo ponovno provjerite da li je URL ispravan i da li stranica radi.',
 Molimo provjerite da li je stranica postavljena, malo pričekajte i pokušajte ponovno.
 Možda možete pokušati kada bude manje opterećenje.',
 
-'license' => 'Licenca:',
+'license' => 'Licenca - Лиценца',
 'license-header' => 'Licenciranje',
 'nolicense' => 'Ništa nije odabrano',
 'license-nopreview' => '(Pregled nije dostupan)',
@@ -1979,11 +1991,11 @@ Prije brisanja provjerite da li druge stranice vode na te šablone.',
 'unusedtemplateswlh' => 'ostali linkovi',
 
 # Random page
-'randompage' => 'Slučajna stranica',
+'randompage' => 'Slučajna stranica / Случајна страница',
 'randompage-nopages' => 'Nema stranica u {{PLURAL:$2|slijedećem imenskom prostoru|slijedećim imenskim prostorima}}: "$1".',
 
 # Random redirect
-'randomredirect' => 'Slučajno preusmjerenje',
+'randomredirect' => 'Slučajno preusmjerenje / Случајно преусмјерење',
 'randomredirect-nopages' => 'Nema preusmjerenja u imenskom prostoru "$1".',
 
 # Statistics
@@ -2046,8 +2058,8 @@ Svaki red sadrži veze na prvo i drugo preusmjerenje, kao i na prvu liniju tekst
 'specialpage-empty' => 'Ne postoje rezultati za ovaj izvještaj.',
 'lonelypages' => 'Stranice - siročići',
 'lonelypagestext' => 'Slijedeće stranice nemaju linkove na ostalim stranicama na ovoj {{SITENAME}}.',
-'uncategorizedpages' => 'Nekategorisane stranice',
-'uncategorizedcategories' => 'Nekategorisane kategorije',
+'uncategorizedpages' => 'Nekategorisane stranice / Некатегорисане странице',
+'uncategorizedcategories' => 'Nekategorisane kategorije / Некатегорисане категорије',
 'uncategorizedimages' => 'Slike bez kategorije',
 'uncategorizedtemplates' => 'Šabloni bez kategorije',
 'unusedcategories' => 'Neiskorištene kategorije',
@@ -2060,20 +2072,20 @@ Svaki red sadrži veze na prvo i drugo preusmjerenje, kao i na prvu liniju tekst
 'wantedfiletext-cat' => 'Sledeće datoteke se koriste, ali ne postoje. Datoteke iz drugih spremnika mogu biti navedene iako ne postoje. Takve datoteke će biti <del>izbačene</del> sa spiska. Pored toga, stranice koje sadrže nepostojeće datoteke se nalaze [[:$1|ovde]].',
 'wantedfiletext-nocat' => 'Sledeće datoteke se koriste, ali ne postoje. Datoteke iz drugih spremnika mogu biti navedene iako ne postoje. Takve datoteke će biti <del>izbačene</del> sa spiska.',
 'wantedtemplates' => 'Potrebni šabloni',
-'mostlinked' => 'Stranice sa najviše linkova',
-'mostlinkedcategories' => 'Kategorije sa najviše linkova',
+'mostlinked' => 'Najviše povezanih sa člancima / Највише повезаних са чланцима',
+'mostlinkedcategories' => 'Najviše povezanih sa kategorijama / Највише повезаних са категоријама',
 'mostlinkedtemplates' => 'Šabloni sa najviše linkova',
 'mostcategories' => 'Stranice sa najviše kategorija',
-'mostimages' => 'Datoteke sa najviše linkova',
+'mostimages' => 'Najviše povezanih sa slikama / Највише повезаних са сликама',
 'mostinterwikis' => 'Stranice s najviše međuwiki poveznica',
 'mostrevisions' => 'Stranice sa najviše izmjena',
 'prefixindex' => 'Sve stranice sa prefiksom',
 'prefixindex-namespace' => 'Sve stranice s predmetkom (imenski prostor $1)',
 'shortpages' => 'Kratke stranice',
-'longpages' => 'Dugačke stranice',
-'deadendpages' => 'Stranice bez internih linkova',
+'longpages' => 'Duge stranice / Дуге странице',
+'deadendpages' => 'Članci bez internih linkova / Чланци без интерних линкова',
 'deadendpagestext' => 'Slijedeće stranice nisu povezane s drugim stranicama na {{SITENAME}}.',
-'protectedpages' => 'Zaštićene stranice',
+'protectedpages' => 'Zaštićene stranice / Заштићене странице',
 'protectedpages-indef' => 'Samo neograničena zaštićenja',
 'protectedpages-cascade' => 'Samo prenosive zaštite',
 'protectedpagesempty' => 'Trenutno nijedna stranica nije zaštićena s ovim parametrima.',
@@ -2084,9 +2096,9 @@ Svaki red sadrži veze na prvo i drugo preusmjerenje, kao i na prvu liniju tekst
 'listusers-creationsort' => 'Sortiraj po datumu pravljenja',
 'usereditcount' => '$1 {{PLURAL:$1|izmjena|izmjene}}',
 'usercreated' => '{{GENDER:$3|je napravio|je napravila|je napravio}} dana $1 u $2',
-'newpages' => 'Nove stranice',
+'newpages' => 'Nove stranice / Нове странице',
 'newpages-username' => 'Korisničko ime:',
-'ancientpages' => 'Najstarije stranice',
+'ancientpages' => 'Najstarije stranice / Најстарије странице',
 'move' => 'Premjesti',
 'movethispage' => 'Premjesti ovu stranicu',
 'unusedimagestext' => 'Slijedeće datoteke postoje ali nisu uključene ni u jednu stranicu.
@@ -2112,8 +2124,8 @@ na kome bi se izvela ova funkcija.',
 # Special:Log
 'specialloguserlabel' => 'Izvršilac:',
 'speciallogtitlelabel' => 'Cilj (naslov ili korisnik):',
-'log' => 'Registri',
-'all-logs-page' => 'Svi javni registri',
+'log' => 'Evidencije',
+'all-logs-page' => 'Sve evidencije - Све евиденције',
 'alllogstext' => 'Zajednički prikaz svih dostupnih evidencija sa {{SITENAME}}.
 Možete specificirati prikaz izabiranjem specifičnog spiska, korisničkog imena ili promjenjenog članka (razlikovati velika slova).',
 'logempty' => 'Ne postoji takav zapis.',
@@ -2127,9 +2139,9 @@ Možete specificirati prikaz izabiranjem specifičnog spiska, korisničkog imena
 'prevpage' => 'Prethodna stranica ($1)',
 'allpagesfrom' => 'Prikaži stranice koje počinju od:',
 'allpagesto' => 'Pokaži stranice koje završavaju na:',
-'allarticles' => 'Sve stranice',
+'allarticles' => 'Svi članci / Сви чланци',
 'allinnamespace' => 'Sve stranice (imenski prostor $1)',
-'allpagessubmit' => 'Idi',
+'allpagessubmit' => 'Idi / Иди',
 'allpagesprefix' => 'Prikaži stranice sa prefiksom:',
 'allpagesbadtitle' => 'Dati naziv stranice je nepravilan ili ima međujezički ili interwiki prefiks.
 Možda sadrži jedan ili više znakova koji se ne mogu koristiti u naslovima.',
@@ -2168,7 +2180,7 @@ Podržani {{PLURAL:$2|protokol|protokoli}}: <code>$1</code> (default je http://
 
 # Special:ListUsers
 'listusersfrom' => 'Prikaži korisnike počev od:',
-'listusers-submit' => 'Pokaži',
+'listusers-submit' => 'Prikaži - Прикажи',
 'listusers-noresult' => 'Nije pronađen korisnik.',
 'listusers-blocked' => '(blokiran)',
 
@@ -2227,7 +2239,7 @@ E-mail koju ste uneli u vašim [[Special:Preferences|postavkama]] će se prikaza
 'emailsubject' => 'Tema:',
 'emailmessage' => 'Poruka:',
 'emailsend' => 'Pošalji',
-'emailccme' => 'Pošalji mi kopiju moje poruke.',
+'emailccme' => 'Pošalji mi e-mailom kopiju moje poruke.',
 'emailccsubject' => 'Kopiranje Vaše poruke za $1: $2',
 'emailsent' => 'E-mail poruka poslata',
 'emailsenttext' => 'Vaša poruka je poslata e-poštom.',
@@ -2239,7 +2251,7 @@ E-mail koju ste uneli u vašim [[Special:Preferences|postavkama]] će se prikaza
 
 # Watchlist
 'watchlist' => 'Spisak praćenja',
-'mywatchlist' => 'Spisak praćenja',
+'mywatchlist' => 'Moj popis praćenja / Списак надгледања',
 'watchlistfor2' => 'Za $1 $2',
 'nowatchlist' => 'Nemate ništa na svom spisku praćenih članaka.',
 'watchlistanontext' => 'Molimo da $1 da možete vidjeti ili urediti stavke na Vašem spisku praćenja.',
@@ -2315,7 +2327,7 @@ $UNWATCHURL
 
 Povratne informacije i daljnja pomoć:
 {{canonicalurl:{{MediaWiki:Helppage}}}}',
-'created' => 'napravljena',
+'created' => 'Napravljen - Направљен',
 'changed' => 'promijenjena',
 
 # Delete
@@ -2330,13 +2342,15 @@ Povratne informacije i daljnja pomoć:
 'historywarning' => "'''Upozorenje''':  Stranica koju želite da obrišete ima historiju sa otprilike $1 {{PLURAL:$1|revizijom|revizije|revizija}}:",
 'confirmdeletetext' => 'Upravo ćete obrisati stranicu sa svom njenom historijom.
 Molimo da potvrdite da ćete to učiniti, da razumijete posljedice te da to činite u skladu sa [[{{MediaWiki:Policy-url}}|pravilima]].',
-'actioncomplete' => 'Akcija završena',
+'actioncomplete' => 'Akcija završena
+
+Акција завршена',
 'actionfailed' => 'Akcija nije uspjela',
 'deletedtext' => '"$1" je obrisan/a.
 V. $2 za registar nedavnih brisanja.',
-'dellogpage' => 'Registar brisanja',
+'dellogpage' => 'Evidencija brisanja',
 'dellogpagetext' => 'Ispod je spisak najskorijih brisanja.',
-'deletionlog' => 'registar brisanja',
+'deletionlog' => 'Evidencija brisanja',
 'reverted' => 'Vraćeno na prijašnju reviziju',
 'deletecomment' => 'Razlog:',
 'deleteotherreason' => 'Ostali/dodatni razlog/zi:',
@@ -2473,8 +2487,7 @@ Možda ste unijeli pogrešan link, ili je revizija vraćena ili uklonjena iz arh
 'undeletedrevisions' => '{{PLURAL:$1|$1 revizija vraćena|$1 revizije vraćene|$1 revizija vraćeno}}',
 'undeletedrevisions-files' => '{{PLURAL:$1|1 revizija|$1 revizije|$1 revizija}} i {{PLURAL:$2|1 datoteka|$2 datoteke|$2 datoteka}} vraćeno',
 'undeletedfiles' => '{{PLURAL:$1|1 datoteka vraćena|$1 datoteke vraćene|$1 datoteka vraćeno}}',
-'cannotundelete' => 'Vraćanje nije uspelo:
-$1',
+'cannotundelete' => 'Vraćanje nije uspelo; moguće je da je neko drugi vratio stranu pre vas.',
 'undeletedpage' => "'''$1 je vraćena'''
 
 Provjerite [[Special:Log/delete|evidenciju brisanja]] za zapise najskorijih brisanja i vraćanja.",
@@ -2498,7 +2511,7 @@ $1',
 'undelete-show-file-submit' => 'Da',
 
 # Namespace form on various pages
-'namespace' => 'Imenski prostor:',
+'namespace' => 'Imenski prostor - Именски простор:',
 'invert' => 'Sve osim odabranog',
 'tooltip-invert' => 'Označite ovu kutiju za sakrivanje promjena na stranicama u odabranom imenskom prostoru (i povezanim imenskim prostorima ako je označeno)',
 'namespace_association' => 'Povezan imenski prostor',
@@ -2506,9 +2519,9 @@ $1',
 'blanknamespace' => '(Glavno)',
 
 # Contributions
-'contributions' => 'Doprinosi {{GENDER:|korisnika|korisnice|korisnika}} $1',
+'contributions' => 'Doprinosi korisnika / Доприноси корисника',
 'contributions-title' => 'Korisnički doprinosi od $1',
-'mycontris' => 'Doprinosi',
+'mycontris' => 'Doprinosi / Доприноси',
 'contribsub2' => 'Za $1 ($2)',
 'nocontribs' => 'Nisu nađene promjene koje zadovoljavaju ove uslove.',
 'uctop' => '(trenutno)',
@@ -2534,8 +2547,8 @@ Posljednje stavke zapisnika blokiranja možete pogledati ispod:',
 'sp-contributions-submit' => 'Traži',
 
 # What links here
-'whatlinkshere' => 'Šta je povezano ovdje',
-'whatlinkshere-title' => 'Stranice koje vode na "$1"',
+'whatlinkshere' => 'Što vodi ovdje / Шта води овде',
+'whatlinkshere-title' => 'Stranice koje vode / Странице које воде до $1',
 'whatlinkshere-page' => 'Stranica:',
 'linkshere' => "Sljedeće stranice vode na '''[[:$1]]''':",
 'nolinkshere' => "Nema linkova na '''[[:$1]]'''.",
@@ -2584,7 +2597,7 @@ Unesite konkretan razlog ispod (na primjer, navodeći koje konkretne stranice su
 'ipb-disableusertalk' => 'Onemogući ovog korisnika da uređuje svoju vlastitu stranicu za razgovor dok je blokiran',
 'ipb-change-block' => 'Ponovno blokiraj korisnika sa ovim postavkama',
 'ipb-confirm' => 'Potvrdite blokiranje',
-'badipaddress' => 'Nevaljana IP adresa',
+'badipaddress' => 'Neodgovarajuća IP adresa / Неодговарајућа ИП адреса',
 'blockipsuccesssub' => 'Blokiranje je uspjelo',
 'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] je {{GENDER:$1|blokiran|blokirana|blokiran}}.<br />
 Blokiranja možete da pogledate [[Special:BlockList|ovde]].',
@@ -2595,7 +2608,7 @@ Blokiranja možete da pogledate [[Special:BlockList|ovde]].',
 'ipb-unblock' => 'Deblokiraj korisničko ime ili IP adresu',
 'ipb-blocklist' => 'Vidi postojeće blokade',
 'ipb-blocklist-contribs' => 'Doprinosi za $1',
-'unblockip' => 'Odblokiraj korisnika',
+'unblockip' => 'Odblokiraj korisnika / Одблокирај корисника',
 'unblockiptext' => 'Upotrebite donji upitnik da bi ste vratili pravo pisanja ranije blokiranoj IP adresi ili korisničkom imenu.',
 'ipusubmit' => 'Ukloni ovu blokadu',
 'unblocked' => '[[User:$1|$1]] je deblokiran',
@@ -2627,7 +2640,7 @@ Blokiranja možete da pogledate [[Special:BlockList|ovde]].',
 'ipblocklist-empty' => 'Spisak blokiranja je prazan.',
 'ipblocklist-no-results' => 'Tražena IP adresa ili korisničko ime nisu blokirani.',
 'blocklink' => 'blokirajte',
-'unblocklink' => 'deblokiraj',
+'unblocklink' => 'Odblokiraj / Одблокирај',
 'change-blocklink' => 'promijeni blokadu',
 'contribslink' => 'doprinosi',
 'emaillink' => 'pošalji e-mail',
@@ -2643,7 +2656,7 @@ Evidencija sakrivanja je prikazana ispod kao referenca:',
 'blocklogtext' => 'Ovo je historija akcija blokiranja i deblokiranja korisnika.
 Automatski blokirane IP adrese nisu navedene ovdje.
 Pogledajte [[Special:BlockList|spisak blokiranja]] za spisak trenutnih zabrana i blokiranja.',
-'unblocklogentry' => 'deblokiran $1',
+'unblocklogentry' => 'Odblokiran / Одблокиран "$1"',
 'block-log-flags-anononly' => 'samo anonimni korisnici',
 'block-log-flags-nocreate' => 'pravljenje računa onemogućeno',
 'block-log-flags-noautoblock' => 'automatsko blokiranje onemogućeno',
@@ -2731,15 +2744,15 @@ drastična i neočekivana promjena za korisnike; molimo budite sigurni da ste sh
 *Odznačite donju kutiju.
 
 U tim slučajevima, moraćete ručno da premjestite stranicu ukoliko to želite.",
-'movearticle' => 'Premjestite stranicu:',
+'movearticle' => 'Premjesti stranicu – Премјести страницу',
 'moveuserpage-warning' => "'''Upozorenje:''' Premještate korisničku stranicu. Molimo da zapamtite da će se samo stranica premjestiti a korisnik se ''neće'' preimenovati.",
 'movenologintext' => 'Morate biti registrovani korisnik i [[Special:UserLogin|prijavljeni]] da biste premjestili stranicu.',
 'movenotallowed' => 'Nemate dopuštenje za premještanje stranica.',
 'movenotallowedfile' => 'Nemate dopuštenja da premještate datoteke.',
 'cant-move-user-page' => 'Nemate dopuštenje da premještate korisničke stranice (osim podstranica).',
 'cant-move-to-user-page' => 'Nemate dopuštenje da premjestite stranicu na korisničku stranicu (osim na korisničku podstranicu).',
-'newtitle' => 'novi naslov:',
-'move-watch' => 'Prati ovu stranicu',
+'newtitle' => 'Novi naziv - Нови назив',
+'move-watch' => 'Prati ovu stranicu - Прати ову страницу',
 'movepagebtn' => 'premjestite stranicu',
 'pagemovedsub' => 'Premještanje uspjelo',
 'movepage-moved' => '\'\'\'"$1" je premještena na "$2"\'\'\'',
@@ -2755,18 +2768,18 @@ Molimo Vas da izaberete drugo ime.',
 'movepage-page-moved' => 'Stranica $1 je premještena na $2.',
 'movepage-page-unmoved' => 'Stranica $1 ne može biti premještena na $2.',
 'movepage-max-pages' => 'Maksimum od $1 {{PLURAL:$1|stranice|stranice|stranica}} je premješteno i više nije moguće premjestiti automatski.',
-'movelogpage' => 'Registar premještanja',
+'movelogpage' => 'Evidencija premještanja',
 'movelogpagetext' => 'Ispod je spisak stranica koje su premještene.',
 'movesubpage' => '{{PLURAL:$1|Podstranica|Podstranice}}',
 'movesubpagetext' => 'Ova stranica ima $1 {{PLURAL:$1|podstranicu|podstranice|podstranica}} prikazanih ispod.',
 'movenosubpage' => 'Ova stranica nema podstranica.',
 'movereason' => 'Razlog:',
-'revertmove' => 'vrati',
+'revertmove' => 'vrati - врати',
 'delete_and_move' => 'Brisanje i premještanje',
 'delete_and_move_text' => '==Brisanje neophodno==
 Odredišna stranica "[[:$1]]" već postoji.
 Da li je želite obrisati kako bi ste mogli izvršiti premještanje?',
-'delete_and_move_confirm' => 'Da, obriši stranicu',
+'delete_and_move_confirm' => 'Da, izbriši stranicu - Да, избриши страницу',
 'delete_and_move_reason' => 'Obrisano da se oslobodi mjesto za premještanje iz „[[$1]]“',
 'selfmove' => 'Izvorni i ciljani naziv su isti; strana ne može da se premjesti preko same sebe.',
 'immobile-source-namespace' => 'Ne mogu premjestiti stranice u imenski prostor "$1"',
@@ -2854,7 +2867,7 @@ Sve akcije vezane uz transwiki uvoz su zabilježene u [[Special:Log/import|regis
 'import-interwiki-source' => 'Izvorna wiki/stranica:',
 'import-interwiki-history' => 'Kopiraj sve verzije historije za ovu stranicu',
 'import-interwiki-templates' => 'Uključi sve šablone',
-'import-interwiki-submit' => 'Uvoz',
+'import-interwiki-submit' => 'Uvezi - Увези',
 'import-interwiki-namespace' => 'Odredišni imenski prostor:',
 'import-interwiki-rootpage' => 'Odredišna osnovna stranica (neobavezno):',
 'import-upload-filename' => 'Naziv datoteke:',
@@ -3118,7 +3131,7 @@ Njegovim izvršavanjem možete da ugrozite Vaš sistem.",
 'file-no-thumb-animation-gif' => "'''Napomena: zbog tehničkih ograničenja, minijature GIF slika visoke rezolucije kao što je ova neće se animirati.'''",
 
 # Special:NewFiles
-'newimages' => 'Galerija novih slika',
+'newimages' => 'Galerija novih fajlova / Галерија нових фајлова',
 'imagelisttext' => "Ispod je spisak od '''$1''' {{PLURAL:$1|datoteke|datoteke|datoteka}} poredanih $2.",
 'newimages-summary' => 'Ova posebna stranica prikazuje posljednje postavljene datoteke.',
 'newimages-legend' => 'Filter',
@@ -3231,7 +3244,7 @@ Svi drugi linkovi u istoj liniji se smatraju izuzecima, npr. kod stranica gdje s
 'exif-spectralsensitivity' => 'Spektralna osjetljivost',
 'exif-isospeedratings' => 'Rejting ISO brzine',
 'exif-shutterspeedvalue' => 'Brzina APEX okidača',
-'exif-aperturevalue' => 'APEX otvor',
+'exif-aperturevalue' => 'Otvor blende',
 'exif-brightnessvalue' => 'APEX osvijetljenost',
 'exif-exposurebiasvalue' => 'Kompozicija ekspozicije',
 'exif-maxaperturevalue' => 'Najveći broj otvora blende',
@@ -3794,21 +3807,21 @@ Trebali biste dobiti [{{SERVER}}{{SCRIPTPATH}}/KOPIJU GNU opće javne licence] z
 'fileduplicatesearch-noresults' => 'Nije pronađena datoteka sa imenom "$1".',
 
 # Special:SpecialPages
-'specialpages' => 'Posebne stranice',
+'specialpages' => 'Posebno / Посебно',
 'specialpages-note' => '* Normalne posebne stranice.
 * <span class="mw-specialpagerestricted">Ograničene posebne stranice.</span>
 * <span class="mw-specialpagecached">Keširane posebne stranice (mogu biti zastarjele).</span>',
-'specialpages-group-maintenance' => 'Izvještaji za održavanje',
-'specialpages-group-other' => 'Ostale posebne stranice',
-'specialpages-group-login' => 'Prijava / Otvaranje računa',
+'specialpages-group-maintenance' => 'Izvještaji o održavanju / Извјештаји о одржавању',
+'specialpages-group-other' => 'Ostale posebne stranice - Остале посебне странице',
+'specialpages-group-login' => 'Prijava / Пријава',
 'specialpages-group-changes' => 'Nedavne izmjene i registri',
-'specialpages-group-media' => 'Mediji i postavljanje datoteka',
-'specialpages-group-users' => 'Korisnici i korisnička prava',
-'specialpages-group-highuse' => 'Često korištene stranice',
+'specialpages-group-media' => 'Multimedijalne datoteke \\ fajlovi i njihovo postavljanje / Мултимедијалне датотеке \\ фајлови и њихово постављање',
+'specialpages-group-users' => 'Korisnici i njihova prava / Корисници и њихова права',
+'specialpages-group-highuse' => 'Najčešće korištene stranice / Најчешће кориштене странице',
 'specialpages-group-pages' => 'Spiskovi stranica',
 'specialpages-group-pagetools' => 'Alati za stranice',
 'specialpages-group-wiki' => 'Podaci i alati',
-'specialpages-group-redirects' => 'Preusmjeravanje posebnih stranica',
+'specialpages-group-redirects' => 'Posebne stranice za preusmjeravanje / Посебне стране за преусмеравање',
 'specialpages-group-spam' => 'Spam alati',
 
 # Special:BlankPage
@@ -3990,4 +4003,7 @@ U suprotnom, poslužite se jednostavnim obrascem ispod. Vaš komentar će stajat
 # Image rotation
 'rotate-comment' => 'Slika rotirana za $1 {{PLURAL:$1|stepeni}} u smjeru kazaljke na satu',
 
+# Special:ExpandTemplates
+'expand_templates_input' => 'Unos - Унос',
+
 );
index c1932d3..074151b 100644 (file)
@@ -202,7 +202,6 @@ $messages = array(
 'tog-numberheadings' => 'ශීර්ෂ-නාම ස්වයංක්‍රීයව අංකනය කරන්න',
 'tog-showtoolbar' => 'සංස්කරණ මෙවලම්තීරුව පෙන්වන්න',
 'tog-editondblclick' => 'ද්විත්ව-ක්ලික් කිරීම මගින් පිටු සංස්කරණය අරඹන්න',
-'tog-editsection' => '[සංස්කරණ] සබැඳියාවන් මගින් ඡේද සංස්කරණය සක්‍රීය කරන්න',
 'tog-editsectiononrightclick' => 'ඡේද ශීර්ෂ මත දකුණු-ක්ලික් කිරීමෙන් ඡේද සංස්කරණය සක්‍රීය කරන්න (ජාවාස්ක්‍රිප්ට්)',
 'tog-showtoc' => 'පටුන පෙන්වන්න ( තුනකට වඩා වැඩියෙන් ශීර්ෂ-නාම අඩංගු පිටු සඳහා)',
 'tog-rememberpassword' => 'මගේ ප්‍රවිෂ්ටය මෙම ගවේශකයෙහි උපරිම ලෙස {{PLURAL:$1|දිනයක්|දින $1ක්}} මතක තබා ගන්න',
@@ -637,12 +636,17 @@ $2',
 'createacct-emailrequired' => 'වි-තැපෑල ලිපිනය',
 'createacct-emailoptional' => 'වි-තැපෑල ලිපිනය (විකල්ප)',
 'createacct-email-ph' => 'ඔබගේ වි-තැපෑල ලිපිනය ඇතුළු කරන්න',
-'createaccountmail' => 'තාවකාලික අහුඹු මුර පදයක් භාවිතා කර එය පහත දක්වා ඇති වි-තැපැල් ලිපිනයට යවන්න',
+'createacct-another-email-ph' => 'ඊ මේල් ලිපිනය ඇතුළත් කරන්න.',
+'createaccountmail' => 'තාවකාලික අහුඹු මුර පදයක් භාවිතා කර එය පහත දක්වා ඇති විද්යුත් තැපැල් ලිපිනයට යවන්න',
 'createacct-realname' => 'නියම නම (වෛකල්පීය)',
 'createaccountreason' => 'හේතුව:',
 'createacct-reason' => 'හේතුව',
 'createacct-reason-ph' => 'ඔබ තවත් ගිණුමක් තනන්නේ කුමක් නිසාද',
 'createacct-captcha' => 'ආරක්ෂක පරික්ෂාව',
+'createacct-imgcaptcha-ph' => 'ඉහතින් දැක්වෙන වචනය ඇතුළත් කරන්න',
+'createacct-submit' => 'ඔබේ ගිණුම තනන්න',
+'createacct-another-submit' => 'තවත් ගිණුමක් ආරම්භ කරන්න',
+'createacct-benefit-heading' => '{{වෙබ් අඩවි නම}} ඔබ වැනි අයෙක් විසින් නිමවා ඇත',
 'createacct-benefit-body1' => '{{PLURAL:$1|සංස්කරණය|සංස්කරණ}}',
 'createacct-benefit-body2' => '{{PLURAL:$1|පිටුව|පිටු}}',
 'createacct-benefit-body3' => 'මෑත{{PLURAL:$1|දායකයා|දායකයෝ}}',
@@ -688,15 +692,15 @@ $2',
 'passwordsent' => ' "$1" වෙනුවෙන් ලේඛනගත කර ඇති විද්‍යුත් තැපැල් ලිපිනයට නව මුර පදයක් යවා ඇත.
 ඔබට එය ලැබුනු පසු නැවත ප්‍රවිෂ්ට වන්න.',
 'blocked-mailpassword' => 'ඔබගේ අන්තර්ජාල ලිපිනය භාවිතා කරමින් සංස්කරණයෙහි යෙදීම වාරණය කොට ඇති අතර, අපයෙදුම වළකනු වස්,  මුර-පදය පුනරුත්ථාන  කෘත්‍යය භාවිත කිරීමට අවසරයද අහිමි කොට ඇත.',
-'eauthentsent' => 'නම් කර ඇති විද්‍යුත්-ලිපි ලිපිනය වෙත, තහවුරු කිරීම් විද්‍යුත්-ලිපියක් යවා ඇත.
-ගිණුම වෙත වෙනත් විද්‍යුත්-ලිපියක්  යැවීමට පෙර, ගිණුම සත්‍ය වශයෙන්ම ඔබගේම බව තහවුරු කරනු වස්, විද්‍යුත්-ලිපියෙහි අඩංගු උපදෙස්  පිළිපදින්න.',
+'eauthentsent' => 'නම් කර ඇති විද්‍යුත් තැපැල් ලිපිනය වෙත තහවුරු කිරීම් විද්‍යුත්-ලිපියක් යවා ඇත.
+ගිණුම වෙත වෙනත් විද්‍යුත් තැපෑලක් යැවීමට පෙර, ගිණුම සත්‍ය වශයෙන්ම ඔබගේම බව තහවුරු කරනු පිණිස විද්‍යුත්-ලිපියෙහි අඩංගු උපදෙස්  පිළිපදින්න.',
 'throttled-mailpassword' => 'අවසන් {{PLURAL:$1|පැය|පැය $1}} තුල, මුරපද යළි සැකසුම් ඊ-ලිපියක් යවාඇත.
 අපයෙදුම වළකනු වස්, {{PLURAL:$1|එක් පැයක|පැය $1 ක}}ට වරක් එක් මුරපද යළි සැකසුම් ඊ-ලිපියක් පමණක් යවනු ලැබේ.',
 'mailerror' => 'තැපෑල යැවීමේදී වූ දෝෂය: $1',
 'acct_creation_throttle_hit' => 'ඔබගේ අන්තර්ජාල ලිපිනය භාවිතා කල මෙම විකියට අමුත්තන් විසින් {{PLURAL:$1|එක් ගිණුමක්|ගිණුම් $1 ක්}} පසුගිය දිනය තුලදී තනා ඇති අතර, එය මෙම කාල පරිච්ඡේදය තුලදී ඉඩ දෙනු ලබන උපරිමය වෙයි.
 මේ හේතුවෙන්, මෙම අන්තර්ජාල ලිපිනය භාවිතා කරන අමුත්තන් විසින් මෙම අවස්ථාවෙහිදී තවත් ගිණුම් තැනීම සිදු කල නොහැකිව ඇත.',
-'emailauthenticated' => '$2 දින $3 වේලාවෙහිදී ඔබගේ විද්‍යුත්-තැපැල් ලිපිනය සත්‍යවත් කරන ලදි.',
-'emailnotauthenticated' => 'ඔබගේ විද්‍යුත්-තැපැල් ලිපිනය තවමත් සත්‍යවත් කර නොමැත.
+'emailauthenticated' => '$2 දින $3 වේලාවෙහිදී ඔබගේ විද්‍යුත්-තැපැල් ලිපිනයෙහි සත්‍යතාව තහවුරු කරන ලදි.',
+'emailnotauthenticated' => 'ඔබගේ විද්‍යුත්-තැපැල් ලිපිනයෙහි නිවැරදිබව තවමත් තගහවුරු කර නොමැත.
 පහත හැකියාවන් කිසිවක් ඉටුකරනු වස් විද්‍යුත්-තැපෑල  යවනු නොලැබේ.',
 'noemailprefs' => 'පහත හැකියාවන් ඉටුකිරීමට ඉඩ සලසනු වස් විද්‍යුත්-තැපැල් ලිපිනයක් හුවා දක්වන්න.',
 'emailconfirmlink' => 'ඔබගේ විද්‍යුත් තැපැල් ලිපිනය තහවුරු කරන්න',
@@ -713,7 +717,7 @@ $2',
 මෙම ගිණුම තැනී ඇත්තේ වැරදීමකින් නම්, මෙම පණිවුඩය නොසලකා හැරිය හැක.',
 'usernamehasherror' => 'පරිශීලක නාමයේ පූරක අනුලකුණු අඩංගු විය නොහැකිය',
 'login-throttled' => 'ඔබ විසින් මෑතදී  පමණට වඩා වාර ගණනක් පිවිසීමෙහි උත්සාහයන් දරා ඇත.
-යළි උත්සාහ කිරීමට පෙර මඳ වේලාවක් රැඳී සිටින්න.',
+යළි උත්සාහ කිරීමට පෙර $1 වේලාවක් රැඳී සිටින්න.',
 'login-abort-generic' => 'ඔබගේ පිවිසීම අසාර්ථකයි - අතහැර දමනලදී',
 'loginlanguagelabel' => 'භාෂාව: $1',
 'suspicious-userlogout' => 'නිෂ්ක්‍රමණය සඳහා ඔබගේ අයැදුම නිෂ්ප්‍රභා කෙරුනේ එය යොමු කොට ඇත්තේ භින්න(කැඩුනු) බ්‍රවුසරයකින් හෝ නිවේෂණය කෙරෙමින් පවතින ප්‍රොක්සියක් වෙතින් යැයි බැලූ බැල්මට පෙනෙන බැවිනි.',
@@ -732,7 +736,7 @@ $2',
 'newpassword' => 'නව මුර-පදය:',
 'retypenew' => 'නව මුර-පදය නැවත ඇතුළු කරන්න:',
 'resetpass_submit' => 'මුර-පදය පූරණය කොට ඉන් පසු ප්‍රවිෂ්ට වන්න',
-'changepassword-success' => 'à¶\94බà¶\9cà·\9a à¶¸à·\94ර-පදය à·\83à·\8fරà·\8aථà¶\9a à¶½à·\99à·\83 à·\80à·\99නà·\83à·\8a à¶\9aරන à¶½à¶¯à·\92! à¶¯à·\90නà·\8a à¶\94බà·\80 à¶´à·\8aâ\80\8dරà·\80à·\92à·\82à·\8aට à¶\9aරà¶\9cනà·\92මà·\92නà·\8a...',
+'changepassword-success' => 'à¶\94බà¶\9cà·\9a à¶¸à·\94ර-පදය à·\83à·\8fරà·\8aථà¶\9a à¶½à·\99à·\83 à·\80à·\99නà·\83à·\8a à¶\9aරන à¶½à¶¯à·\93!',
 'resetpass_forbidden' => 'මුර-පදයන් වෙනස් කිරීම  සිදු කල නොහැක',
 'resetpass-no-info' => 'මෙම පිටුව සෘජු ලෙස පරිශීලනය කෙරුමට ඔබ පළමු ප්‍රවිෂ්ට විය යුතුය.',
 'resetpass-submit-loggedin' => 'මුර-පදය වෙනස්කරන්න',
@@ -743,8 +747,10 @@ $2',
 
 # Special:PasswordReset
 'passwordreset' => 'මුරපදය වෙනස් කරන්න',
+'passwordreset-text-one' => 'තාවකාලික මුර-පදයක් විද්‍යුත් තැපෑළ මගින් ලබා ගැනීම සඳහා මෙම පෝරමය සම්පූර්ණ කරන්න.',
 'passwordreset-legend' => 'මුරපදය යළි පිහිටුවන්න',
 'passwordreset-disabled' => 'මෙම විකියෙහි මුර පද ප්‍රත්‍යාරම්භ කිරීම් අක්‍රීය කොට ඇත.',
+'passwordreset-emaildisabled' => 'විද්‍යුත්  තැපැල් පහසුකම මෙම විකි ය සඳහා අවලංගු කොට ඇත.',
 'passwordreset-username' => 'පරිශීලක නාමය:',
 'passwordreset-domain' => 'වසම:',
 'passwordreset-capture' => 'ප්‍රතිපලදායක විද්‍යුත් තැපෑල නරඹනවාද?',
@@ -760,8 +766,8 @@ $2
 ඔබ දැන් ප්‍රවිෂ්ට වී නව මුරපදයක් තෝරාගත යුතුයි. වෙන යම් අයෙක් මෙම ඉල්ලීම කර ඇත්නම් හෝ, ඔබගේ මුල් මුරපදය ඔබගේ මතකයට පැමිණ ඇති නම් හා, එය වෙනස් කිරීමට ඔබ හට තවදුරටත් අවශ්‍ය නොවේ නම්, ඔබ විසින් මෙම පණිවුඩය නොසලකා හැර පැරණි මුරපදය තවදුරටත් පාවිච්චි කළ හැක.',
 'passwordreset-emailelement' => 'පරිශීලක නාමය: $1
 තාවකාලික මුරපදය: $2',
-'passwordreset-emailsent' => 'à·\80à·\92දà·\8aâ\80\8dයà·\94තà·\8a තà·\90පà·\90ලà·\8a මතà¶\9aà·\8aà¶\9aà·\92රà·\93මක් යවන ලදී.',
-'passwordreset-emailsent-capture' => 'මතà¶\9aà·\8a à¶\9aà·\92රà·\93මà·\9a à·\80à·\92දà·\8aâ\80\8dයà·\94තà·\8a à¶­à·\90පà·\90ලà·\8a à¶´à¶«à·\92à·\80à·\94ඩය යවන ලදී, එය පහත දැක්වේ.',
+'passwordreset-emailsent' => 'මà·\94ර-පදය à¶±à·\90à·\80ත à·\83à¶\9aà·\83à·\8a à¶\9aà·\92රà·\93ම à¶´à·\92à·\85à·\92බඳà·\80 à·\80à·\92දà·\8aâ\80\8dයà·\94තà·\8a තà·\90පà·\91ලක් යවන ලදී.',
+'passwordreset-emailsent-capture' => 'මà·\94ර-පදය à·\80à·\99නà·\83à·\8a à¶\9aà·\92රà·\93ම à¶´à·\92à·\85à·\92බඳà·\80 à·\80à·\92දà·\8aâ\80\8dයà·\94තà·\8a à¶­à·\90පà·\91ලà¶\9aà·\8a යවන ලදී, එය පහත දැක්වේ.',
 'passwordreset-emailerror-capture' => 'සිහිකැඳවුම් ඊ-තැපෑල ජනිත කරනු ලැබූ අතර, එය පහත දැක්වේ, නමුත් එය පරිශීලකයාට යැවීම අසාර්ථක වුනි: $1',
 
 # Special:ChangeEmail
index b7ae1e3..c6329d6 100644 (file)
@@ -294,7 +294,6 @@ $messages = array(
 'tog-numberheadings' => 'Automaticky číslovať nadpisy',
 'tog-showtoolbar' => 'Zobraziť panel nástrojov úprav',
 'tog-editondblclick' => 'Upravovať stránky po dvojitom kliknutí',
-'tog-editsection' => 'Umožniť upravovanie sekcie prostredníctvom odkazov [upraviť]',
 'tog-editsectiononrightclick' => 'Umožniť upravovanie sekcie pravým kliknutím na nadpisy sekcií',
 'tog-showtoc' => 'Zobrazovať tabuľku s obsahom (pre stránky s viac ako 3 nadpismi)',
 'tog-rememberpassword' => 'Zapamätať si prihlásenie na tomto počítači (najviac $1 {{PLURAL:$1|deň|dni|dní}})',
index 381b4c7..c0d64ed 100644 (file)
@@ -197,7 +197,6 @@ $messages = array(
 'tog-numberheadings' => 'Samodejno številči poglavja',
 'tog-showtoolbar' => 'Prikaži urejevalno orodno vrstico',
 'tog-editondblclick' => 'Omogoči urejanje strani z dvojnim klikom',
-'tog-editsection' => 'Omogoči urejanje delov prek povezav [{{int:editsection}}]',
 'tog-editsectiononrightclick' => 'Omogoči urejanje razdelkov z desnim klikanjem njihovih naslovov',
 'tog-showtoc' => 'Prikaži vsebino (strani z več kot tremi naslovi)',
 'tog-rememberpassword' => 'Zapomni si me v tem brskalniku (za največ $1 {{PLURAL:$1|dan|dneva|dni}})',
@@ -1034,6 +1033,7 @@ Izgleda, da je bila izbrisana.',
 'content-not-allowed-here' => 'Vsebina »$1« ni dovoljena na strani [[$2]]',
 'editwarning-warning' => 'Če zapustite stran, boste morda izgubili vse spremembe, ki ste jih naredili.
 Če ste prijavljeni, lahko to opozorilo onemogočite v razdelku »Urejanje« v svojih nastavitvah.',
+'editpage-notsupportedcontentformat-title' => 'Oblika vsebine ni podprta',
 
 # Content models
 'content-model-wikitext' => 'wikibesedilo',
@@ -1427,8 +1427,8 @@ Ko vas drugi uporabniki kontaktirajo, jim vašega e-poštnega naslova ne bomo ra
 'prefs-tabs-navigation-hint' => 'Namig: Za krmarjenje med zavihki na seznamu zavihkov lahko uporabite levo in desno smerno tipko.',
 
 # User preference: email validation using jQuery
-'email-address-validity-valid' => 'Izgleda veljaven',
-'email-address-validity-invalid' => 'Obvezen je veljaven naslov!',
+'email-address-validity-valid' => 'E-poštni naslov je videti veljaven',
+'email-address-validity-invalid' => 'Vnesite veljaven e-poštni naslov',
 
 # User rights
 'userrights' => 'Upravljanje s pravicami uporabnikov',
@@ -4113,4 +4113,6 @@ Pravzaprav razširi skoraj vse v dvojnih zavitih oklepajih.',
 'expand_templates_generate_rawhtml' => 'Prikaži surovi HTML',
 'expand_templates_preview' => 'Predogled',
 
+# Unknown messages
+'uploadinvalidxml' => 'XML v naloženi datoteki ne moremo razčleniti.',
 );
index 13123a2..bc42213 100644 (file)
@@ -226,7 +226,6 @@ $messages = array(
 'tog-numberheadings' => 'Numëro automatikish titujt',
 'tog-showtoolbar' => 'Trego mjetet e redaktimit (kërkon JavaScript)',
 'tog-editondblclick' => 'Redakto faqet me dopio-klik (kërkon JavaScript)',
-'tog-editsection' => 'Lejo redaktimin e seksioneve me anë të lidhjeve [redakto]',
 'tog-editsectiononrightclick' => 'Lejo redaktimin e seksioneve duke klikuar me të djathtën mbi titullin e seksionit (kërkon JavaScript)',
 'tog-showtoc' => 'Trego tabelën e përmbajtjes (për faqet me më shume se 3 tituj)',
 'tog-rememberpassword' => 'Mbaj mend fjalëkalimin tim në këtë shfletues (më së shumti për $1 {{PLURAL:$1|ditë|ditë}})',
index 8fc72be..af53249 100644 (file)
@@ -405,7 +405,6 @@ $messages = array(
 'tog-numberheadings' => 'Самостално нумериши поднаслове',
 'tog-showtoolbar' => 'Прикажи траку с алаткама за уређивање',
 'tog-editondblclick' => 'Уређивање страница двоструким кликом',
-'tog-editsection' => 'Везе за уређивање појединачних одељака',
 'tog-editsectiononrightclick' => 'Уређивање одељака десним кликом на њихове наслове',
 'tog-showtoc' => 'Прикажи садржај страница које имају више од три поднаслова',
 'tog-rememberpassword' => 'Запамти ме на овом прегледачу (најдуже $1 {{PLURAL:$1|дан|дана|дана}})',
@@ -515,12 +514,12 @@ $messages = array(
 'december-date' => '$1 децембар',
 
 # Categories related messages
-'pagecategories' => '{{PLURAL:$1|1=Категорија|Категорије}}',
+'pagecategories' => '{{PLURAL:$1|Категорија|Категорије}}',
 'category_header' => 'Странице у категорији „$1“',
 'subcategories' => 'Поткатегорије',
 'category-media-header' => 'Датотеке у категорији „$1“',
 'category-empty' => "<div style=\"margin:2em 1em 0 1em; padding:0.5em; border:1px solid #AAA; text-align:center;\">''Ова категорија тренутно не садржи странице или датотеке.''</div>",
-'hidden-categories' => '{{PLURAL:$1|1=Сакривена категорија|Сакривене категорије}}',
+'hidden-categories' => '{{PLURAL:$1|Сакривена категорија|Сакривене категорије}}',
 'hidden-category-category' => 'Сакривене категорије',
 'category-subcat-count' => '{{PLURAL:$2|Ова категорија садржи само следећу поткатегорију.|Ова категорија има {{PLURAL:$1|следећу поткатегорију|следеће $1 поткатегорије|следећих $1 поткатегорија}}, од укупно $2.}}',
 'category-subcat-count-limited' => 'Ова категорија садржи {{PLURAL:$1|следећу поткатегорију|следеће $1 поткатегорије|следећих $1 поткатегорија}}.',
@@ -658,7 +657,7 @@ $1',
 
 'badaccess' => 'Грешке у овлашћењима',
 'badaccess-group0' => 'Није вам дозвољено да извршите захтевану радњу.',
-'badaccess-groups' => 'Радња је доступна само корисницима у {{PLURAL:$2|1=следећој групи|следећим групама}}:  $1.',
+'badaccess-groups' => 'Радња коју сте захтевали је ограничена само корисницима у {{PLURAL:$2|следећој групи|следећим групама}}: $1.',
 
 'versionrequired' => 'Потребно је издање $1 Медијавикија',
 'versionrequiredtext' => 'Потребно је издање $1 Медијавикија да бисте користили ову страницу.
@@ -672,8 +671,8 @@ $1',
 'youhavenewmessages' => 'Имате $1 ($2).',
 'youhavenewmessagesfromusers' => 'Имате $1 од {{PLURAL:$3|другог корисника|$3 корисника|$3 корисника}} ($2).',
 'youhavenewmessagesmanyusers' => 'Имате $1 од много корисника ($2).',
-'newmessageslinkplural' => '{{PLURAL:$1|1=нову поруку|999=нове поруке}}',
-'newmessagesdifflinkplural' => '{{PLURAL:$1|1=последњу измену|999=последње измене}}',
+'newmessageslinkplural' => '{{PLURAL:$1|нову поруку|999=нове поруке}}',
+'newmessagesdifflinkplural' => '{{PLURAL:$1|последњу измену|999=последње измене}}',
 'youhavenewmessagesmulti' => 'Имате нових порука на $1',
 'editsection' => 'уреди',
 'editold' => 'уреди',
@@ -766,7 +765,7 @@ $1',
 'badtitletext' => 'Наслов странице је неисправан, празан или је међујезички или међувики наслов погрешно повезан.
 Можда садржи знакове који се не могу користити у насловима.',
 'perfcached' => 'Следећи подаци су кеширани и могу бити застарели. Кеш садржи највише {{PLURAL:$1|један резултат|$1 резултата|$1 резултата}}.',
-'perfcachedts' => 'Следећи подаци су кеширании и последњи пут су ажурирани $2 у $3. Кеш садржи највише {{PLURAL:$4|1=један резултат|$4 резултата}}.',
+'perfcachedts' => 'Следећи подаци су кеширани и последњи пут су ажурирани $2 у $3. У кешу {{PLURAL:$4|је доступан највише један резултат|су доступна највише $4 резултата|је доступно највише $4 резултата}}.',
 'querypage-no-updates' => 'Ажурирање ове странице је тренутно онемогућено.
 Подаци који се овде налазе могу бити застарели.',
 'viewsource' => 'Изворни код',
@@ -781,7 +780,7 @@ $1',
 'editinginterface' => "'''Упозорење:''' уређујете страницу која се користи за приказивање текста корисничког окружења.
 Измене на овој страници ће утицати на све кориснике овог викија.
 Да бисте додали или изменили преводе свих викија, посетите [//translatewiki.net/wiki/Main_Page?setlang=sr_ec Транслејтвики], пројекат за локализацију Медијавикија.",
-'cascadeprotected' => 'Ова страница је закључана јер садржи {{PLURAL:$1|1=следећу страницу која је заштићена|следеће странице које су заштићене}} „преносивом“ заштитом:
+'cascadeprotected' => 'Ова страница је закључана јер садржи {{PLURAL:$1|следећу страницу која је заштићена|следеће странице које су заштићене}} „преносивом“ заштитом:
 $2',
 'namespaceprotected' => "Немате дозволу да уређујете странице у именском простору '''$1'''.",
 'customcssprotected' => 'Немате дозволу да мењате ову CSS страницу јер садржи личне поставке другог корисника.',
@@ -798,7 +797,8 @@ $2',
 'invalidtitle-knownnamespace' => 'Неисправан наслов с именским простором „$2“ и текстом „$3“',
 'invalidtitle-unknownnamespace' => 'Неисправан наслов с именским простором бр. $1 и текстом „$2“',
 'exception-nologin' => 'Нисте пријављени',
-'exception-nologin-text' => 'Ова страница или радња захтева да будете пријављени на вики.',
+'exception-nologin-text' => '[[Special:Userlogin|Пријавите се]] да бисте приступили овој страници или радњи.',
+'exception-nologin-text-manual' => 'Морате бити $1 да бисте приступили овој страници или радњи.',
 
 # Virus scanner
 'virus-badscanner' => "Неисправна поставка: непознати скенер за вирусе: ''$1''",
@@ -823,7 +823,7 @@ $2',
 'yourpasswordagain' => 'Потврда лозинке:',
 'createacct-yourpasswordagain' => 'Потврдите лозинку',
 'createacct-yourpasswordagain-ph' => 'Унесите лозинку још једном',
-'remembermypassword' => 'Ð\97апамÑ\82и Ð¼Ð¾Ñ\98Ñ\83 Ð»Ð¾Ð·Ð¸Ð½ÐºÑ\83 Ð½Ð° Ð¾Ð²Ð¾Ð¼ Ð¿Ñ\80егледаÑ\87Ñ\83 (наÑ\98дÑ\83же $1 {{PLURAL:$1|1=дан|дана}})',
+'remembermypassword' => 'Ð\97апамÑ\82и Ð¼Ðµ Ð½Ð° Ð¾Ð²Ð¾Ð¼ Ð¿Ñ\80егледаÑ\87Ñ\83 (наÑ\98дÑ\83же $1 {{PLURAL:$1|дан|дана}})',
 'userlogin-remembermypassword' => 'Остави ме пријављеног/у',
 'userlogin-signwithsecure' => 'Користите сигурну конекцију',
 'yourdomainname' => 'Домен:',
@@ -913,14 +913,14 @@ $2',
 'blocked-mailpassword' => 'Вашој ИП адреси је онемогућено уређивање страница, као и могућност захтевања нове лозинке.',
 'eauthentsent' => 'На наведену е-адресу је послат потврдни код.
 Пре него што пошаљемо даљње поруке, пратите упутства с е-поште да бисте потврдили да сте ви отворили налог.',
-'throttled-mailpassword' => 'Подсетник за лозинку је послат {{PLURAL:$1|пре сат времена|у последња $1 сата|у последњих $1 сати}}.
\94а Ð±Ð¸Ñ\81мо Ñ\81пÑ\80еÑ\87или Ð·Ð»Ð¾Ñ\83поÑ\82Ñ\80ебÑ\83, Ð¿Ð¾Ð´Ñ\81еÑ\82ник Ñ\88аÑ\99емо Ñ\81амо Ñ\98едном Ñ\83 Ñ\80окÑ\83 Ð¾Ð´ {{PLURAL:$1|Ñ\98едног Ñ\81аÑ\82а|$1 сата|$1 сати}}.',
+'throttled-mailpassword' => 'Порука за промену лозинке је послата у {{PLURAL:$1|последњих сат времена|последња $1 сата|последњих $1 сати}}.
\94а Ð±Ð¸Ñ\81мо Ñ\81пÑ\80еÑ\87или Ð·Ð»Ð¾Ñ\83поÑ\82Ñ\80ебÑ\83, Ð¿Ð¾Ð´Ñ\81еÑ\82ник Ñ\88аÑ\99емо Ñ\81амо Ñ\98едном Ñ\83 Ñ\80окÑ\83 Ð¾Ð´ {{PLURAL:$1|Ñ\81аÑ\82 Ð²Ñ\80емена|$1 сата|$1 сати}}.',
 'mailerror' => 'Грешка при слању поруке: $1',
 'acct_creation_throttle_hit' => 'Посетиоци овог викија који користе вашу ИП адресу су већ отворили {{PLURAL:$1|један налог|$1 налога|$1 налога}} претходни дан, што је највећи дозвољени број у том временском периоду.
 Због тога посетиоци с ове ИП адресе тренутно не могу отворити више налога.',
 'emailauthenticated' => 'Ваша е-адреса је потврђена $2 у $3.',
 'emailnotauthenticated' => 'Ваша е-адреса још није потврђена.
-Поруке неће бити послате ни за једну од следећих могућности.',
+Поруке неће бити послате ни у једном од следећих случајева.',
 'noemailprefs' => 'Унесите е-адресу како би ове могућности радиле.',
 'emailconfirmlink' => 'Потврдите своју е-адресу',
 'invalidemailaddress' => 'Е-адреса не може бити прихваћена јер је неисправног облика.
@@ -981,18 +981,18 @@ $2',
 'passwordreset-email' => 'Е-адреса:',
 'passwordreset-emailtitle' => 'Детаљи налога на викију {{SITENAME}}',
 'passwordreset-emailtext-ip' => 'Неко, вероватно Ви, са ИП адресе $1 је затражио нову лозинку на викију {{SITENAME}} ($4).
-Следећи {{PLURAL:$3|1=кориснички налог је повезан|кориснички налози су повезани}} с овом е-адресом:
+Следећи {{PLURAL:$3|кориснички налог је повезан|кориснички налози су повезани}} с овом е-адресом:
 
 $2
 
-{{PLURAL:$3|1=Привремена лозинка истиче|Привремене лозинке истичу}} за {{PLURAL:$5|1=један дан|$5 дана}}.
+{{PLURAL:$3|Привремена лозинка истиче|Привремене лозинке истичу}} за {{PLURAL:$5|један дан|$5 дана}}.
 Пријавите се и изаберите нову лозинку. Ако је неко други захтевао ову радњу или сте се сетили лозинке и не желите да је мењате, занемарите ову поруку и наставите користити стару лозинку.',
-'passwordreset-emailtext-user' => '{{GENDER:$1|Корисник|Корисница|Корисник}} је затражио подсетник о подацима за пријаву на викију {{SITENAME}} ($4).
-Следећи {{PLURAL:$3|1=кориснички налог је повезан|кориснички налози су повезани}} с овом е-адресом:
+'passwordreset-emailtext-user' => '{{GENDER:$1|Корисник је затражио|Корисница је затражила}} подсетник о подацима за пријаву на викију {{SITENAME}} ($4).
+Следећи {{PLURAL:$3|кориснички налог је повезан|кориснички налози су повезани}} с овом е-адресом:
 
 $2
 
-{{PLURAL:$3|1=Привремена лозинка истиче|Привремене лозинке истичу}} за {{PLURAL:$5|један дан|$5 дана|$5 дана}}.
+{{PLURAL:$3|Привремена лозинка истиче|Привремене лозинке истичу}} за {{PLURAL:$5|један дан|$5 дана}}.
 Пријавите се и изаберите нову лозинку. Ако је неко други захтевао ову радњу или сте се сетили лозинке и не желите да је мењате, занемарите ову поруку.',
 'passwordreset-emailelement' => 'Корисничко име: $1
 Привремена лозинка: $2',
@@ -1055,7 +1055,7 @@ $2
 'blockedtitle' => 'Корисник је блокиран',
 'blockedtext' => "'''Ваше корисничко име или ИП адреса је блокирана.'''
 
-Блокирање је {{GENDER:$4|извршио|извршила|извршио}} $1.
+Блокирање је {{GENDER:$4|извршио|извршила}} $1.
 Разлог: ''$2''.
 
 * Датум блокирања: $8
@@ -1186,11 +1186,11 @@ $2
 Последња ставка у историји је приказана испод:",
 'semiprotectedpagewarning' => "'''Напомена:''' ова страница је заштићена, тако да само регистровани корисници могу да је уређују.
 Последњи запис у дневнику је приказан испод:",
-'cascadeprotectedwarning' => "<div style=\"background: #FFBDBD; border: 1px solid #BB7979; color: #000000; font-weight: bold; margin: 2em 0 1em; padding: .5em 1em; vertical-align: middle; clear: both;\">'''Упозорење:''' Ова страница је заштићена тако да је могу уређивати само администратори, јер је она укључена у {{PLURAL:\$1|1=следећу страницу која је|следеће странице које су}} заштићене „преносивом“ заштитом:</div>",
+'cascadeprotectedwarning' => "<div style=\"background: #FFBDBD; border: 1px solid #BB7979; color: #000000; font-weight: bold; margin: 2em 0 1em; padding: .5em 1em; vertical-align: middle; clear: both;\">'''Упозорење:''' Ова страница је заштићена тако да је могу уређивати само администратори, јер је она укључена у {{PLURAL:\$1|следећу страницу која је|следеће странице које су}} заштићене „преносивом“ заштитом:</div>",
 'titleprotectedwarning' => "'''Упозорење: ова страница је заштићена тако да је могу направити само корисници [[Special:ListGroupRights|с одређеним правима]].'''",
-'templatesused' => '{{PLURAL:$1|1=Шаблон|Шаблони}} на овој страници:',
-'templatesusedpreview' => '{{PLURAL:$1|1=Шаблон|Шаблони}} у овом прегледу:',
-'templatesusedsection' => '{{PLURAL:$1|1=Шаблон|Шаблони}} у овом одељку:',
+'templatesused' => '{{PLURAL:$1|Шаблон|Шаблони}} на овој страници:',
+'templatesusedpreview' => '{{PLURAL:$1|Шаблон|Шаблони}} у овом прегледу:',
+'templatesusedsection' => '{{PLURAL:$1|Шаблон|Шаблони}} у овом одељку:',
 'template-protected' => '(заштићен)',
 'template-semiprotected' => '(полузаштићен)',
 'hiddencategories' => 'Ова страница је члан {{PLURAL:$1|једне скривене категорије|$1 скривене категорије|$1 скривених категорија}}:',
@@ -1202,8 +1202,8 @@ $2
 'sectioneditnotsupported-title' => 'Уређивање одељка није подржано',
 'sectioneditnotsupported-text' => 'Уређивање одељка није подржано на овој страници.',
 'permissionserrors' => 'Грешка у дозволи',
-'permissionserrorstext' => 'Немате овлашћење за ту радњу из {{PLURAL:$1|1=следећег|следећих}} разлога:',
-'permissionserrorstext-withaction' => 'Немате дозволу за $2 из {{PLURAL:$1|1=следећег|следећих}} разлога:',
+'permissionserrorstext' => 'Немате овлашћење за ту радњу из {{PLURAL:$1|следећег|следећих}} разлога:',
+'permissionserrorstext-withaction' => 'Немате дозволу за $2 из {{PLURAL:$1|следећег|следећих}} разлога:',
 'recreate-moveddeleted-warn' => "'''Упозорење: поново правите страницу која је претходно обрисана.'''
 
 Размотрите да ли је прикладно да наставите с уређивањем ове странице.
@@ -1340,8 +1340,8 @@ $2
 'revdelete-no-file' => 'Тражена датотека не постоји.',
 'revdelete-show-file-confirm' => 'Желите ли да видите обрисану измену датотеке „<nowiki>$1</nowiki>“ од $2; $3?',
 'revdelete-show-file-submit' => 'Да',
-'revdelete-selected' => "'''{{PLURAL:$2|1=Изабрана измена|Изабране измене}} странице '''[[:$1]]''''''",
-'logdelete-selected' => "'''{{PLURAL:$1|1=Изабрана ставка у историји|Изабране ставке у историји}}:'''",
+'revdelete-selected' => "'''{{PLURAL:$2|Изабрана измена|Изабране измене}} странице [[:$1]]'''",
+'logdelete-selected' => "'''{{PLURAL:$1|Изабрана ставка у историји|Изабране ставке у историји}}:'''",
 'revdelete-text' => "'''Обрисане измене ће и даље бити приказане у историји страница и записима, али делови њиховог садржаја неће бити доступни јавности.'''
 Други администратори на овом викију ће и даље имати приступ сакривеном садржају, а они ће тај садржај моћи да врате путем овог сучеља, осим ако нису постављена додатна ограничења.",
 'revdelete-confirm' => 'Потврдите да намеравате ово урадити, да разумете последице и да то чините у складу с [[{{MediaWiki:Policy-url}}|правилима]].',
@@ -1353,7 +1353,7 @@ $2
 'revdelete-hide-text' => 'Текст ревизије',
 'revdelete-hide-image' => 'Сакриј садржај датотеке',
 'revdelete-hide-name' => 'Сакриј радњу и одредиште',
-'revdelete-hide-comment' => 'сакриј опис измене',
+'revdelete-hide-comment' => 'Опис измене',
 'revdelete-hide-user' => 'Кориснчко име уредника/ИП адреса',
 'revdelete-hide-restricted' => 'Сакриј податке од администратора и других корисника',
 'revdelete-radio-same' => '(не мењај)',
@@ -1362,7 +1362,7 @@ $2
 'revdelete-suppress' => 'Сакриј податке од администратора и других корисника',
 'revdelete-unsuppress' => 'Уклони ограничења на враћеним изменама',
 'revdelete-log' => 'Разлог:',
-'revdelete-submit' => 'Примени на {{PLURAL:$1|1=изабрану измену|изабране измене}}',
+'revdelete-submit' => 'Примени на {{PLURAL:$1|изабрану измену|изабране измене}}',
 'revdelete-success' => "'''Видљивост измене је ажурирана.'''",
 'revdelete-failure' => "'''Не могу да ажурирам видљивост измене:'''
 $1",
@@ -1485,7 +1485,7 @@ $1",
 'searchall' => 'све',
 'showingresults' => "Испод {{PLURAL:$1|је приказан '''1''' резултат|су приказана '''$1''' резултата|је приказано '''$1''' резултата}} почев од броја '''$2'''.",
 'showingresultsnum' => "Испод {{PLURAL:$3|је приказан '''1''' резултат|су приказана '''$3''' резултата|је приказано '''$3''' резултата}} почев од броја '''$2'''.",
-'showingresultsheader' => "{{PLURAL:$5|1=Резултат '''$1''' од '''$3'''|Резултата '''$1 – $2''' од '''$3'''}} за '''$4'''",
+'showingresultsheader' => "{{PLURAL:$5|Резултат '''$1''' од '''$3'''|Резултата '''$1 – $2''' од '''$3'''}} за '''$4'''",
 'search-nonefound' => 'Нема поклапања.',
 'powersearch-legend' => 'Напредна претрага',
 'powersearch-ns' => 'Тражи у следећим именским просторима:',
@@ -1502,6 +1502,7 @@ $1",
 'preferences' => 'Подешавања',
 'mypreferences' => 'Подешавања',
 'prefs-edits' => 'Број измена:',
+'prefsnologintext2' => 'Морате бити $1 да бисте мењали своја подешавања.',
 'prefs-skin' => 'Тема',
 'skin-preview' => 'Прегледај',
 'datedefault' => 'Свеједно',
@@ -1567,7 +1568,7 @@ $1",
 'youremail' => 'Е-адреса:',
 'username' => '{{GENDER:$1|Корисничко име}}:',
 'uid' => '{{GENDER:$1|Кориснички}} ID:',
-'prefs-memberingroups' => '{{GENDER:$2|Корисник|Корисница}} је члан {{PLURAL:$1|1=групе|група}}:',
+'prefs-memberingroups' => '{{GENDER:$2|Корисник|Корисница}} је члан {{PLURAL:$1|групе|група}}:',
 'prefs-memberingroups-type' => '$1',
 'prefs-registration' => 'Време уписа:',
 'prefs-registration-date-time' => '$1',
@@ -1868,12 +1869,12 @@ $1",
 'filename-toolong' => 'Називи датотека могу имати највише 240 бајтова.',
 'badfilename' => 'Назив датотеке је промењен у „$1“.',
 'filetype-mime-mismatch' => 'Екстензија „.$1“ не одговара препознатој врсти MIME датотеке ($2).',
-'filetype-badmime' => 'Датотеке MIME врсте „$1“ није дозвољено слати.',
+'filetype-badmime' => 'Датотеке MIME типа „$1“ није дозвољено слати.',
 'filetype-bad-ie-mime' => 'Ова датотека се не може послати зато што би је Интернет експлорер уочио као „$1“, а то је забрањена и опасна врста датотеке.',
 'filetype-unwanted-type' => '„.$1“ је непожељна врста датотеке.
-{{PLURAL:$3|1=Пожељна врста датотеке је|Пожељне врсте датотека су}} $2.',
-'filetype-banned-type' => '\'\'\'".$1"\'\'\' {{PLURAL:$4|1=је забрањена врста датотеке|су забрањене врсте датотека}}.
-{{PLURAL:$3|1=Дозвољена врста датотеке је|Дозвољене врсте датотека су}} $2.',
+{{PLURAL:$3|Пожељна врста датотеке је|Пожељне врсте датотека су}} $2.',
+'filetype-banned-type' => "'''„.$1“''' {{PLURAL:$4|је забрањена врста датотеке|су забрањене врсте датотека}}.
+{{PLURAL:$3|Дозвољена врста датотеке је|Дозвољене врсте датотека су}} $2.",
 'filetype-missing' => 'Ова датотека нема екстензију.',
 'empty-file' => 'Послата датотека је празна.',
 'file-too-large' => 'Послата датотека је превелика.',
@@ -1915,7 +1916,7 @@ $1",
 'fileexists-shared-forbidden' => 'Датотека с овим називом већ постоји у заједничком складишту.
 Вратите се и пошаљите датотеку с другим називом.
 [[File:$1|thumb|center|$1]]',
-'file-exists-duplicate' => 'Ово је дупликат {{PLURAL:$1|1=следеће датотеке|следећих датотека}}:',
+'file-exists-duplicate' => 'Ово је дупликат {{PLURAL:$1|следеће датотеке|следећих датотека}}:',
 'file-deleted-duplicate' => 'Датотека истоветна овој ([[:$1]]) је претходно обрисана.
 Погледајте историју брисања пре поновног слања.',
 'uploadwarning' => 'Упозорење при отпремању',
@@ -2200,7 +2201,7 @@ $1',
 
 # Random page
 'randompage' => 'Случајна страница',
-'randompage-nopages' => 'Нема страница у {{PLURAL:$2|1=следећем именском простору|следећим именским просторима}}: $1.',
+'randompage-nopages' => 'Нема страница у {{PLURAL:$2|следећем именском простору|следећим именским просторима}}: $1.',
 
 # Random page in category
 'randomincategory' => 'Случајна страница у категорији',
@@ -2322,7 +2323,7 @@ $1',
 'nopagetitle' => 'Не постоји таква страница',
 'nopagetext' => 'Тражена страница не постоји.',
 'pager-newer-n' => '{{PLURAL:$1|новији 1|новија $1|новијих $1}}',
-'pager-older-n' => '{{PLURAL:$1|1=старији 1|старијих $1}}',
+'pager-older-n' => '{{PLURAL:$1|старији 1|старијих $1}}',
 'suppress' => 'Надзор',
 'querypage-disabled' => 'Ова посебна страница је онемогућена ради побољшања перформанси.',
 
@@ -2368,7 +2369,7 @@ $1',
 
 # Special:Categories
 'categories' => 'Категоријe',
-'categoriespagetext' => '{{PLURAL:$1|1=Следећа категорија садржи|Следеће категорије садрже}} странице или датотеке.
+'categoriespagetext' => '{{PLURAL:$1|Следећа категорија садржи|Следеће категорије садрже}} странице или датотеке.
 [[Special:UnusedCategories|Некоришћене категорије]] нису приказане овде.
 Погледајте и [[Special:WantedCategories|тражене категорије]].',
 'categoriesfrom' => 'Прикажи категорије почев од:',
@@ -2387,7 +2388,7 @@ $1',
 'linksearch-ok' => 'Претражи',
 'linksearch-text' => 'Могу се користити џокери попут „*.wikipedia.org“.
 Потребан је највиши домен, као „*.org“.<br />
-{{PLURAL:$2|1=Подржан протокол|Подржани протоколи}}: <code>$1</code> (задаје http:// ако не наведете протокол).',
+{{PLURAL:$2|Подржан протокол|Подржани протоколи}}: <code>$1</code> (задаје http:// ако не наведете протокол).',
 'linksearch-line' => '$1 веза у $2',
 'linksearch-error' => 'Џокери се могу појавити само на почетку адресе.',
 
@@ -2419,12 +2420,12 @@ $1',
 'listgrouprights-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' => 'додаје {{PLURAL:$2|1=следећу групу|следеће групе}}: $1',
-'listgrouprights-removegroup' => 'брише {{PLURAL:$2|1=следећу групу|следеће групе}}: $1',
+'listgrouprights-addgroup' => 'додаје {{PLURAL:$2|следећу групу|следеће групе}}: $1',
+'listgrouprights-removegroup' => 'брише {{PLURAL:$2|следећу групу|следеће групе}}: $1',
 'listgrouprights-addgroup-all' => 'додавање свих група',
 'listgrouprights-removegroup-all' => 'брисање свих група',
-'listgrouprights-addgroup-self' => 'додавање {{PLURAL:$2|1=групе|група}} на свој налог: $1',
-'listgrouprights-removegroup-self' => 'уклањање {{PLURAL:$2|1=групе|група}} са свог налога: $1',
+'listgrouprights-addgroup-self' => 'додавање {{PLURAL:$2|групе|група}} на свој налог: $1',
+'listgrouprights-removegroup-self' => 'уклањање {{PLURAL:$2|групе|група}} са свог налога: $1',
 'listgrouprights-addgroup-self-all' => 'Додај све групе на сопствени налог',
 'listgrouprights-removegroup-self-all' => 'Уклони све групе са сопственог налога',
 
@@ -2596,7 +2597,7 @@ $UNWATCHURL
 'alreadyrolled' => 'Враћање последње измене странице [[:$1]] од стране {{GENDER:$2|корисника|кориснице|корисника}} [[User:$2|$2]] ([[User talk:$2|разговор]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]); неко други је већ изменио или вратио страницу.
 
 Последњу измену је {{GENDER:$3|направио|направила|направио}} [[User:$3|$3]] ([[User talk:$3|разговор]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).',
-'editcomment' => "Опис измене: \"''\$1''\".",
+'editcomment' => "Опис измене: „''$1''“.",
 'revertpage' => 'Враћене измене [[Special:Contributions/$2|$2]] ([[User talk:$2|разговор]]) на последњу измену корисника [[User:$1|$1]]',
 'revertpage-nouser' => 'Враћене су измене скривеног корисника на последњу измену {{GENDER:$1|корисника|кориснице}} [[User:$1|$1]]',
 'rollback-success' => 'Враћене су измене {{GENDER:$1|корисника|кориснице}} $1
@@ -2612,9 +2613,9 @@ $UNWATCHURL
 'protectlogpage' => 'Дневник закључавања',
 'protectlogtext' => 'Испод је списак измена у виду заштите страница.
 Погледајте [[Special:ProtectedPages|списак заштићених страница]] за више детаља.',
-'protectedarticle' => '{{GENDER:|је заштитио|је заштитила|је заштитио}} „[[$1]]“',
+'protectedarticle' => '{{GENDER:|је заштитио|је заштитила}} „[[$1]]“',
 'modifiedarticleprotection' => '{{GENDER:|је променио|је променила|је променио}} степен заштите за „[[$1]]“',
-'unprotectedarticle' => 'Ñ\83клоÑ\9aена Ð·Ð°Ñ\88Ñ\82иÑ\82а са странице „[[$1]]“',
+'unprotectedarticle' => 'Ñ\98е Ñ\81кинÑ\83о Ð·Ð°Ñ\88Ñ\82иÑ\82Ñ\83 са странице „[[$1]]“',
 'movedarticleprotection' => '{{GENDER:|је преместио|је преместила|је преместио}} поставке заштите са „[[$2]]“ на „[[$1]]“',
 'protect-title' => 'Степен заштите за „$1“',
 'protect-title-notallowed' => 'Преглед степена заштите за „$1“',
@@ -2635,7 +2636,7 @@ $UNWATCHURL
 Ово су поставке странице '''$1''':",
 'protect-locked-access' => "Немате овлашћења за мењање степена заштите странице.
 Ово су тренутне поставке странице '''$1''':",
-'protect-cascadeon' => 'Ова страница је тренутно заштићена јер се налази на {{PLURAL:$1|1=страници која има|страницама које имају}} преносиву заштиту.
+'protect-cascadeon' => 'Ова страница је тренутно заштићена јер се налази на {{PLURAL:$1|страници која има|страницама које имају}} преносиву заштиту.
 Можете да промените степен заштите, али то неће утицати на преносиву заштиту.',
 'protect-default' => 'Дозволи свим корисницима',
 'protect-fallback' => 'Дозвољено само корисницима са дозволом „$1“',
@@ -2775,8 +2776,8 @@ $1',
 'isredirect' => 'преусмерење',
 'istemplate' => 'укључивање',
 'isimage' => 'веза до датотеке',
-'whatlinkshere-prev' => '{{PLURAL:$1|1=претходни|претходних $1}}',
-'whatlinkshere-next' => '{{PLURAL:$1|1=следећи|следећих $1}}',
+'whatlinkshere-prev' => '{{PLURAL:$1|претходни|претходних $1}}',
+'whatlinkshere-next' => '{{PLURAL:$1|следећи|следећих $1}}',
 'whatlinkshere-links' => '← везе',
 'whatlinkshere-hideredirs' => '$1 преусмерења',
 'whatlinkshere-hidetrans' => '$1 укључивања',
@@ -2848,7 +2849,7 @@ $1',
 'blocklist-reason' => 'Разлог',
 'ipblocklist-submit' => 'Претражи',
 'ipblocklist-localblock' => 'Локално блокирање',
-'ipblocklist-otherblocks' => '{{PLURAL:$1|1=Друго блокирање|Друга блокирања}}',
+'ipblocklist-otherblocks' => '{{PLURAL:$1|Друго блокирање|Друга блокирања}}',
 'infiniteblock' => 'трајно',
 'expiringblock' => 'истиче дана $1 у $2',
 'anononlyblock' => 'само анонимни',
@@ -2863,14 +2864,14 @@ $1',
 'change-blocklink' => 'промени блокирање',
 'contribslink' => 'доприноси',
 'emaillink' => 'пошаљи е-поруку',
-'autoblocker' => 'Аутоматски сте блокирани јер делите ИП адресу с {{GENDER:$1|корисником|корисницом}} [[User:$1|$1]].
+'autoblocker' => 'Аутоматски сте блокирани јер делите ИП адресу с корисником/цом [[User:$1|$1]].
 Разлог блокирања: „$2“',
 'blocklogpage' => 'Дневник блокирања',
 'blocklog-showlog' => '{{GENDER:$1|Овај корисник је раније блокиран|Ова корисница је раније блокирана|Овај корисник је раније блокиран}}.
 Историја блокирања се налази испод:',
 'blocklog-showsuppresslog' => '{{GENDER:|Овај корисник је раније блокиран и сакривен|Ова корисница је раније блокирана и сакривена|Овај корисник је раније блокиран и сакривен}}.
 Историја сакривања се налази испод:',
-'blocklogentry' => '{{GENDER:|је блокирао|је блокирала}} [[$1]] с роком истицања од $2 $3',
+'blocklogentry' => 'је блокирао [[$1]] с роком истицања од $2 $3',
 'reblock-logentry' => '{{GENDER:|је променио|је променила|је променио}} подешавања за блокирање {{GENDER:$1|корисника|кориснице|корисника}} [[$1]] с роком истека од $2 ($3)',
 'blocklogtext' => 'Ово је дневник блокирања и деблокирања корисника.
 Аутоматски блокиране ИП адресе нису наведене.
@@ -2889,7 +2890,7 @@ $1',
 'ipb_hide_invalid' => 'Не могу да потиснем овај налог. Можда има превише измена.',
 'ipb_already_blocked' => '„$1“ је већ блокиран',
 'ipb-needreblock' => '$1 је већ блокиран. Желите ли да промените подешавања?',
-'ipb-otherblocks-header' => '{{PLURAL:$1|1=Друга блокада|Друге блокаде}}',
+'ipb-otherblocks-header' => '{{PLURAL:$1|Друга блокада|Друге блокаде}}',
 'unblock-hideuser' => 'Не можете деблокирати овог корисника јер је његово корисничко име сакривено.',
 'ipb_cant_unblock' => 'Грешка: блокада $1 не постоји. Можда је корисник деблокиран.',
 'ipb_blocked_as_range' => 'Грешка: ИП адреса $1 није директно блокирана и не може да се деблокира.
@@ -2987,7 +2988,7 @@ $1',
 'movepage-max-pages' => 'Највише $1 {{PLURAL:$1|страница је премештена|странице су премештене|страница је премештено}}, и више не може да буде аутоматски премештено.',
 'movelogpage' => 'Дневник премештања',
 'movelogpagetext' => 'Испод се налази списак премештања страница.',
-'movesubpage' => '{{PLURAL:$1|1=Подстраница|Подстранице}}',
+'movesubpage' => '{{PLURAL:$1|Подстраница|Подстранице}}',
 'movesubpagetext' => 'Ова страница има $1 {{PLURAL:$1|подстраницу приказану|подстранице приказане|подстраница приказаних}} испод.',
 'movenosubpage' => 'Ова страница нема подстрана.',
 'movereason' => 'Разлог:',
@@ -3124,7 +3125,7 @@ $1',
 'import-error-special' => 'Не могу да увезем страницу „$1“ јер она припада посебном именском простору које не прихвата странице.',
 'import-error-invalid' => 'Не могу да увезем страницу „$1“ јер је њен назив неисправан.',
 'import-error-unserialize' => 'Верзија $2 странице $1 не може бити прочитана/увезена. Записано је да верзија користи $3 тип садржаја у $4 формату.',
-'import-options-wrong' => '{{PLURAL:$2|1=Погрешна опција|Погрешне опције}}: <nowiki>$1</nowiki>',
+'import-options-wrong' => '{{PLURAL:$2|Погрешна опција|Погрешне опције}}: <nowiki>$1</nowiki>',
 'import-rootpage-invalid' => 'Наведена основна страница има неисправан наслов.',
 'import-rootpage-nosubpage' => 'Именски простор „$1“ основне странице не дозвољава подстранице.',
 
@@ -3243,14 +3244,14 @@ $1',
 'notacceptable' => 'Сервер не може да направи податке у формату погодном за ваш клијент.',
 
 # Attribution
-'anonymous' => 'Анонимни {{PLURAL:$1|1=корисник|корисници}} на пројекту {{SITENAME}}',
+'anonymous' => 'Анонимни {{PLURAL:$1|корисник|корисници}} на пројекту {{SITENAME}}',
 'siteuser' => '{{SITENAME}} корисник $1',
 'anonuser' => '{{SITENAME}} анониман корисник $1',
 'lastmodifiedatby' => 'Ову страницу је последњи пут {{GENDER:$4|изменио|изменила|изменио}} $3, $1 у $2.',
-'othercontribs' => 'Засновано на раду корисникâ $1.',
+'othercontribs' => 'Засновано на раду корисника $1.',
 'others' => 'други',
-'siteusers' => '{{PLURAL:$2|1=корисник|корисници}} на пројекту {{SITENAME}} $1',
-'anonusers' => '{{PLURAL:$2|1=анониман корисник|анонимни корисници}} на пројекту {{SITENAME}} $1',
+'siteusers' => '{{PLURAL:$2|корисник|корисници}} на пројекту {{SITENAME}} $1',
+'anonusers' => '{{PLURAL:$2|анониман корисник|анонимни корисници}} на пројекту {{SITENAME}} $1',
 'creditspage' => 'Аутори странице',
 'nocredits' => 'Не постоје подаци о аутору ове странице.',
 
@@ -3258,7 +3259,7 @@ $1',
 'spamprotectiontitle' => 'Филтер за заштиту од непожељних порука',
 'spamprotectiontext' => 'Страница коју желите да сачувате је блокирана од филтера против непожељних порука.
 Ово је вероватно изазвано везом до спољашњег сајта који се налази на црној листи.',
-'spamprotectionmatch' => 'СледеÑ\9bи Ñ\82екÑ\81Ñ\82 Ñ\98е Ð¸Ð·Ð°Ð·Ð²Ð°Ð¾ Ð½Ð°Ñ\88 Ñ\84илÑ\82еÑ\80 Ð·Ð° Ð½ÐµÐ¿Ð¾Ð¶ÐµÑ\99не поруке: $1',
+'spamprotectionmatch' => 'СледеÑ\9bи Ñ\82екÑ\81Ñ\82 Ñ\98е Ð¸Ð·Ð°Ð·Ð²Ð°Ð¾ Ð½Ð°Ñ\88 Ñ\84илÑ\82еÑ\80 Ð·Ð° Ð½ÐµÐ¶ÐµÑ\99ене поруке: $1',
 'spambot_username' => 'Чишћење непожељних порука у Медијавикији',
 'spam_reverting' => 'Враћам на последњу измену која не садржи везе до $1',
 'spam_blanking' => 'Све измене садрже везе до $1. Чистим',
@@ -3282,7 +3283,7 @@ $1',
 'pageinfo-robot-noindex' => 'Није дозвољено',
 'pageinfo-views' => 'Број прегледа',
 'pageinfo-watchers' => 'Број надгледача страница',
-'pageinfo-few-watchers' => 'Мање од $1 {{PLURAL:$1|1=пратиоца|пратилаца}}',
+'pageinfo-few-watchers' => 'Мање од $1 {{PLURAL:$1|пратиоца|пратилаца}}',
 'pageinfo-redirects-name' => 'Број преусмерења на ову страницу',
 'pageinfo-subpages-name' => 'Подстранице ове странице',
 'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|преусмерење|преусмерења|преусмерења}}; $3 {{PLURAL:$3|непреусмерење|непреусмерења|непреусмерења}})',
@@ -3294,10 +3295,10 @@ $1',
 'pageinfo-authors' => 'Број засебних аутора',
 'pageinfo-recent-edits' => 'Број скорашњих измена (у последњих $1)',
 'pageinfo-recent-authors' => 'Број скорашњих засебних аутора',
-'pageinfo-magic-words' => '{{PLURAL:$1|1=Магична реч|Магичне речи}} ($1)',
-'pageinfo-hidden-categories' => '{{PLURAL:$1|1=Сакривена категорија|Сакривене категорије}} ($1)',
-'pageinfo-templates' => '{{PLURAL:$1|1=Укључени шаблон|Укључени шаблони}} ($1)',
-'pageinfo-transclusions' => '{{PLURAL:$1|1=Страница|Странице}} укључене у ($1)',
+'pageinfo-magic-words' => '{{PLURAL:$1|Магична реч|Магичне речи}} ($1)',
+'pageinfo-hidden-categories' => '{{PLURAL:$1|Сакривена категорија|Сакривене категорије}} ($1)',
+'pageinfo-templates' => '{{PLURAL:$1|Укључени шаблон|Укључени шаблони}} ($1)',
+'pageinfo-transclusions' => '{{PLURAL:$1|Страница|Странице}} укључене у ($1)',
 'pageinfo-toolboxlink' => 'Подаци о страници',
 'pageinfo-redirectsto' => 'Преусмерава на',
 'pageinfo-redirectsto-info' => 'подаци',
@@ -3366,7 +3367,7 @@ $1',
 'svg-long-error' => 'Неисправна SVG датотека: $1',
 'show-big-image' => 'Пуна величина',
 'show-big-image-preview' => 'Величина овог приказа: $1.',
-'show-big-image-other' => '{{PLURAL:$2|1=Друга резолуција|Друге резолуције}}: $1.',
+'show-big-image-other' => '{{PLURAL:$2|Друга резолуција|Друге резолуције}}: $1.',
 'show-big-image-size' => '$1 × $2 пиксела',
 'file-info-gif-looped' => 'петља',
 'file-info-gif-frames' => '$1 {{PLURAL:$1|кадар|кадра|кадрова}}',
@@ -3399,15 +3400,15 @@ $1',
 'hours' => '{{PLURAL:$1|$1 сат|$1 сата|$1 сати}}',
 'days' => '{{PLURAL:$1|$1 дан|$1 дана|$1 дана}}',
 'weeks' => '{{PLURAL:$1|$1 седмица}}',
-'months' => '{{PLURAL:$1|1=$1 месец|$1 месеци}}',
-'years' => '{{PLURAL:$1|1=$1 година|$1 године}}',
+'months' => '{{PLURAL:$1|$1 месец|$1 месеци}}',
+'years' => '{{PLURAL:$1|$1 година|$1 године}}',
 'ago' => 'пре $1',
 'just-now' => 'управо сад',
 
 # Human-readable timestamps
-'hours-ago' => 'Пре $1 {{PLURAL:$1|1=сат|сати}}',
-'minutes-ago' => 'Пре $1 {{PLURAL:$1|1=минут|минута}}',
-'seconds-ago' => 'Пре $1 {{PLURAL:$1|1=секунда|секунди}}',
+'hours-ago' => 'Пре $1 {{PLURAL:$1|сат|сата|сати}}',
+'minutes-ago' => 'Пре $1 {{PLURAL:$1|минут|минута}}',
+'seconds-ago' => 'Пре $1 {{PLURAL:$1|секунда|секунди}}',
 'monday-at' => 'Понедељак у $1',
 'tuesday-at' => 'Уторак у $1',
 'wednesday-at' => 'Среда у $1',
@@ -4077,7 +4078,7 @@ $5
 
 # Friendlier slave lag warnings
 'lag-warn-normal' => 'Измене новије од $1 {{PLURAL:$1|секунде|секунде|секунди}} неће бити приказане.',
-'lag-warn-high' => 'Због преоптерећења базе података, измене новије од $1 {{PLURAL:$1|1=секунда|секунде}} неће бити приказане.',
+'lag-warn-high' => 'Због преоптерећења базе података, измене новије од $1 {{PLURAL:$1|секунда|секунде}} неће бити приказане.',
 
 # Watchlist editor
 'watchlistedit-numitems' => 'Ваш списак надгледања садржи {{PLURAL:$1|један наслов|$1 наслова|$1 наслова}}, без страница за разговор.',
@@ -4099,7 +4100,7 @@ $5
 '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 наслов је уклоњен|Уклоњена су $1 наслова|Уклоњено је $1 наслова}}:',
 
 # Watchlist editing tools
 'watchlisttools-view' => 'прикажи сродне измене',
@@ -4262,7 +4263,7 @@ $5
 'tags' => 'Важеће ознаке измена',
 'tag-filter' => 'Филтер за [[Special:Tags|ознаке]]:',
 'tag-filter-submit' => 'Филтрирај',
-'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|1=Ознака|Ознаке}}]]: $2)',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Ознака|Ознаке}}]]: $2)',
 'tags-title' => 'Ознаке',
 'tags-intro' => 'На овој страници је наведен списак ознака с којима програм може да означи измене и његово значење.',
 'tags-tag' => 'Назив ознаке',
@@ -4315,15 +4316,15 @@ $5
 'sqlite-no-fts' => '$1 без подршке претраге целог текста',
 
 # New logging system
-'logentry-delete-delete' => '$1 је {{GENDER:|обрисао|обрисала}} страницу $3',
+'logentry-delete-delete' => '$1 је {{GENDER:$2|обрисао|обрисала}} страницу $3',
 'logentry-delete-restore' => '$1 је {{GENDER:$2|вратио|вратила}} страницу $3',
-'logentry-delete-event' => '$1 је {{GENDER:$2|променио|променила}} видљивост {{PLURAL:$5|1=догађаја|$5 догађаја}} у дневнику на $3: $4',
-'logentry-delete-revision' => '$1 је {{GENDER:$2|променио|променила}} видљивост {{PLURAL:$5|1=измене|$5 измена}} на страници $3: $4',
+'logentry-delete-event' => '$1 је {{GENDER:$2|променио|променила}} видљивост {{PLURAL:$5|догађаја|$5 догађаја}} у дневнику на $3: $4',
+'logentry-delete-revision' => '$1 је {{GENDER:$2|променио|променила}} видљивост {{PLURAL:$5|измене|$5 измена}} на страници $3: $4',
 'logentry-delete-event-legacy' => '$1 је {{GENDER:$2|променио|променила}} видљивост догађаја у дневнику на $3',
 'logentry-delete-revision-legacy' => '$1 је {{GENDER:$2|променио|променила}} видљивост измена на страници $3',
 'logentry-suppress-delete' => '$1 је {{GENDER:$2|потиснуо|потиснула}} страницу $3',
-'logentry-suppress-event' => '$1 је тајно {{GENDER:$2|променио|променила}} видљивост {{PLURAL:$5|1=догађаја|$5 догађаја}} у дневнику на $3: $4',
-'logentry-suppress-revision' => '$1 је тајно {{GENDER:$2|променио|променила}} видљивост {{PLURAL:$5|1=измене|$5 измена}} на страници $3: $4',
+'logentry-suppress-event' => '$1 је тајно {{GENDER:$2|променио|променила}} видљивост {{PLURAL:$5|догађаја|$5 догађаја}} у дневнику на $3: $4',
+'logentry-suppress-revision' => '$1 је тајно {{GENDER:$2|променио|променила}} видљивост {{PLURAL:$5|измене|$5 измена}} на страници $3: $4',
 'logentry-suppress-event-legacy' => '$1 је потајно {{GENDER:$2|променио|променила}} видљивост догађаја у дневнику на $3',
 'logentry-suppress-revision-legacy' => '$1 је тајно {{GENDER:$2|променио|променила}} видљивост измена на страници $3',
 'revdelete-content-hid' => 'садржај је сакривен',
@@ -4374,10 +4375,10 @@ $5
 'api-error-badaccess-groups' => 'Није вам дозвољено да отпремате датотеке на овај вики.',
 'api-error-badtoken' => 'Унутрашња грешка: неисправан жетон.',
 'api-error-copyuploaddisabled' => 'Отпремање путем адресе је онемогућено на овом серверу.',
-'api-error-duplicate' => 'Већ {{PLURAL:$1|1=постоји [$2 друга датотека]|постоје [$2 друге датотеке]}} с истим садржајем.',
-'api-error-duplicate-archive' => '{{PLURAL:$1|1=Постојала је [$2 друга датотека]|Постојале су [$2 друге датотеке]}} с истим садржајем, али {{PLURAL:$1|1=је обрисана|су обрисане}}.',
-'api-error-duplicate-archive-popup-title' => '{{PLURAL:$1|1=Дуплирана датотека која је већ обрисана|Дуплиране датотеке које су већ обрисане}}',
-'api-error-duplicate-popup-title' => '{{PLURAL:$1|1=Дуплирана датотека|Дуплиране датотеке}}',
+'api-error-duplicate' => 'Већ {{PLURAL:$1|постоји [$2 друга датотека]|постоје [$2 друге датотеке]}} с истим садржајем.',
+'api-error-duplicate-archive' => '{{PLURAL:$1|Постојала је [$2 друга датотека]|Постојале су [$2 друге датотеке]}} с истим садржајем, али {{PLURAL:$1|је обрисана|су обрисане}}.',
+'api-error-duplicate-archive-popup-title' => '{{PLURAL:$1|Дуплирана датотека која је већ обрисана|Дуплиране датотеке које су већ обрисане}}',
+'api-error-duplicate-popup-title' => '{{PLURAL:$1|Дуплирана датотека|Дуплиране датотеке}}',
 'api-error-empty-file' => 'Послата датотека је празна.',
 'api-error-emptypage' => 'Стварање нових празних страница није дозвољено.',
 'api-error-fetchfileerror' => 'Унутрашња грешка: дошло је до грешке при добављању датотеке.',
@@ -4386,7 +4387,7 @@ $5
 'api-error-file-too-large' => 'Послата датотека је превелика.',
 'api-error-filename-tooshort' => 'Назив датотеке је прекратак.',
 'api-error-filetype-banned' => 'Ова врста датотеке је забрањена.',
-'api-error-filetype-banned-type' => '$1 {{PLURAL:$4|1=је забрањена врста датотеке|су забрањене врсте датотека}}. {{PLURAL:$3|1=Дозвољена је|Дозвољене су}} $2.',
+'api-error-filetype-banned-type' => '$1 {{PLURAL:$4|је забрањена врста датотеке|су забрањене врсте датотека}}. {{PLURAL:$3|Дозвољена је|Дозвољене су}} $2.',
 'api-error-filetype-missing' => 'Датотеци недостаје наставак.',
 'api-error-hookaborted' => 'Измена је одбачена од куке за проширења.',
 'api-error-http' => 'Унутрашња грешка: не могу да се повежем са сервером.',
@@ -4427,7 +4428,7 @@ $5
 'rotate-comment' => 'Слика је ротирана у смеру казаљке на сату за {{PLURAL:$1|степени}}',
 
 # Limit report
-'limitreport-walltime-value' => '$1 {{PLURAL:$1|1=секунда|секунди}}',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|секунда|секунди}}',
 'limitreport-postexpandincludesize-value' => '$1/$2 бајтова',
 'limitreport-templateargumentsize-value' => '$1/$2 бајтова',
 
index e5b7e95..38fee55 100644 (file)
@@ -316,7 +316,6 @@ $messages = array(
 'tog-numberheadings' => 'Samostalno numeriši podnaslove',
 'tog-showtoolbar' => 'Prikaži traku s alatkama za uređivanje',
 'tog-editondblclick' => 'Uređivanje stranica dvostrukim klikom',
-'tog-editsection' => 'Veze za uređivanje pojedinačnih odeljaka',
 'tog-editsectiononrightclick' => 'Uređivanje odeljaka desnim klikom na njihove naslove',
 'tog-showtoc' => 'Prikaži sadržaj stranica koje imaju više od tri podnaslova',
 'tog-rememberpassword' => 'Zapamti me na ovom pregledaču (najduže $1 {{PLURAL:$1|1=dan|dana}})',
@@ -426,12 +425,12 @@ $messages = array(
 'december-date' => '$1. decembar',
 
 # Categories related messages
-'pagecategories' => '{{PLURAL:$1|1=Kategorija|Kategorije}}',
+'pagecategories' => '{{PLURAL:$1|Kategorija|Kategorije}}',
 'category_header' => 'Stranice u kategoriji „$1“',
 'subcategories' => 'Potkategorije',
 'category-media-header' => 'Datoteke u kategoriji „$1“',
 'category-empty' => "<div style=\"margin:2em 1em 0 1em; padding:0.5em; border:1px solid #AAA; text-align:center;\">''Ova kategorija trenutno ne sadrži stranice ili datoteke.''</div>",
-'hidden-categories' => '{{PLURAL:$1|1=Sakrivena kategorija|Sakrivene kategorije}}',
+'hidden-categories' => '{{PLURAL:$1|Sakrivena kategorija|Sakrivene kategorije}}',
 'hidden-category-category' => 'Sakrivene kategorije',
 'category-subcat-count' => '{{PLURAL:$2|Ova kategorija sadrži samo sledeću potkategoriju.|Ova kategorija ima {{PLURAL:$1|sledeću potkategoriju|sledeće $1 potkategorije|sledećih $1 potkategorija}}, od ukupno $2.}}',
 'category-subcat-count-limited' => 'Ova kategorija sadrži {{PLURAL:$1|sledeću potkategoriju|sledeće $1 potkategorije|sledećih $1 potkategorija}}.',
@@ -567,7 +566,7 @@ $1',
 
 'badaccess' => 'Greške u ovlašćenjima',
 'badaccess-group0' => 'Nije vam dozvoljeno da izvršite zahtevanu radnju.',
-'badaccess-groups' => 'Radnja je dostupna samo korisnicima u {{PLURAL:$2|1=sledećoj grupi|sledećim grupama}}:  $1.',
+'badaccess-groups' => 'Radnja koju ste zahtevali je ograničena samo korisnicima u {{PLURAL:$2|sledećoj grupi|sledećim grupama}}: $1.',
 
 'versionrequired' => 'Potrebno je izdanje $1 Medijavikija',
 'versionrequiredtext' => 'Potrebno je izdanje $1 Medijavikija da biste koristili ovu stranicu.
@@ -581,8 +580,8 @@ Pogledajte stranicu za [[Special:Version|izdanje]].',
 'youhavenewmessages' => 'Imate $1 ($2).',
 'youhavenewmessagesfromusers' => 'Imate $1 od {{PLURAL:$3|drugog korisnika|$3 korisnika|$3 korisnika}} ($2).',
 'youhavenewmessagesmanyusers' => 'Imate $1 od mnogo korisnika ($2).',
-'newmessageslinkplural' => '{{PLURAL:$1|1=novu poruku|999=nove poruke}}',
-'newmessagesdifflinkplural' => '{{PLURAL:$1|1=poslednju izmenu|999=poslednje izmene}}',
+'newmessageslinkplural' => '{{PLURAL:$1|novu poruku|999=nove poruke}}',
+'newmessagesdifflinkplural' => '{{PLURAL:$1|poslednju izmenu|999=poslednje izmene}}',
 'youhavenewmessagesmulti' => 'Imate novih poruka na $1',
 'editsection' => 'uredi',
 'editold' => 'uredi',
@@ -673,7 +672,7 @@ Nije dato nikakvo obrazloženje.',
 'badtitletext' => 'Naslov stranice je neispravan, prazan ili je međujezički ili međuviki naslov pogrešno povezan.
 Možda sadrži znakove koji se ne mogu koristiti u naslovima.',
 'perfcached' => 'Sledeći podaci su keširani i mogu biti zastareli. Keš sadrži najviše {{PLURAL:$1|jedan rezultat|$1 rezultata|$1 rezultata}}.',
-'perfcachedts' => 'Sledeći podaci su keširani i poslednji put su ažurirani $2 u $3. Keš sadrži najviše {{PLURAL:$4|1=jedan rezultat|$4 rezultata}}.',
+'perfcachedts' => 'Sledeći podaci su keširani i poslednji put su ažurirani $2 u $3. U kešu {{PLURAL:$4|je dostupan najviše jedan rezultat|su dostupna najviše $4 rezultata|je dostupno najviše $4 rezultata}}.',
 'querypage-no-updates' => 'Ažuriranje ove stranice je trenutno onemogućeno.
 Podaci koji se ovde nalaze mogu biti zastareli.',
 'viewsource' => 'Izvorni kod',
@@ -688,7 +687,7 @@ Da biste dodali ili izmenili prevode svih vikija, posetite [//translatewiki.net/
 'editinginterface' => "'''Upozorenje:''' uređujete stranicu koja se koristi za prikazivanje teksta korisničkog okruženja.
 Izmene na ovoj stranici će uticati na sve korisnike ovog vikija.
 Da biste dodali ili izmenili prevode svih vikija, posetite [//translatewiki.net/wiki/Main_Page?setlang=sr_ec Translejtviki], projekat za lokalizaciju Medijavikija.",
-'cascadeprotected' => 'Ova stranica je zaključana jer sadrži {{PLURAL:$1|1=sledeću stranicu koja je zaštićena|sledeće stranice koje su zaštićene}} „prenosivom“ zaštitom:
+'cascadeprotected' => 'Ova stranica je zaključana jer sadrži {{PLURAL:$1|sledeću stranicu koja je zaštićena|sledeće stranice koje su zaštićene}} „prenosivom“ zaštitom:
 $2',
 'namespaceprotected' => "Nemate dozvolu da uređujete stranice u imenskom prostoru '''$1'''.",
 'customcssprotected' => 'Nemate dozvolu da menjate ovu CSS stranicu jer sadrži lične postavke drugog korisnika.',
@@ -701,7 +700,7 @@ Administrator koji ju je zaključao ponudio je sledeće objašnjenje: „$3“.'
 'invalidtitle-knownnamespace' => 'Neispravan naslov s imenskim prostorom „$2“ i tekstom „$3“',
 'invalidtitle-unknownnamespace' => 'Neispravan naslov s imenskim prostorom br. $1 i tekstom „$2“',
 'exception-nologin' => 'Niste prijavljeni',
-'exception-nologin-text' => 'Ova stranica ili radnja zahteva da budete prijavljeni na viki.',
+'exception-nologin-text' => '[[Special:Userlogin|Prijavite se]] da biste pristupili ovoj stranici ili radnji.',
 
 # Virus scanner
 'virus-badscanner' => "Neispravna postavka: nepoznati skener za viruse: ''$1''",
@@ -723,7 +722,7 @@ Imajte na umu da neke stranice mogu nastaviti da se prikazuju kao da ste još pr
 'yourpasswordagain' => 'Potvrda lozinke:',
 'createacct-yourpasswordagain' => 'Potvrdite lozinku',
 'createacct-yourpasswordagain-ph' => 'Unesite lozinku još jednom',
-'remembermypassword' => 'Zapamti me na ovom pregledaču (najduže $1 {{PLURAL:$1|dan|dana|dana}})',
+'remembermypassword' => 'Zapamti me na ovom pregledaču (najduže $1 {{PLURAL:$1|dan|dana}})',
 'userlogin-remembermypassword' => 'Ostavi me prijavljenog/u',
 'userlogin-signwithsecure' => 'Koristite sigurnu konekciju',
 'yourdomainname' => 'Domen:',
@@ -805,14 +804,14 @@ Prijavite se pošto je primite.',
 'blocked-mailpassword' => 'Vašoj IP adresi je onemogućeno uređivanje stranica, kao i mogućnost zahtevanja nove lozinke.',
 'eauthentsent' => 'Na navedenu e-adresu je poslat potvrdni kod.
 Pre nego što pošaljemo daljnje poruke, pratite uputstva s e-pošte da biste potvrdili da ste vi otvorili nalog.',
-'throttled-mailpassword' => 'Podsetnik za lozinku je poslat {{PLURAL:$1|pre sat vremena|u poslednja $1 sata|u poslednjih $1 sati}}.
-Da bismo sprečili zloupotrebu, posednik šaljemo samo jednom u roku od {{PLURAL:$1|jednog sata|$1 sata|$1 sati}}.',
+'throttled-mailpassword' => 'Poruka za promenu lozinke je poslata u {{PLURAL:$1|poslednjih sat vremena|poslednja $1 sata|poslednjih $1 sati}}.
+Da bismo sprečili zloupotrebu, podsetnik šaljemo samo jednom u roku od {{PLURAL:$1|sat vremena|$1 sata|$1 sati}}.',
 'mailerror' => 'Greška pri slanju poruke: $1',
 'acct_creation_throttle_hit' => 'Posetioci ovog vikija koji koriste vašu IP adresu su već otvorili {{PLURAL:$1|jedan nalog|$1 naloga|$1 naloga}} prethodni dan, što je najveći dozvoljeni broj u tom vremenskom periodu.
 Zbog toga posetioci s ove IP adrese trenutno ne mogu otvoriti više naloga.',
 'emailauthenticated' => 'Vaša e-adresa je potvrđena $2 u $3.',
 'emailnotauthenticated' => 'Vaša e-adresa još nije potvrđena.
-Poruke neće biti poslate ni za jednu od sledećih mogućnosti.',
+Poruke neće biti poslate ni u jednom od sledećih slučajeva.',
 'noemailprefs' => 'Unesite e-adresu kako bi ove mogućnosti radile.',
 'emailconfirmlink' => 'Potvrdite svoju e-adresu',
 'invalidemailaddress' => 'E-adresa ne može biti prihvaćena jer je neispravnog oblika.
@@ -867,19 +866,19 @@ Možda ste već promenili lozinku ili ste zatražili novu privremenu lozinku.',
 'passwordreset-capture-help' => 'Ako označite ovu kućicu, e-poruka s privremenom lozinkom će biti prikazana i poslata korisniku.',
 'passwordreset-email' => 'E-adresa:',
 'passwordreset-emailtitle' => 'Detalji naloga na vikiju {{SITENAME}}',
-'passwordreset-emailtext-ip' => 'Neko, verovatno vi, sa IP adrese $1 je zatražio novu lozinku na vikiju {{SITENAME}} ($4).
-Sledeći {{PLURAL:$3|1=korisnički nalog je povezan|korisnički nalozi su povezani}} s ovom e-adresom:
+'passwordreset-emailtext-ip' => 'Neko, verovatno Vi, sa IP adrese $1 je zatražio novu lozinku na vikiju {{SITENAME}} ($4).
+Sledeći {{PLURAL:$3|korisnički nalog je povezan|korisnički nalozi su povezani}} s ovom e-adresom:
 
 $2
 
-{{PLURAL:$3|1=Privremena lozinka ističe|Privremene lozinke ističu}} za {{PLURAL:$5|jedan dan|$5 dana|$5 dana}}.
-Prijavite se i izaberite novu lozinku. Ako je neko drugi zahtevao ovu radnju ili ste se setili lozinke i ne želite da je menjate, zanemarite ovu poruku.',
-'passwordreset-emailtext-user' => '{{GENDER:$1|Korisnik|Korisnica|Korisnik}} $1 je zatražio podsetnik o podacima za prijavu na vikiju {{SITENAME}} ($4).
-Sledeći {{PLURAL:$3|1=korisnički nalog je povezan|korisnički nalozi su povezani}} s ovom e-adresom:
+{{PLURAL:$3|Privremena lozinka ističe|Privremene lozinke ističu}} za {{PLURAL:$5|jedan dan|$5 dana}}.
+Prijavite se i izaberite novu lozinku. Ako je neko drugi zahtevao ovu radnju ili ste se setili lozinke i ne želite da je menjate, zanemarite ovu poruku i nastavite koristiti staru lozinku.',
+'passwordreset-emailtext-user' => '{{GENDER:$1|Korisnik je zatražio|Korisnica je zatražila}} podsetnik o podacima za prijavu na vikiju {{SITENAME}} ($4).
+Sledeći {{PLURAL:$3|korisnički nalog je povezan|korisnički nalozi su povezani}} s ovom e-adresom:
 
 $2
 
-{{PLURAL:$3|1=Privremena lozinka ističe|Privremene lozinke ističu}} za {{PLURAL:$5|jedan dan|$5 dana|$5 dana}}.
+{{PLURAL:$3|Privremena lozinka ističe|Privremene lozinke ističu}} za {{PLURAL:$5|jedan dan|$5 dana}}.
 Prijavite se i izaberite novu lozinku. Ako je neko drugi zahtevao ovu radnju ili ste se setili lozinke i ne želite da je menjate, zanemarite ovu poruku.',
 'passwordreset-emailelement' => 'Korisničko ime: $1
 Privremena lozinka: $2',
@@ -941,7 +940,7 @@ Ako ponovo kliknete na „{{int:savearticle}}“, vaša izmena će biti sačuvan
 'blockedtitle' => 'Korisnik je blokiran',
 'blockedtext' => "'''Vaše korisničko ime ili IP adresa je blokirana.'''
 
-Blokiranje je {{GENDER:$4|izvršio|izvršila|izvršio}} $1.
+Blokiranje je {{GENDER:$4|izvršio|izvršila}} $1.
 Razlog: ''$2''.
 
 * Datum blokiranja: $8
@@ -1072,11 +1071,11 @@ Administrator koji je zaključao bazu podataka je naveo sledeće objašnjenje: $
 Poslednja stavka u istoriji je prikazana ispod:",
 'semiprotectedpagewarning' => "'''Napomena:''' ova stranica je zaštićena, tako da samo registrovani korisnici mogu da je uređuju.
 Poslednji zapis u dnevniku je prikazan ispod:",
-'cascadeprotectedwarning' => "<div style=\"background: #FFBDBD; border: 1px solid #BB7979; color: #000000; font-weight: bold; margin: 2em 0 1em; padding: .5em 1em; vertical-align: middle; clear: both;\">'''Upozorenje:''' Ova stranica je zaštićena tako da je mogu uređivati samo administratori, jer je ona uključena u {{PLURAL:\$1|1=sledeću stranicu koja je|sledeće stranice koje su}} zaštićene „prenosivom“ zaštitom:</div>",
+'cascadeprotectedwarning' => "<div style=\"background: #FFBDBD; border: 1px solid #BB7979; color: #000000; font-weight: bold; margin: 2em 0 1em; padding: .5em 1em; vertical-align: middle; clear: both;\">'''Upozorenje:''' Ova stranica je zaštićena tako da je mogu uređivati samo administratori, jer je ona uključena u {{PLURAL:\$1|sledeću stranicu koja je|sledeće stranice koje su}} zaštićene „prenosivom“ zaštitom:</div>",
 'titleprotectedwarning' => "'''Upozorenje: ova stranica je zaštićena tako da je mogu napraviti samo korisnici [[Special:ListGroupRights|s određenim pravima]].'''",
-'templatesused' => '{{PLURAL:$1|1=Šablon|Šabloni}} na ovoj stranici:',
-'templatesusedpreview' => '{{PLURAL:$1|1=Šablon|Šabloni}} u ovom pregledu:',
-'templatesusedsection' => '{{PLURAL:$1|1=Šablon|Šabloni}} u ovom odeljku:',
+'templatesused' => '{{PLURAL:$1|Šablon|Šabloni}} na ovoj stranici:',
+'templatesusedpreview' => '{{PLURAL:$1|Šablon|Šabloni}} u ovom pregledu:',
+'templatesusedsection' => '{{PLURAL:$1|Šablon|Šabloni}} u ovom odeljku:',
 'template-protected' => '(zaštićen)',
 'template-semiprotected' => '(poluzaštićen)',
 'hiddencategories' => 'Ova stranica je član {{PLURAL:$1|jedne skrivene kategorije|$1 skrivene kategorije|$1 skrivenih kategorija}}:',
@@ -1088,8 +1087,8 @@ Možete se vratiti i urediti postojeću stranicu, ili se [[Special:UserLogin|pri
 'sectioneditnotsupported-title' => 'Uređivanje odeljka nije podržano',
 'sectioneditnotsupported-text' => 'Uređivanje odeljka nije podržano na ovoj stranici.',
 'permissionserrors' => 'Greška u dozvoli',
-'permissionserrorstext' => 'Nemate ovlašćenje za tu radnju iz {{PLURAL:$1|1=sledećeg|sledećih}} razloga:',
-'permissionserrorstext-withaction' => 'Nemate dozvolu za $2 iz {{PLURAL:$1|1=sledećeg|sledećih}} razloga:',
+'permissionserrorstext' => 'Nemate ovlašćenje za tu radnju iz {{PLURAL:$1|sledećeg|sledećih}} razloga:',
+'permissionserrorstext-withaction' => 'Nemate dozvolu za $2 iz {{PLURAL:$1|sledećeg|sledećih}} razloga:',
 'recreate-moveddeleted-warn' => "'''Upozorenje: ponovo pravite stranicu koja je prethodno obrisana.'''
 
 Razmotrite da li je prikladno da nastavite s uređivanjem ove stranice.
@@ -1225,8 +1224,8 @@ Ipak možete da vidite ovu razliku; više detalja možete naći u [{{fullurl:{{#
 'revdelete-no-file' => 'Tražena datoteka ne postoji.',
 'revdelete-show-file-confirm' => 'Želite li da vidite obrisanu izmenu datoteke „<nowiki>$1</nowiki>“ od $2; $3?',
 'revdelete-show-file-submit' => 'Da',
-'revdelete-selected' => "'''{{PLURAL:$2|1=Izabrana izmena|Izabrane izmene}} stranice '''[[:$1]]''''''",
-'logdelete-selected' => "'''{{PLURAL:$1|1=Izabrana stavka u istoriji|Izabrane stavke u istoriji}}:'''",
+'revdelete-selected' => "'''{{PLURAL:$2|Izabrana izmena|Izabrane izmene}} stranice [[:$1]]'''",
+'logdelete-selected' => "'''{{PLURAL:$1|Izabrana stavka u istoriji|Izabrane stavke u istoriji}}:'''",
 'revdelete-text' => "'''Obrisane izmene će i dalje biti prikazane u istoriji stranica i zapisima, ali delovi njihovog sadržaja neće biti dostupni javnosti.'''
 Drugi administratori na ovom vikiju će i dalje imati pristup sakrivenom sadržaju, a oni će taj sadržaj moći da vrate putem ovog sučelja, osim ako nisu postavljena dodatna ograničenja.",
 'revdelete-confirm' => 'Potvrdite da nameravate ovo uraditi, da razumete posledice i da to činite u skladu s [[{{MediaWiki:Policy-url}}|pravilima]].',
@@ -1238,7 +1237,7 @@ Drugi administratori na ovom vikiju će i dalje imati pristup sakrivenom sadrža
 'revdelete-hide-text' => 'sakrij tekst izmene',
 'revdelete-hide-image' => 'Sakrij sadržaj datoteke',
 'revdelete-hide-name' => 'Sakrij radnju i odredište',
-'revdelete-hide-comment' => 'sakrij opis izmene',
+'revdelete-hide-comment' => 'Opis izmene',
 'revdelete-hide-user' => 'sakrij ime uređivača',
 'revdelete-hide-restricted' => 'Sakrij podatke od administratora i drugih korisnika',
 'revdelete-radio-same' => '(ne menjaj)',
@@ -1247,7 +1246,7 @@ Drugi administratori na ovom vikiju će i dalje imati pristup sakrivenom sadrža
 'revdelete-suppress' => 'Sakrij podatke od administratora i drugih korisnika',
 'revdelete-unsuppress' => 'Ukloni ograničenja na vraćenim izmenama',
 'revdelete-log' => 'Razlog:',
-'revdelete-submit' => 'Primeni na {{PLURAL:$1|1=izabranu izmenu|izabrane izmene}}',
+'revdelete-submit' => 'Primeni na {{PLURAL:$1|izabranu izmenu|izabrane izmene}}',
 'revdelete-success' => "'''Vidljivost izmene je ažurirana.'''",
 'revdelete-failure' => "'''Ne mogu da ažuriram vidljivost izmene:'''
 $1",
@@ -1452,7 +1451,7 @@ Ova radnja se ne može vratiti.',
 'youremail' => 'E-adresa:',
 'username' => '{{GENDER:$1|Korisničko ime}}:',
 'uid' => '{{GENDER:$1|Korisnički}} ID:',
-'prefs-memberingroups' => '{{GENDER:$2|Korisnik|Korisnica}} je član {{PLURAL:$1|1=grupe|grupa}}:',
+'prefs-memberingroups' => '{{GENDER:$2|Korisnik|Korisnica}} je član {{PLURAL:$1|grupe|grupa}}:',
 'prefs-memberingroups-type' => '$1',
 'prefs-registration' => 'Vreme upisa:',
 'prefs-registration-date-time' => '$1',
@@ -1744,12 +1743,12 @@ Promenite naziv datoteke i ponovo je pošaljite.',
 'filename-toolong' => 'Nazivi datoteka mogu imati najviše 240 bajtova.',
 'badfilename' => 'Naziv datoteke je promenjen u „$1“.',
 'filetype-mime-mismatch' => 'Ekstenzija „.$1“ ne odgovara prepoznatoj vrsti MIME datoteke ($2).',
-'filetype-badmime' => 'Datoteke MIME vrste „$1“ nije dozvoljeno slati.',
+'filetype-badmime' => 'Datoteke MIME tipa „$1“ nije dozvoljeno slati.',
 'filetype-bad-ie-mime' => 'Ova datoteka se ne može poslati zato što bi je Internet eksplorer uočio kao „$1“, a to je zabranjena i opasna vrsta datoteke.',
 'filetype-unwanted-type' => '„.$1“ je nepoželjna vrsta datoteke.
-{{PLURAL:$3|1=Poželjna vrsta datoteke je|Poželjne vrste datoteka su}} $2.',
-'filetype-banned-type' => '\'\'\'".$1"\'\'\' {{PLURAL:$4|1=je zabranjena vrsta datoteke|su zabranjene vrste datoteka}}.
-{{PLURAL:$3|1=Dozvoljena vrsta datoteke je|Dozvoljene vrste datoteka su}} $2.',
+{{PLURAL:$3|Poželjna vrsta datoteke je|Poželjne vrste datoteka su}} $2.',
+'filetype-banned-type' => "'''„.$1“''' {{PLURAL:$4|je zabranjena vrsta datoteke|su zabranjene vrste datoteka}}.
+{{PLURAL:$3|Dozvoljena vrsta datoteke je|Dozvoljene vrste datoteka su}} $2.",
 'filetype-missing' => 'Ova datoteka nema ekstenziju.',
 'empty-file' => 'Poslata datoteka je prazna.',
 'file-too-large' => 'Poslata datoteka je prevelika.',
@@ -1791,7 +1790,7 @@ Ako i dalje želite da pošaljete datoteku, vratite se i izaberite drugi naziv.
 'fileexists-shared-forbidden' => 'Datoteka s ovim nazivom već postoji u zajedničkom skladištu.
 Vratite se i pošaljite datoteku s drugim nazivom.
 [[File:$1|thumb|center|$1]]',
-'file-exists-duplicate' => 'Ovo je duplikat {{PLURAL:$1|1=sledeće datoteke|sledećih datoteka}}:',
+'file-exists-duplicate' => 'Ovo je duplikat {{PLURAL:$1|sledeće datoteke|sledećih datoteka}}:',
 'file-deleted-duplicate' => 'Datoteka istovetna ovoj ([[:$1]]) je prethodno obrisana.
 Pogledajte istoriju brisanja pre ponovnog slanja.',
 'uploadwarning' => 'Upozorenje pri otpremanju',
@@ -2076,7 +2075,7 @@ Pre brisanja proverite da li druge stranice vode do tih šablona.',
 
 # Random page
 'randompage' => 'Slučajna stranica',
-'randompage-nopages' => 'Nema stranica u {{PLURAL:$2|1=sledećem imenskom prostoru|sledećim imenskim prostorima}}: $1.',
+'randompage-nopages' => 'Nema stranica u {{PLURAL:$2|sledećem imenskom prostoru|sledećim imenskim prostorima}}: $1.',
 
 # Random redirect
 'randomredirect' => 'Slučajno preusmerenje',
@@ -2191,7 +2190,7 @@ Druge veb stranice mogu koristiti sliku preko direktne adrese, tako da i pored t
 'nopagetitle' => 'Ne postoji takva stranica',
 'nopagetext' => 'Tražena stranica ne postoji.',
 'pager-newer-n' => '{{PLURAL:$1|noviji 1|novija $1|novijih $1}}',
-'pager-older-n' => '{{PLURAL:$1|1=stariji 1|starijih $1}}',
+'pager-older-n' => '{{PLURAL:$1|stariji 1|starijih $1}}',
 'suppress' => 'Nadzor',
 'querypage-disabled' => 'Ova posebna stranica je onemogućena radi poboljšanja performansi.',
 
@@ -2237,7 +2236,7 @@ Možda sadrži znakove koji se ne mogu koristiti u naslovima.',
 
 # Special:Categories
 'categories' => 'Kategorije',
-'categoriespagetext' => '{{PLURAL:$1|1=Sledeća kategorija sadrži|Sledeće kategorije sadrže}} stranice ili datoteke.
+'categoriespagetext' => '{{PLURAL:$1|Sledeća kategorija sadrži|Sledeće kategorije sadrže}} stranice ili datoteke.
 [[Special:UnusedCategories|Nekorišćene kategorije]] nisu prikazane ovde.
 Pogledajte i [[Special:WantedCategories|tražene kategorije]].',
 'categoriesfrom' => 'Prikaži kategorije počev od:',
@@ -2256,7 +2255,7 @@ Pogledajte i [[Special:WantedCategories|tražene kategorije]].',
 'linksearch-ok' => 'Pretraži',
 'linksearch-text' => 'Mogu se koristiti džokeri poput „*.wikipedia.org“.
 Potreban je najviši domen, kao „*.org“.<br />
-{{PLURAL:$2|1=Podržan protokol|Podržani protokoli}}: <code>$1</code> (zadaje http:// ako ne navedete protokol).',
+{{PLURAL:$2|Podržan protokol|Podržani protokoli}}: <code>$1</code> (zadaje http:// ako ne navedete protokol).',
 'linksearch-line' => '$1 veza u $2',
 'linksearch-error' => 'Džokeri se mogu pojaviti samo na početku adrese.',
 
@@ -2288,12 +2287,12 @@ Pogledajte [[{{MediaWiki:Listgrouprights-helppage}}|više detalja]] o pojedinač
 'listgrouprights-members' => '(spisak članova)',
 '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' => 'dodaje {{PLURAL:$2|1=sledeću grupu|sledeće grupe}}: $1',
-'listgrouprights-removegroup' => 'briše {{PLURAL:$2|1=sledeću grupu|sledeće grupe}}: $1',
+'listgrouprights-addgroup' => 'dodaje {{PLURAL:$2|sledeću grupu|sledeće grupe}}: $1',
+'listgrouprights-removegroup' => 'briše {{PLURAL:$2|sledeću grupu|sledeće grupe}}: $1',
 'listgrouprights-addgroup-all' => 'dodavanje svih grupa',
 'listgrouprights-removegroup-all' => 'brisanje svih grupa',
-'listgrouprights-addgroup-self' => 'dodavanje {{PLURAL:$2|1=grupe|grupa}} na svoj nalog: $1',
-'listgrouprights-removegroup-self' => 'uklanjanje {{PLURAL:$2|1=grupe|grupa}} sa svog naloga: $1',
+'listgrouprights-addgroup-self' => 'dodavanje {{PLURAL:$2|grupe|grupa}} na svoj nalog: $1',
+'listgrouprights-removegroup-self' => 'uklanjanje {{PLURAL:$2|grupe|grupa}} sa svog naloga: $1',
 'listgrouprights-addgroup-self-all' => 'Dodaj sve grupe na sopstveni nalog',
 'listgrouprights-removegroup-self-all' => 'Ukloni sve grupe sa sopstvenog naloga',
 
@@ -2455,7 +2454,7 @@ Poslednji autor je ujedno i jedini.',
 'alreadyrolled' => 'Vraćanje poslednje izmene stranice [[:$1]] od strane {{GENDER:$2|korisnika|korisnice|korisnika}} [[User:$2|$2]] ([[User talk:$2|razgovor]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]); neko drugi je već izmenio ili vratio stranicu.
 
 Poslednju izmenu je {{GENDER:$3|napravio|napravila|napravio}} [[User:$3|$3]] ([[User talk:$3|razgovor]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).',
-'editcomment' => "Opis izmene: \"''\$1''\".",
+'editcomment' => "Opis izmene: „''$1''“.",
 'revertpage' => 'Vraćene izmene [[Special:Contributions/$2|$2]] ([[User talk:$2|razgovor]]) na poslednju izmenu korisnika [[User:$1|$1]]',
 'revertpage-nouser' => 'Vraćene su izmene skrivenog korisnika na poslednju izmenu {{GENDER:$1|korisnika|korisnice}} [[User:$1|$1]]',
 'rollback-success' => 'Vraćene su izmene {{GENDER:$1|korisnika|korisnice}} $1
@@ -2471,9 +2470,9 @@ Vratite se na prethodnu stranicu, ponovo je učitajte i pokušajte ponovo.',
 'protectlogpage' => 'Dnevnik zaključavanja',
 'protectlogtext' => 'Ispod je spisak izmena u vidu zaštite stranica.
 Pogledajte [[Special:ProtectedPages|spisak zaštićenih stranica]] za više detalja.',
-'protectedarticle' => '{{GENDER:|je zaštitio|je zaštitila|je zaštitio}} „[[$1]]“',
+'protectedarticle' => '{{GENDER:|je zaštitio|je zaštitila}} „[[$1]]“',
 'modifiedarticleprotection' => '{{GENDER:|je promenio|je promenila|je promenio}} stepen zaštite za „[[$1]]“',
-'unprotectedarticle' => 'uklonjena zaštita sa stranice „[[$1]]“',
+'unprotectedarticle' => 'je skinuo zaštitu sa stranice „[[$1]]“',
 'movedarticleprotection' => '{{GENDER:|je premestio|je premestila|je premestio}} postavke zaštite sa „[[$2]]“ na „[[$1]]“',
 'protect-title' => 'Stepen zaštite za „$1“',
 'protect-title-notallowed' => 'Pregled stepena zaštite za „$1“',
@@ -2494,7 +2493,7 @@ Ovo su trenutne postavke stranice '''$1''':",
 Ovo su postavke stranice '''$1''':",
 'protect-locked-access' => "Nemate ovlašćenja za menjanje stepena zaštite stranice.
 Ovo su trenutne postavke stranice '''$1''':",
-'protect-cascadeon' => 'Ova stranica je trenutno zaštićena jer se nalazi na {{PLURAL:$1|1=stranici koja ima|stranicama koje imaju}} prenosivu zaštitu.
+'protect-cascadeon' => 'Ova stranica je trenutno zaštićena jer se nalazi na {{PLURAL:$1|stranici koja ima|stranicama koje imaju}} prenosivu zaštitu.
 Možete da promenite stepen zaštite, ali to neće uticati na prenosivu zaštitu.',
 'protect-default' => 'Dozvoli svim korisnicima',
 'protect-fallback' => 'Dozvoljeno samo korisnicima sa dozvolom „$1“',
@@ -2634,8 +2633,8 @@ Izveštaj o blokiranim korisnicima se nalazi ispod:',
 'isredirect' => 'preusmerenje',
 'istemplate' => 'uključivanje',
 'isimage' => 'veza ka datoteci',
-'whatlinkshere-prev' => '{{PLURAL:$1|1=prethodni|prethodnih $1}}',
-'whatlinkshere-next' => '{{PLURAL:$1|1=sledeći|sledećih $1}}',
+'whatlinkshere-prev' => '{{PLURAL:$1|prethodni|prethodnih $1}}',
+'whatlinkshere-next' => '{{PLURAL:$1|sledeći|sledećih $1}}',
 'whatlinkshere-links' => '← veze',
 'whatlinkshere-hideredirs' => '$1 preusmerenja',
 'whatlinkshere-hidetrans' => '$1 uključivanja',
@@ -2707,7 +2706,7 @@ Blokiranja možete da pogledate [[Special:BlockList|ovde]].',
 'blocklist-reason' => 'Razlog',
 'ipblocklist-submit' => 'Pretraži',
 'ipblocklist-localblock' => 'Lokalno blokiranje',
-'ipblocklist-otherblocks' => '{{PLURAL:$1|1=Drugo blokiranje|Druga blokiranja}}',
+'ipblocklist-otherblocks' => '{{PLURAL:$1|Drugo blokiranje|Druga blokiranja}}',
 'infiniteblock' => 'trajno',
 'expiringblock' => 'ističe dana $1 u $2',
 'anononlyblock' => 'samo anonimni',
@@ -2722,14 +2721,14 @@ Blokiranja možete da pogledate [[Special:BlockList|ovde]].',
 'change-blocklink' => 'promeni blokiranje',
 'contribslink' => 'doprinosi',
 'emaillink' => 'pošalji e-poruku',
-'autoblocker' => 'Automatski ste blokirani jer delite IP adresu s {{GENDER:$1|korisnikom|korisnicom}} [[User:$1|$1]].
+'autoblocker' => 'Automatski ste blokirani jer delite IP adresu s korisnikom/com [[User:$1|$1]].
 Razlog blokiranja: „$2“',
 'blocklogpage' => 'Dnevnik blokiranja',
 'blocklog-showlog' => '{{GENDER:$1|Ovaj korisnik je ranije blokiran|Ova korisnica je ranije blokirana|Ovaj korisnik je ranije blokiran}}.
 Istorija blokiranja se nalazi ispod:',
 'blocklog-showsuppresslog' => '{{GENDER:|Ovaj korisnik je ranije blokiran i sakriven|Ova korisnica je ranije blokirana i sakrivena|Ovaj korisnik je ranije blokiran i sakriven}}.
 Istorija sakrivanja se nalazi ispod:',
-'blocklogentry' => '{{GENDER:|je blokirao|je blokirala}} [[$1]] s rokom isticanja od $2 $3',
+'blocklogentry' => 'je blokirao [[$1]] s rokom isticanja od $2 $3',
 'reblock-logentry' => '{{GENDER:|je promenio|je promenila|je promenio}} podešavanja za blokiranje {{GENDER:$1|korisnika|korisnice|korisnika}} [[$1]] s rokom isteka od $2 ($3)',
 'blocklogtext' => 'Ovo je dnevnik blokiranja i deblokiranja korisnika.
 Automatski blokirane IP adrese nisu navedene.
@@ -2748,7 +2747,7 @@ Tekuće zabrane i blokiranja možete naći [[Special:BlockList|ovde]].',
 'ipb_hide_invalid' => 'Ne mogu da potisnem ovaj nalog. Možda ima previše izmena.',
 'ipb_already_blocked' => '„$1“ je već blokiran',
 'ipb-needreblock' => '$1 je već blokiran. Želite li da promenite podešavanja?',
-'ipb-otherblocks-header' => '{{PLURAL:$1|1=Druga blokada|Druge blokade}}',
+'ipb-otherblocks-header' => '{{PLURAL:$1|Druga blokada|Druge blokade}}',
 'unblock-hideuser' => 'Ne možete deblokirati ovog korisnika jer je njegovo korisničko ime sakriveno.',
 'ipb_cant_unblock' => 'Greška: blokada $1 ne postoji. Možda je korisnik deblokiran.',
 'ipb_blocked_as_range' => 'Greška: IP adresa $1 nije direktno blokirana i ne može da se deblokira.
@@ -2846,7 +2845,7 @@ Izaberite drugo ime.',
 'movepage-max-pages' => 'Najviše $1 {{PLURAL:$1|stranica je premeštena|stranice su premeštene|stranica je premešteno}}, i više ne može da bude automatski premešteno.',
 'movelogpage' => 'Dnevnik premeštanja',
 'movelogpagetext' => 'Ispod se nalazi spisak premeštanja stranica.',
-'movesubpage' => '{{PLURAL:$1|1=Podstranica|Podstranice}}',
+'movesubpage' => '{{PLURAL:$1|Podstranica|Podstranice}}',
 'movesubpagetext' => 'Ova stranica ima $1 {{PLURAL:$1|podstranicu prikazanu|podstranice prikazane|podstranica prikazanih}} ispod.',
 'movenosubpage' => 'Ova stranica nema podstrana.',
 'movereason' => 'Razlog:',
@@ -2982,7 +2981,7 @@ Pokušajte ponovo.',
 'import-error-interwiki' => 'Ne mogu da uvezem stranicu „$1“ jer je njen naziv rezervisan za spoljno povezivanje (međuviki).',
 'import-error-special' => 'Ne mogu da uvezem stranicu „$1“ jer ona pripada posebnom imenskom prostoru koje ne prihvata stranice.',
 'import-error-invalid' => 'Ne mogu da uvezem stranicu „$1“ jer je njen naziv neispravan.',
-'import-options-wrong' => '{{PLURAL:$2|1=Pogrešna opcija|Pogrešne opcije}}: <nowiki>$1</nowiki>',
+'import-options-wrong' => '{{PLURAL:$2|Pogrešna opcija|Pogrešne opcije}}: <nowiki>$1</nowiki>',
 'import-rootpage-invalid' => 'Navedena osnovna stranica ima neispravan naslov.',
 'import-rootpage-nosubpage' => 'Imenski prostor „$1“ osnovne stranice ne dozvoljava podstranice.',
 
@@ -3101,14 +3100,14 @@ Pokušajte ponovo.',
 'notacceptable' => 'Server ne može da napravi podatke u formatu pogodnom za vaš klijent.',
 
 # Attribution
-'anonymous' => 'Anonimni {{PLURAL:$1|1=korisnik|korisnici}} na projektu {{SITENAME}}',
+'anonymous' => 'Anonimni {{PLURAL:$1|korisnik|korisnici}} na projektu {{SITENAME}}',
 'siteuser' => '{{SITENAME}} korisnik $1',
 'anonuser' => '{{SITENAME}} anoniman korisnik $1',
 'lastmodifiedatby' => 'Ovu stranicu je poslednji put {{GENDER:$4|izmenio|izmenila|izmenio}} $3, $1 u $2.',
-'othercontribs' => 'Zasnovano na radu korisnikâ $1.',
+'othercontribs' => 'Zasnovano na radu korisnika $1.',
 'others' => 'drugi',
-'siteusers' => '{{PLURAL:$2|1=korisnik|korisnici}} na projektu {{SITENAME}} $1',
-'anonusers' => '{{PLURAL:$2|1=anoniman korisnik|anonimni korisnici}} na projektu {{SITENAME}} $1',
+'siteusers' => '{{PLURAL:$2|korisnik|korisnici}} na projektu {{SITENAME}} $1',
+'anonusers' => '{{PLURAL:$2|anoniman korisnik|anonimni korisnici}} na projektu {{SITENAME}} $1',
 'creditspage' => 'Autori stranice',
 'nocredits' => 'Ne postoje podaci o autoru ove stranice.',
 
@@ -3116,7 +3115,7 @@ Pokušajte ponovo.',
 'spamprotectiontitle' => 'Filter za zaštitu od nepoželjnih poruka',
 'spamprotectiontext' => 'Stranica koju želite da sačuvate je blokirana od filtera protiv nepoželjnih poruka.
 Ovo je verovatno izazvano vezom do spoljašnjeg sajta koji se nalazi na crnoj listi.',
-'spamprotectionmatch' => 'Sledeći tekst je izazvao naš filter za nepoželjne poruke: $1',
+'spamprotectionmatch' => 'Sledeći tekst je izazvao naš filter za neželjene poruke: $1',
 'spambot_username' => 'Čišćenje nepoželjnih poruka u Medijavikiji',
 'spam_reverting' => 'Vraćam na poslednju izmenu koja ne sadrži veze do $1',
 'spam_blanking' => 'Sve izmene sadrže veze do $1. Čistim',
@@ -3140,7 +3139,7 @@ Ovo je verovatno izazvano vezom do spoljašnjeg sajta koji se nalazi na crnoj li
 'pageinfo-robot-noindex' => 'Nije dozvoljeno',
 'pageinfo-views' => 'Broj pregleda',
 'pageinfo-watchers' => 'Broj nadgledača stranica',
-'pageinfo-few-watchers' => 'Manje od $1 {{PLURAL:$1|1=pratioca|pratilaca}}',
+'pageinfo-few-watchers' => 'Manje od $1 {{PLURAL:$1|pratioca|pratilaca}}',
 'pageinfo-redirects-name' => 'Broj preusmerenja na ovu stranicu',
 'pageinfo-subpages-name' => 'Podstranice ove stranice',
 'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|preusmerenje|preusmerenja|preusmerenja}}; $3 {{PLURAL:$3|nepreusmerenje|nepreusmerenja|nepreusmerenja}})',
@@ -3152,10 +3151,10 @@ Ovo je verovatno izazvano vezom do spoljašnjeg sajta koji se nalazi na crnoj li
 'pageinfo-authors' => 'Broj zasebnih autora',
 'pageinfo-recent-edits' => 'Broj skorašnjih izmena (u poslednjih $1)',
 'pageinfo-recent-authors' => 'Broj skorašnjih zasebnih autora',
-'pageinfo-magic-words' => '{{PLURAL:$1|1=Magična reč|Magične reči}} ($1)',
-'pageinfo-hidden-categories' => '{{PLURAL:$1|1=Sakrivena kategorija|Sakrivene kategorije}} ($1)',
-'pageinfo-templates' => '{{PLURAL:$1|1=Uključeni šablon|Uključeni šabloni}} ($1)',
-'pageinfo-transclusions' => '{{PLURAL:$1|1=Stranica|Stranice}} uključene u ($1)',
+'pageinfo-magic-words' => '{{PLURAL:$1|Magična reč|Magične reči}} ($1)',
+'pageinfo-hidden-categories' => '{{PLURAL:$1|Sakrivena kategorija|Sakrivene kategorije}} ($1)',
+'pageinfo-templates' => '{{PLURAL:$1|Uključeni šablon|Uključeni šabloni}} ($1)',
+'pageinfo-transclusions' => '{{PLURAL:$1|Stranica|Stranice}} uključene u ($1)',
 'pageinfo-toolboxlink' => 'Podaci o stranici',
 'pageinfo-redirectsto' => 'Preusmerava na',
 'pageinfo-redirectsto-info' => 'podaci',
@@ -3224,7 +3223,7 @@ Ako ga pokrenete, vaš računar može biti ugrožen.",
 'svg-long-error' => 'Neispravna SVG datoteka: $1',
 'show-big-image' => 'Puna veličina',
 'show-big-image-preview' => 'Veličina ovog prikaza: $1.',
-'show-big-image-other' => '{{PLURAL:$2|1=Druga rezolucija|Druge rezolucije}}: $1.',
+'show-big-image-other' => '{{PLURAL:$2|Druga rezolucija|Druge rezolucije}}: $1.',
 'show-big-image-size' => '$1 × $2 piksela',
 'file-info-gif-looped' => 'petlja',
 'file-info-gif-frames' => '$1 {{PLURAL:$1|kadar|kadra|kadrova}}',
@@ -3256,9 +3255,13 @@ Ako ga pokrenete, vaš računar može biti ugrožen.",
 'minutes' => '{{PLURAL:$1|$1 minut|$1 minuta|$1 minuta}}',
 'hours' => '{{PLURAL:$1|$1 sat|$1 sata|$1 sati}}',
 'days' => '{{PLURAL:$1|$1 dan|$1 dana|$1 dana}}',
+'years' => '{{PLURAL:$1|$1 godina|$1 godine}}',
 'ago' => 'pre $1',
 'just-now' => 'upravo sad',
 
+# Human-readable timestamps
+'minutes-ago' => 'Pre $1 {{PLURAL:$1|minut|minuta}}',
+
 # Bad image list
 'bad_image_list' => 'Format je sledeći:
 
@@ -3915,7 +3918,7 @@ Probajte običan prikaz.',
 
 # Friendlier slave lag warnings
 'lag-warn-normal' => 'Izmene novije od $1 {{PLURAL:$1|sekunde|sekunde|sekundi}} neće biti prikazane.',
-'lag-warn-high' => 'Zbog preopterećenja baze podataka, izmene novije od $1 {{PLURAL:$1|sekunde|sekunde|sekundi}} neće biti prikazane.',
+'lag-warn-high' => 'Zbog preopterećenja baze podataka, izmene novije od $1 {{PLURAL:$1|sekunde|sekundi}} neće biti prikazane.',
 
 # Watchlist editor
 'watchlistedit-numitems' => 'Vaš spisak nadgledanja sadrži {{PLURAL:$1|jedan naslov|$1 naslova|$1 naslova}}, bez stranica za razgovor.',
@@ -3937,7 +3940,7 @@ Možete da [[Special:EditWatchlist|koristite i običan uređivač]].',
 'watchlistedit-raw-submit' => 'Ažuriraj spisak',
 'watchlistedit-raw-done' => 'Vaš spisak nadgledanja je ažuriran.',
 'watchlistedit-raw-added' => '{{PLURAL:$1|Dodat je jedan naslov|Dodata su $1 naslova|Dodato je $1 naslova}}:',
-'watchlistedit-raw-removed' => '{{PLURAL:$1|Uklonjen je jedan naslov|Uklonjena su $1 naslova|Uklonjeno je $1 naslova}}:',
+'watchlistedit-raw-removed' => '{{PLURAL:$1|1 naslov je uklonjen|Uklonjena su $1 naslova|Uklonjeno je $1 naslova}}:',
 
 # Watchlist editing tools
 'watchlisttools-view' => 'prikaži srodne izmene',
@@ -4097,7 +4100,7 @@ Trebalo bi da ste primili [{{SERVER}}{{SCRIPTPATH}}/COPYING primerak GNU-ove op
 'tags' => 'Važeće oznake izmena',
 'tag-filter' => 'Filter za [[Special:Tags|oznake]]:',
 'tag-filter-submit' => 'Filtriraj',
-'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|1=Oznaka|Oznake}}]]: $2)',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Oznaka|Oznake}}]]: $2)',
 'tags-title' => 'Oznake',
 'tags-intro' => 'Na ovoj stranici je naveden spisak oznaka s kojima program može da označi izmene i njegovo značenje.',
 'tags-tag' => 'Naziv oznake',
@@ -4152,13 +4155,13 @@ Trebalo bi da ste primili [{{SERVER}}{{SCRIPTPATH}}/COPYING primerak GNU-ove op
 # New logging system
 'logentry-delete-delete' => '$1 je {{GENDER:$2|obrisao|obrisala}} stranicu $3',
 'logentry-delete-restore' => '$1 je {{GENDER:$2|vratio|vratila}} stranicu $3',
-'logentry-delete-event' => '$1 je {{GENDER:$2|promenio|promenila}} vidljivost {{PLURAL:$5|1=događaja|$5 daogađaja}} u dnevniku na $3: $4',
-'logentry-delete-revision' => '$1 je {{GENDER:$2|promenio|promenila}} vidljivost {{PLURAL:$5|1=izmene|$5 izmena}} na stranici $3: $4',
+'logentry-delete-event' => '$1 je {{GENDER:$2|promenio|promenila}} vidljivost {{PLURAL:$5|događaja|$5 daogađaja}} u dnevniku na $3: $4',
+'logentry-delete-revision' => '$1 je {{GENDER:$2|promenio|promenila}} vidljivost {{PLURAL:$5|izmene|$5 izmena}} na stranici $3: $4',
 'logentry-delete-event-legacy' => '$1 je {{GENDER:$2|promenio|promenila}} vidljivost događaja u dnevniku na $3',
 'logentry-delete-revision-legacy' => '$1 je {{GENDER:$2|promenio|promenila}} vidljivost izmena na stranici $3',
 'logentry-suppress-delete' => '$1 je {{GENDER:$2|potisnuo|potisnula}} stranicu $3',
-'logentry-suppress-event' => '$1 je tajno {{GENDER:$2|promenio|promenila}} vidljivost {{PLURAL:$5|1=događaja|$5 događaja}} u dnevniku na $3: $4',
-'logentry-suppress-revision' => '$1 je tajno {{GENDER:$2|promenio|promenila}} vidljivost {{PLURAL:$5|1=izmene|$5 izmena}} na stranici $3: $4',
+'logentry-suppress-event' => '$1 je tajno {{GENDER:$2|promenio|promenila}} vidljivost {{PLURAL:$5|događaja|$5 događaja}} u dnevniku na $3: $4',
+'logentry-suppress-revision' => '$1 je tajno {{GENDER:$2|promenio|promenila}} vidljivost {{PLURAL:$5|izmene|$5 izmena}} na stranici $3: $4',
 'logentry-suppress-event-legacy' => '$1 је tajno {{GENDER:$2|promenio|promenila}} vidljivost događaj u dnevniku na $3',
 'logentry-suppress-revision-legacy' => '$1 je tajno {{GENDER:$2|promenio|promenila}} vidljivost izmena na stranici $3',
 'revdelete-content-hid' => 'sadržaj je sakriven',
@@ -4209,10 +4212,10 @@ U suprotnom, poslužite se jednostavnim obrascem ispod. Vaš komentar će stajat
 'api-error-badaccess-groups' => 'Nije vam dozvoljeno da otpremate datoteke na ovaj viki.',
 'api-error-badtoken' => 'Unutrašnja greška: neispravan žeton.',
 'api-error-copyuploaddisabled' => 'Otpremanje putem adrese je onemogućeno na ovom serveru.',
-'api-error-duplicate' => 'Već {{PLURAL:$1|1=postoji [$2 druga datoteka]|postoje [$2 druge datoteke]}} s istim sadržajem.',
-'api-error-duplicate-archive' => '{{PLURAL:$1|1=Postojala je [$2 druga datoteka]|Postojale su [$2 druge datoteke]}} s istim sadržajem, ali {{PLURAL:$1|1=je obrisana|su obrisane}}.',
-'api-error-duplicate-archive-popup-title' => '{{PLURAL:$1|1=Duplirana datoteka koja je već obrisana|Duplirane datoteke koje su već obrisane}}',
-'api-error-duplicate-popup-title' => '{{PLURAL:$1|1=Duplirana datoteka|Duplirane datoteke}}',
+'api-error-duplicate' => 'Već {{PLURAL:$1|postoji [$2 druga datoteka]|postoje [$2 druge datoteke]}} s istim sadržajem.',
+'api-error-duplicate-archive' => '{{PLURAL:$1|Postojala je [$2 druga datoteka]|Postojale su [$2 druge datoteke]}} s istim sadržajem, ali {{PLURAL:$1|je obrisana|su obrisane}}.',
+'api-error-duplicate-archive-popup-title' => '{{PLURAL:$1|Duplirana datoteka koja je već obrisana|Duplirane datoteke koje su već obrisane}}',
+'api-error-duplicate-popup-title' => '{{PLURAL:$1|Duplirana datoteka|Duplirane datoteke}}',
 'api-error-empty-file' => 'Poslata datoteka je prazna.',
 'api-error-emptypage' => 'Stvaranje novih praznih stranica nije dozvoljeno.',
 'api-error-fetchfileerror' => 'Unutrašnja greška: došlo je do greške pri dobavljanju datoteke.',
@@ -4221,7 +4224,7 @@ U suprotnom, poslužite se jednostavnim obrascem ispod. Vaš komentar će stajat
 'api-error-file-too-large' => 'Poslata datoteka je prevelika.',
 'api-error-filename-tooshort' => 'Naziv datoteke je prekratak.',
 'api-error-filetype-banned' => 'Ova vrsta datoteke je zabranjena.',
-'api-error-filetype-banned-type' => '$1 {{PLURAL:$4|1=je zabranjena vrsta datoteke|su zabranjene vrste datoteka}}. {{PLURAL:$3|1=Dozvoljena je|Dozvoljene su}} $2.',
+'api-error-filetype-banned-type' => '$1 {{PLURAL:$4|je zabranjena vrsta datoteke|su zabranjene vrste datoteka}}. {{PLURAL:$3|Dozvoljena je|Dozvoljene su}} $2.',
 'api-error-filetype-missing' => 'Datoteci nedostaje nastavak.',
 'api-error-hookaborted' => 'Izmena je odbačena od kuke za proširenja.',
 'api-error-http' => 'Unutrašnja greška: ne mogu da se povežem sa serverom.',
index 9d664c9..d8682b7 100644 (file)
@@ -55,7 +55,6 @@ $messages = array(
 'tog-numberheadings' => 'Uurskrifte automatisk nuumerierje',
 'tog-showtoolbar' => 'Beoarbaidengs-Reewen anwiese',
 'tog-editondblclick' => 'Sieden mäd Dubbeldklik beoarbaidje (JavaScript)',
-'tog-editsection' => 'Links toun Beoarbaidjen fon eenpelde Ousatse anwiese',
 'tog-editsectiononrightclick' => 'Eenpelde Ousatse mäd Gjuchtsklik beoarbaidje (JavaScript)',
 'tog-showtoc' => 'Anwiesen fon n Inhooldsferteeknis bie Artikkele mäd moor as 3 Uurskrifte',
 'tog-rememberpassword' => 'Mäd dissen Browser duurhaft ounmälded blieuwe (Maximoal foar $1 {{PLURAL:$1|Dai|Deege}})',
index 319d098..9f70a12 100644 (file)
@@ -336,7 +336,6 @@ $messages = array(
 'tog-numberheadings' => 'Automatisk numrerade rubriker',
 'tog-showtoolbar' => 'Visa redigeringsverktygsraden',
 'tog-editondblclick' => 'Redigera sidor med dubbelklick',
-'tog-editsection' => 'Aktivera redigering av avsnitt genom [redigera]-länkar',
 'tog-editsectiononrightclick' => 'Aktivera redigering av avsnitt genom högerklick på underrubriker',
 'tog-showtoc' => 'Visa innehållsförteckning (för sidor med minst fyra rubriker)',
 'tog-rememberpassword' => 'Kom ihåg min inloggning på den här webbläsaren (i maximalt $1 {{PLURAL:$1|dygn|dygn}})',
@@ -1155,6 +1154,8 @@ Den finns redan.',
 'content-not-allowed-here' => 'innehåll av "$1" är inte tillåtet på sidan [[$2]]',
 'editwarning-warning' => 'Om du lämnar den här sidan kommer du att förlora alla ändringar du har gjort.
 Om du är inloggad kan du slå av den här varningen under "Redigering" i dina inställningar.',
+'editpage-notsupportedcontentformat-title' => 'Innehållsformat stöds inte',
+'editpage-notsupportedcontentformat-text' => 'Innehållsformatet $1 stöds inte av innehållsmodellen $2.',
 
 # Content models
 'content-model-wikitext' => 'wikitext',
@@ -1408,6 +1409,7 @@ Detaljer kan hittas i [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}
 'search-result-score' => 'Relevans: $1%',
 'search-redirect' => '(omdirigering $1)',
 'search-section' => '(avsnitt $1)',
+'search-file-match' => '(överensstämmer filens innehåll)',
 'search-suggest' => 'Menade du: $1',
 'search-interwiki-caption' => 'Systerprojekt',
 'search-interwiki-default' => 'Resultat i $1:',
@@ -1911,7 +1913,7 @@ $1',
 'upload-file-error-text' => 'Ett internt fel inträffade när en temporär fil skulle skapas på servern. Kontakta en [[Special:ListUsers/sysop|administratör]].',
 'upload-misc-error' => 'Okänt uppladdningsfel',
 'upload-misc-error-text' => 'Ett okänt fel inträffade under uppladdningen.
-Kontrollera att URL:en giltig och försök igen.
+Kontrollera att URL:en giltig och tillgänglig och försök igen.
 Om problemet kvarstår, kontakta en [[Special:ListUsers/sysop|administratör]].',
 'upload-too-many-redirects' => 'URL-en innehöll för många omdirigeringar',
 'upload-unknown-size' => 'Okänd storlek',
@@ -1920,21 +1922,21 @@ Om problemet kvarstår, kontakta en [[Special:ListUsers/sysop|administratör]].'
 
 # File backend
 'backend-fail-stream' => 'Kunde inte strömma filen $1.',
-'backend-fail-backup' => 'Kunde inte säkerhetskopiera filen $1.',
+'backend-fail-backup' => "Kunde inte säkerhetskopiera filen ''$1''.",
 'backend-fail-notexists' => 'Filen $1 finns inte.',
 'backend-fail-hashes' => 'Kunde inte att hämta filhash för jämförelse.',
-'backend-fail-notsame' => 'En icke-identisk fil redan finns på $1.',
+'backend-fail-notsame' => "En icke-identisk fil finns redan på ''$1''.",
 'backend-fail-invalidpath' => '$1 är inte en giltig sökväg för att spara.',
-'backend-fail-delete' => 'Kunde inte radera filen $1.',
+'backend-fail-delete' => "Kunde inte radera filen ''$1''.",
 'backend-fail-describe' => 'Kunde inte att ändra metadata för filen "$1".',
-'backend-fail-alreadyexists' => 'Filen $1 finns redan.',
-'backend-fail-store' => 'Kunde inte spara filen $1 vid $2.',
-'backend-fail-copy' => 'Det gick inte att kopiera filen $1 till $2.',
-'backend-fail-move' => 'Kunde inte flytta filen $1 till $2.',
+'backend-fail-alreadyexists' => "Filen ''$1'' finns redan.",
+'backend-fail-store' => "Kunde inte spara filen ''$1'' vid ''$2''.",
+'backend-fail-copy' => 'Det gick inte att kopiera filen "$1" till "$2".',
+'backend-fail-move' => 'Kunde inte flytta filen "$1" till "$2".',
 'backend-fail-opentemp' => 'Kunde inte öppna temporär fil.',
 'backend-fail-writetemp' => 'Kunde inte skriva till temporär fil.',
 'backend-fail-closetemp' => 'Kunde inte stänga temporär fil.',
-'backend-fail-read' => 'Kunde inte läsa filen $1.',
+'backend-fail-read' => "Kunde inte läsa filen ''$1''.",
 'backend-fail-create' => 'Kunde inte skapa filen $1.',
 'backend-fail-maxsize' => 'Kunde inte skapa filen $1 eftersom den är större än {{PLURAL:$2|en byte|$2 bytes}}.',
 'backend-fail-readonly' => 'Lagringssystemet "$1" är för närvarande skrivskyddad. Den angivna anledningen är: "$2"',
@@ -2003,7 +2005,7 @@ För optimal säkerhet, har img_auth.php blivit avaktiverad.',
 'http-invalid-scheme' => 'URLer med "$1"-formen stöds inte',
 'http-request-error' => 'HTTP-begäran misslyckades på grund av okänt fel.',
 'http-read-error' => 'HTTP-läsfel.',
-'http-timed-out' => 'Time out för HTTP-begäran.',
+'http-timed-out' => 'HTTP-begäran avbröts.',
 'http-curl-error' => 'Fel vid hämtning av URL: $1',
 'http-bad-status' => 'Det uppstod ett problem under HTTP-begäran: $1 $2',
 
@@ -2056,7 +2058,7 @@ För optimal säkerhet, har img_auth.php blivit avaktiverad.',
 'filehist-missing' => 'Fil saknas',
 'imagelinks' => 'Filanvändning',
 'linkstoimage' => 'Följande {{PLURAL:$1|sida|$1 sidor}} länkar till den här filen:',
-'linkstoimage-more' => 'Mer är {{PLURAL:$1|en sida|$1 sidor}} länkar till den här filen.
+'linkstoimage-more' => 'Mer änr {{PLURAL:$1|en sida|$1 sidor}} länkar till den här filen.
 Följande lista visar bara {{PLURAL:$1|den första sidan|de $1 första sidorna}} som länkar till filen.
 Det finns en [[Special:WhatLinksHere/$2|fullständig lista]].',
 'nolinkstoimage' => 'Inga sidor länkar till den här filen.',
@@ -2067,7 +2069,7 @@ Det finns en [[Special:WhatLinksHere/$2|fullständig lista]].',
 'sharedupload-desc-there' => 'Den här filen är från $1 och kan användas av andra projekt.
 Var god se [$2 filbeskrivningssidan] för mer information.',
 'sharedupload-desc-here' => 'Den här filen är från $1 och kan användas av andra projekt.
-Beskrivningen på dess [$2 filbeskrivningssida] visas nedan.',
+Beskrivningen på dess [$2 filbeskrivningssida] där visas nedan.',
 'sharedupload-desc-edit' => 'Denna fil är från $1 och kan användas av andra projekt.
 Kanske vill du redigera beskrivningen på dess [$2 filbeskrivningssida] där.',
 'sharedupload-desc-create' => 'Denna fil är från $1 och kan användas av andra projekt.
@@ -2107,7 +2109,7 @@ Kanske vill du redigera beskrivningen på dess [$2 filbeskrivningssida] där.',
 ** Upphovsrättsbrott
 ** Dubblettfil',
 'filedelete-edit-reasonlist' => 'Redigera anledningar för radering',
-'filedelete-maintenance' => 'Radering och återställning av filer tillfälligt avaktiverat under underhåll.',
+'filedelete-maintenance' => 'Radering och återställning av filer har tillfälligt avaktiverats under underhåll.',
 'filedelete-maintenance-title' => 'Kan inte radera filen',
 
 # MIME search
@@ -2135,12 +2137,12 @@ Innan mallarna raderas, kontrollera att det inte finns andra länkar till dem.',
 # Random page in category
 'randomincategory' => 'Slumpsida i kategori',
 'randomincategory-invalidcategory' => '"$1" är inte ett giltigt kategorinamn.',
-'randomincategory-nopages' => 'Det finns inga sidor i [[:Category:$1]].',
+'randomincategory-nopages' => 'Det finns inga sidor i kategorin [[:Category:$1]].',
 'randomincategory-selectcategory' => 'Få slumpsida från kategori: $1 $2.',
 'randomincategory-selectcategory-submit' => 'Gå',
 
 # Random redirect
-'randomredirect' => 'Slumpvald omdirigering',
+'randomredirect' => 'Slumpmässig omdirigering',
 'randomredirect-nopages' => 'Det finns inte några omdirigeringar i namnrymden "$1".',
 
 # Statistics
@@ -2181,7 +2183,7 @@ Varje rad innehåller länkar till den första och andra omdirigeringsidan, samt
 'double-redirect-fixer' => 'Omdirigeringsrättaren',
 
 'brokenredirects' => 'Trasiga omdirigeringar',
-'brokenredirectstext' => 'Följande omdirigerar länkar till ej existerande sidor:',
+'brokenredirectstext' => 'Följande omdirigeringar länkar till ej existerande sidor:',
 'brokenredirects-edit' => 'redigera',
 'brokenredirects-delete' => 'radera',
 
@@ -2195,7 +2197,7 @@ Varje rad innehåller länkar till den första och andra omdirigeringsidan, samt
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|byte|byte}}',
 'ncategories' => '$1 {{PLURAL:$1|kategori|kategorier}}',
-'ninterwikis' => '$1 {{PLURAL:$1|interwiki|interwikis}}',
+'ninterwikis' => '$1 {{PLURAL:$1|interwiki}}',
 'nlinks' => '$1 {{PLURAL:$1|länk|länkar}}',
 'nmembers' => '$1 {{PLURAL:$1|medlem|medlemmar}}',
 'nmemberschanged' => '$1 → $2 {{PLURAL:$2|medlem|medlemmar}}',
@@ -2210,7 +2212,7 @@ Varje rad innehåller länkar till den första och andra omdirigeringsidan, samt
 'uncategorizedcategories' => 'Ej kategoriserade kategorier',
 'uncategorizedimages' => 'Ej kategoriserade filer',
 'uncategorizedtemplates' => 'Ej kategoriserade mallar',
-'unusedcategories' => 'Tomma kategorier',
+'unusedcategories' => 'Oanvända kategorier',
 'unusedimages' => 'Oanvända filer',
 'popularpages' => 'Populära sidor',
 'wantedcategories' => 'Önskade kategorier',
@@ -2222,7 +2224,7 @@ Varje rad innehåller länkar till den första och andra omdirigeringsidan, samt
 'wantedtemplates' => 'Önskade mallar',
 'mostlinked' => 'Sidor med flest länkar till sig',
 'mostlinkedcategories' => 'Kategorier med flest länkar till sig',
-'mostlinkedtemplates' => 'Mest använda mallar',
+'mostlinkedtemplates' => 'Mallar med flest länkar till sig',
 'mostcategories' => 'Sidor med flest kategorier',
 'mostimages' => 'Filer med flest länkar till sig',
 'mostinterwikis' => 'Sidor med flest interwikis',
@@ -2253,7 +2255,7 @@ Varje rad innehåller länkar till den första och andra omdirigeringsidan, samt
 'move' => 'Flytta',
 'movethispage' => 'Flytta denna sida',
 'unusedimagestext' => 'Följande filer existerar men är inte inlagda i någon sida.
-Lägg märke till att andra webbplatser kan länka till en fil med en direkt URL. Filer kan därför  användas aktivt trots att de listas här.',
+Observera att andra webbplatser kan länka direkt till en fil med en URL. Filer kan därför användas aktivt trots att de listas här.',
 'unusedcategoriestext' => 'Följande kategorier finns men innehåller inga sidor eller underkategorier.',
 'notargettitle' => 'Inget mål',
 'notargettext' => 'Du har inte angivit någon sida eller användare att utföra denna funktion på.',
@@ -2267,7 +2269,7 @@ Lägg märke till att andra webbplatser kan länka till en fil med en direkt URL
 # Book sources
 'booksources' => 'Bokkällor',
 'booksources-search-legend' => 'Sök efter bokkällor',
-'booksources-go' => 'Sök',
+'booksources-go' => '',
 'booksources-text' => 'Nedan följer en lista över länkar till webbplatser som säljer nya och begagnade böcker, och som kanske har ytterligare information om de böcker du söker.',
 'booksources-invalid-isbn' => 'Det angivna ISBN-numret verkar inte vara giltigt. Kontrollera källan för eventuella fel.',
 
@@ -2338,7 +2340,7 @@ Det krävs åtminstone en toppdomän, t.ex. "*.org".<br />
 'activeusers-intro' => 'Detta är en lista på användare som har haft någon form av aktivitet inom de senaste $1 {{PLURAL:$1|dygnet|dygnen}}.',
 'activeusers-count' => '$1 {{PLURAL:$1|handling|handlingar}} {{PLURAL:$3|det senaste dygnet|de senaste $3 dygnen}}',
 'activeusers-from' => 'Visa användare från och med:',
-'activeusers-hidebots' => 'Göm botar',
+'activeusers-hidebots' => 'Dölj botar',
 'activeusers-hidesysops' => 'Dölj administratörer',
 'activeusers-noresult' => 'Inga användare funna.',
 
@@ -2353,14 +2355,14 @@ Det kan finnas [[{{MediaWiki:Listgrouprights-helppage}}|ytterligare information]
 'listgrouprights-rights' => 'Behörigheter',
 'listgrouprights-helppage' => 'Help:Gruppbehörigheter',
 'listgrouprights-members' => '(lista över medlemmar)',
-'listgrouprights-addgroup' => 'Kan lägga till {{PLURAL:$2|gruppen|grupperna}}: $1',
-'listgrouprights-removegroup' => 'Kan ta bort {{PLURAL:$2|gruppen|grupperna}}: $1',
-'listgrouprights-addgroup-all' => 'Kan lägga till alla användargrupper',
-'listgrouprights-removegroup-all' => 'Kan ta bort alla användargrupper',
-'listgrouprights-addgroup-self' => 'Kan lägga till {{PLURAL:$2|gruppen|grupperna}} till sitt eget konto: $1',
-'listgrouprights-removegroup-self' => 'Kan ta bort {{PLURAL:$2|gruppen|grupperna}} från sitt eget konto: $1',
-'listgrouprights-addgroup-self-all' => 'Kan lägga till alla grupperna till sitt eget konto',
-'listgrouprights-removegroup-self-all' => 'Kan ta bort alla grupperna från sitt eget konto',
+'listgrouprights-addgroup' => 'Lägg till {{PLURAL:$2|gruppen|grupperna}}: $1',
+'listgrouprights-removegroup' => 'Ta bort {{PLURAL:$2|gruppen|grupperna}}: $1',
+'listgrouprights-addgroup-all' => 'Lägg till alla användargrupper',
+'listgrouprights-removegroup-all' => 'Ta bort alla användargrupper',
+'listgrouprights-addgroup-self' => 'Lägg till {{PLURAL:$2|gruppen|grupperna}} på eget konto: $1',
+'listgrouprights-removegroup-self' => 'Ta bort {{PLURAL:$2|gruppen|grupperna}} från eget konto: $1',
+'listgrouprights-addgroup-self-all' => 'Lägg till alla grupperna till eget konto',
+'listgrouprights-removegroup-self-all' => 'Ta bort alla grupperna från eget konto',
 
 # Email user
 'mailnologin' => 'Ingen adress att skicka till',
@@ -2373,7 +2375,7 @@ Det kan finnas [[{{MediaWiki:Listgrouprights-helppage}}|ytterligare information]
 Den e-postadress du har angivit i [[Special:Preferences|dina användarinställningar]] kommer att visas som "Från"-adress i meddelandet, så att mottagaren har möjlighet att svara direkt till dig.',
 'usermailererror' => 'Fel i hanteringen av mail:',
 'defemailsubject' => '{{SITENAME}} e-post från användare "$1"',
-'usermaildisabled' => 'Användar-epost avaktiverat',
+'usermaildisabled' => 'Användar-e-post avaktiverat',
 'usermaildisabledtext' => 'Du kan inte skicka e-post till andra användare på den här wikin',
 'noemailtitle' => 'Ingen e-postadress',
 'noemailtext' => 'Den här användaren har inte angivit en giltig e-postadress.',
@@ -2393,7 +2395,7 @@ Den e-postadress du har angivit i [[Special:Preferences|dina användarinställni
 'emailccsubject' => 'Kopia av ditt meddelande till $1: $2',
 'emailsent' => 'E-post har nu skickats',
 'emailsenttext' => 'Ditt e-postmeddelande har skickats',
-'emailuserfooter' => 'Detta e-brev skickades av $1 till $2 genom "Skicka e-post"-funktionen på {{SITENAME}}.',
+'emailuserfooter' => 'Denna e-post skickades av $1 till $2 genom "Skicka e-post"-funktionen på {{SITENAME}}.',
 
 # User Messenger
 'usermessage-summary' => 'Lämnar systemmeddelande.',
@@ -2424,15 +2426,15 @@ Framtida ändringar av den här sidan och dess diskussionssida kommer att listas
 'watchmethod-recent' => 'letar efter bevakade sidor bland senaste ändringar',
 'watchmethod-list' => 'letar efter nyligen gjorda ändringar bland bevakade sidor',
 'watchlistcontains' => 'Din bevakningslista innehåller $1 {{PLURAL:$1|sida|sidor}}.',
-'iteminvalidname' => "Problem med sidan '$1', ogiltigt namn...",
-'wlnote' => "Nedan finns {{PLURAL:$1|den senaste ändringen|de senaste '''$1''' ändringarna}} under {{PLURAL:$2|den senaste timmen|de senaste '''$2''' timmarna}} från den $3, kl. $4.",
+'iteminvalidname' => "Problem med ''$1'', ogiltigt namn...",
+'wlnote' => "Nedan finns {{PLURAL:$1|den senaste ändringen|de senaste '''$1''' ändringarna}} under {{PLURAL:$2|den senaste timmen|de senaste '''$2''' timmarna}} från den $3 kl. $4.",
 'wlshowlast' => 'Visa senaste $1 timmarna $2 dygnen $3',
 'watchlist-options' => 'Alternativ för bevakningslistan',
 
 # Displayed when you click the "watch" button and it is in the process of watching
 'watching' => 'Bevakar...',
 'unwatching' => 'Avbevakar...',
-'watcherrortext' => 'Ett fel inträffade när du ändrade dina bevakningsinställningarna för " $1 ".',
+'watcherrortext' => 'Ett fel inträffade när du ändrade dina bevakningsinställningarna för "$1".',
 
 'enotif_mailer' => '{{SITENAME}}s system för att få meddelanden om förändringar per e-post',
 'enotif_reset' => 'Markera alla sidor som besökta',
@@ -2480,11 +2482,11 @@ Feedback och ytterligare hjälp:
 'changed' => 'ändrad',
 
 # Delete
-'deletepage' => 'Ta bort sida',
+'deletepage' => 'Radera sida',
 'confirm' => 'Bekräfta',
-'excontent' => "Före radering: '$1'",
-'excontentauthor' => "innehållet var: '$1' (den enda som skrivit var '[[Special:Contributions/$2|$2]]')",
-'exbeforeblank' => "innehåll före tömning var: '$1'",
+'excontent' => 'Före radering: "$1"',
+'excontentauthor' => 'innehållet var: "$1" (den enda som skrivit var "[[Special:Contributions/$2|$2]]")',
+'exbeforeblank' => 'innehåll före tömning var: "$1"',
 'exblank' => 'sidan var tom',
 'delete-confirm' => 'Radera "$1"',
 'delete-legend' => 'Radera',
@@ -2497,7 +2499,7 @@ Bekräfta att du förstår vad du håller på med och vilka konsekvenser detta l
 Se $2 för noteringar om de senaste raderingarna.',
 'dellogpage' => 'Raderingslogg',
 'dellogpagetext' => 'Nedan listas de senaste raderingarna.',
-'deletionlog' => 'raderingsloggen',
+'deletionlog' => 'raderingslogg',
 'reverted' => 'Återgått till tidigare version',
 'deletecomment' => 'Anledning:',
 'deleteotherreason' => 'Annan/ytterligare anledning:',
@@ -2515,8 +2517,8 @@ Se $2 för noteringar om de senaste raderingarna.',
 
 # Rollback
 'rollback' => 'Rulla tillbaka ändringar',
-'rollback_short' => 'Återställning',
-'rollbacklink' => 'rulla tillbaka',
+'rollback_short' => 'Tillbakarullning',
+'rollbacklink' => 'tillbakarullning',
 'rollbacklinkcount' => 'rulla tillbaka $1 {{PLURAL:$1|redigering|redigeringar}}',
 'rollbacklinkcount-morethan' => 'rulla tillbaka mer än $1 {{PLURAL:$1|redigering|redigeringar}}',
 'rollbackfailed' => 'Tillbakarullning misslyckades',
@@ -2538,26 +2540,26 @@ Sidan ändrades senast av [[User:$3|$3]] ([[User talk:$3|diskussion]]{{int:pipe-
 'protectlogpage' => 'Skrivskyddslogg',
 'protectlogtext' => 'Detta är en lista över applicerande och borttagande av skrivskydd.
 Se [[Special:ProtectedPages|listan över skyddade sidor]] för listan över aktiva sidskydd.',
-'protectedarticle' => 'skyddade [[$1]]',
+'protectedarticle' => 'skrivskyddade [[$1]]',
 'modifiedarticleprotection' => 'ändrade skyddsnivån för "[[$1]]"',
-'unprotectedarticle' => 'tog bort skydd från "[[$1]]"',
-'movedarticleprotection' => 'flyttade skyddsinställningar från "[[$2]]" till "[[$1]]"',
-'protect-title' => 'Skyddsinställningar för "$1"',
+'unprotectedarticle' => 'tog bort skrivskydd från "[[$1]]"',
+'movedarticleprotection' => 'flyttade skrivskyddsinställningar från "[[$2]]" till "[[$1]]"',
+'protect-title' => 'Ändra skrivskyddsnivå för "$1"',
 'protect-title-notallowed' => 'Visa skyddsnivån för "$1"',
-'prot_1movedto2' => 'flyttade [[$1]] till [[$2]]',
+'prot_1movedto2' => '[[$1]] flyttades till [[$2]]',
 'protect-badnamespace-title' => 'Namnrymd som inte kan skrivskyddas',
 'protect-badnamespace-text' => 'Sidor i den här namnrymden kan inte skrivskyddas.',
-'protect-norestrictiontypes-text' => 'Denna sida kan inte skyddas eftersom det inte finns några begränsningstyper tillgängliga.',
-'protect-norestrictiontypes-title' => 'Oskyddbar sida',
+'protect-norestrictiontypes-text' => 'Denna sida kan inte skrivskyddas eftersom det inte finns några begränsningstyper tillgängliga.',
+'protect-norestrictiontypes-title' => 'Sidan kan inte skrivskyddas',
 'protect-legend' => 'Bekräfta skrivskydd av sida',
 'protectcomment' => 'Anledning:',
 'protectexpiry' => 'Varaktighet:',
 'protect_expiry_invalid' => 'Ogiltig varaktighetstid.',
-'protect_expiry_old' => 'Den angivna varaktighetentiden har redan passerats.',
-'protect-unchain-permissions' => 'Lås upp fler skyddsalternativ',
-'protect-text' => "Här kan du se och ändra skyddsnivån av sidan '''$1'''.",
-'protect-locked-blocked' => "Du kan inte ändra sidors skydd medan du är blockerad.
-Här kan du se gällande skyddsinställninger för sidan '''$1''':",
+'protect_expiry_old' => 'Den angivna varaktighetstiden har redan passerats.',
+'protect-unchain-permissions' => 'Lås upp fler skrivskyddsalternativ',
+'protect-text' => "Här kan du se och ändra skrivskyddsnivån av sidan '''$1'''.",
+'protect-locked-blocked' => "Du kan inte ändra sidors skrivskydd medan du är blockerad.
+Här kan du se gällande skrivskyddsinställninger för sidan '''$1''':",
 'protect-locked-dblock' => "Skrivskydd kan inte ändras då databasen är låst.
 Nuvarande skrivskyddsinställning för sidan '''$1''' är:",
 'protect-locked-access' => "Ditt konto har inte behörighet att ändra skrivskydd på sidor.
@@ -2570,10 +2572,10 @@ Du kan ändra skyddet av den här sidan, men det påverkar inte det kaskaderande
 'protect-level-sysop' => 'Enbart administratörer',
 'protect-summary-cascade' => 'kaskaderande',
 'protect-expiring' => 'upphör den $1 (UTC)',
-'protect-expiring-local' => 'löper ut $1',
+'protect-expiring-local' => 'upphör $1',
 'protect-expiry-indefinite' => 'på obestämd tid',
 'protect-cascade' => 'Skydda sidor som är inkluderade i den här sidan (kaskaderande skydd)',
-'protect-cantedit' => 'Du kan inte ändra skyddsnivån för den här sidan, eftersom du inte har behörighet att redigera den.',
+'protect-cantedit' => 'Du kan inte ändra skrivskyddsnivån för den här sidan, eftersom du inte har behörighet att redigera den.',
 'protect-othertime' => 'Annan tidsperiod:',
 'protect-othertime-op' => 'annan tidsperiod',
 'protect-existing-expiry' => 'Gällande varaktighet: $2, kl. $3',
@@ -2584,7 +2586,7 @@ Du kan ändra skyddet av den här sidan, men det påverkar inte det kaskaderande
 ** Upprepad spam
 ** Redigeringskrig
 ** Sida med många besökare',
-'protect-edit-reasonlist' => 'Redigera skyddsanledningar',
+'protect-edit-reasonlist' => 'Redigera skrivskyddsanledningar',
 'protect-expiry-options' => '1 timme:1 hour,1 dygn:1 day,1 vecka:1 week,2 veckor:2 weeks,1 månad:1 month,3 månader:3 months,6 månader:6 months,1 år:1 year,oändlig:infinite',
 'restriction-type' => 'Typ av skydd:',
 'restriction-level' => 'Skyddsnivå:',
@@ -2593,10 +2595,10 @@ Du kan ändra skyddet av den här sidan, men det påverkar inte det kaskaderande
 'pagesize' => '(byte)',
 
 # Restrictions (nouns)
-'restriction-edit' => 'Redigering',
-'restriction-move' => 'Flyttning',
+'restriction-edit' => 'Redigera',
+'restriction-move' => 'Flytta',
 'restriction-create' => 'Skapa sidan',
-'restriction-upload' => 'Uppladdning',
+'restriction-upload' => 'Ladda upp',
 
 # Restriction levels
 'restriction-level-sysop' => 'helt låst',
@@ -2605,7 +2607,7 @@ Du kan ändra skyddet av den här sidan, men det påverkar inte det kaskaderande
 
 # Undelete
 'undelete' => 'Visa raderade sidor',
-'undeletepage' => 'Visa och återställ borttagna sidor',
+'undeletepage' => 'Visa och återställ raderade sidor',
 'undeletepagetitle' => "'''Härunder visas en lista över raderade versioner av [[:$1|$1]]'''.",
 'viewdeletedpage' => 'Visa raderade sidor',
 'undeletepagetext' => 'Följande {{PLURAL:$1|sida har blivit raderad|$1 sidor har blivit raderade}} men finns fortfarande i arkivet och kan återställas.
@@ -3070,7 +3072,7 @@ Spara den på din dator och ladda upp den här.',
 'tooltip-pt-preferences' => 'Dina inställningar',
 'tooltip-pt-watchlist' => 'Listan över sidor du bevakar för ändringar',
 'tooltip-pt-mycontris' => 'Lista över dina bidrag',
-'tooltip-pt-login' => 'Du får gärna logga in, men det är inte nödvändigt',
+'tooltip-pt-login' => 'Du uppmuntras att logga in, men det är inte nödvändigt',
 'tooltip-pt-anonlogin' => 'Du får gärna logga in, men det är inte nödvändigt',
 'tooltip-pt-logout' => 'Logga ut',
 'tooltip-ca-talk' => 'Diskussion om innehållssidan',
index 15b7ec0..10ad43e 100644 (file)
@@ -67,7 +67,7 @@ $namespaceGenderAliases = array();
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Podsztrychńyńcy linkůw:',
-'tog-justify' => 'Wyrůwnowej tekst we akapitach (justowańy)',
+'tog-justify' => 'Wyrůwnywej tekst we akapitach (justowańy)',
 'tog-hideminor' => 'Schow drobne pomjyńańa we ńydowno pomjyńanych',
 'tog-hidepatrolled' => 'Schow sprowdzůne sprowjyńa we ńydowno pomjyńanych',
 'tog-newpageshidepatrolled' => 'Schow sprawdzůne zajty na wykoźe nowych zajtůw',
@@ -76,7 +76,6 @@ $messages = array(
 'tog-numberheadings' => 'Automatyczno numeracyjo titlůw',
 'tog-showtoolbar' => 'Pokoż gurt werkcojgůw (JavaScript)',
 'tog-editondblclick' => 'Edycyjo napoczynajům dwa klikńyńća (JavaScript)',
-'tog-editsection' => 'Kożdo tajla zajty sprowjano uosobno',
 'tog-editsectiononrightclick' => 'Klikńyńće prawym kneflym myszy na titlu tajli<br />napoczyno jigo sprowjańy(JavaScript)',
 'tog-showtoc' => 'Pokoż spis treśći (na zajtach, kere majům wjyncyj kej trzi tajle)',
 'tog-rememberpassword' => 'Pamjyntej můj ausdruk na tym kůmputrze (nojdalij bez $1 {{PLURAL:$1|dźyń|dńůw}})',
@@ -591,7 +590,7 @@ Kej bydźesz chćoł je podoć, bydům użyte, coby dokůmyntowoć Twoje autorst
 'user-mail-no-body' => 'Bůła průba posłańo e-brifa uo blank abo krůtkim tekśće.',
 
 # Change password dialog
-'changepassword' => 'Zmjana hasua',
+'changepassword' => 'Zmiana hasła',
 'resetpass_announce' => 'Zalůgowołżeś śe ze tymczasowym kodym uotrzimanym bez e-brif. Coby zakůńczyć proces logůwańo muśisz nasztalować nowe hasło:',
 'resetpass_header' => 'Zmjyń hasło lů swojygo kůnta',
 'oldpassword' => 'Stare hasło',
@@ -745,12 +744,12 @@ Mogesz [[Special:Search/{{PAGENAME}}|wysznupać ta titla]] we treśćach inkszyc
 'session_fail_preview' => "'''Pozůr! Serwer ńy może przetworzić tyj edycyji, beztuż co dane sesyji uostoły utracůne.
 Poprůbuj jeszcze roz.
 Eli to tyż ńy do podpory – [[Special:UserLogout|wyloguj śe]] a zaloguj jeszcze roz.'''",
-'session_fail_preview_html' => "'''Přeprašomy! Serwer ńy može přetwořyć tygo sprowjyńo skuli utraty danych ze sesyji.'''
+'session_fail_preview_html' => "'''Przepraszomy! Serwer ńy może przetworzić tygo sprowjyńo skuli utraty danych ze sesyji.'''
 
-''Jako iže na {{GRAMMAR:MS.lp|{{SITENAME}}}} wuůnÄ\8dono zostoua uopcyjo \"raw HTML\", podglůnd zostou schrůÅ\84ony coby zabezpjeÄ\8d\87 pÅ\99ed atakami JavaScript.''
+''Jako iże na {{GRAMMAR:MS.lp|{{SITENAME}}}} wÅ\82ůnczono zostoÅ\82a uopcyjo \"raw HTML\", podglůnd zostoÅ\82 schrůÅ\84ony coby zabezpjeczyÄ\87 przed atakami JavaScript.''
 
 '''Jeli to je prawiduowo průba sprowjańo, sprůbuj ješče roz. Kejby to ńy pomoguo - wylůguj śe a zalůguj na nowo.'''",
-'token_suffix_mismatch' => "'''Twoje sprowjyńy zostouo uodćepńynte skuli tego, co twůj klijynt pomjyšou znaki uod interpůnkcyji w žetůńe sprowjyń. Twoje sprowjyńy zostouo uodćepńynte coby zapobjec zńyščyńu tekstu zajty. Take průblymy zdořajům śe w roźe kůřistańo s felernych anůnimowych śećowych usuůg proxy.'''",
+'token_suffix_mismatch' => "'''Twoje sprowjyńy zostoło uodćepane skuli tego, co twůj klijynt pomjyszoł znaki uod interpůnkcyji we żetůńe sprowjyń. Twoje sprowjyńy zostoło uodćepane coby zapobjec zńyszczyńu tekstu zajty. Take felery zdorzajům śe w roźe korzistańo ze felernych anůnimowych śećowych usłůg proxy.'''",
 'editing' => 'Sprowjosz $1',
 'creating' => 'Tworzyńy $1',
 'editingsection' => 'Sprowjosz $1 (sekcyjo)',
@@ -766,7 +765,7 @@ wciśńesz knefel \"{{int:savearticle}}\".",
 'storedversion' => 'Naszkryflano wersyjo',
 'nonunicodebrowser' => "'''Pozůr! Twoja přeglůndorka ńy umje poprowńy rozpoznować kodowańo UTF-8 (Unicode). Bestož wšyjske znoki, kerych Twoja přeglůndorka ńy umje rozpoznować, zamjeńůno na jejich kody heksadecymalne.'''",
 'editingold' => "'''Dej pozůr: Sprowjoš inkšo wersyjo zajty kej bježůnco. Jeli jům naškryfloš, wšyjske půźńyjše pomjyńańa bydům wyćepane.'''",
-'yourdiff' => 'Růžńice',
+'yourdiff' => 'Růżńice',
 'copyrightwarning' => "Pamjyntej uo tym, aże cołki wkłod do {{SITENAME}} udostympńůmy wedle zasad $2 (dokładńij we $1). Jak ńy chcesz, coby kożdy můg go půmjyńać a dalij rozpowszychńoć, ńy wćepuj uůnygo sam. Szkryflajůnc sam tukej pośwjadczosz tyż, co te pisańy je twoje własne, abo żeś go wźůn(a) ze materjołůw kere sům na ''public domain'', abo kůmpatybilne.<br />
 '''PROSZA ŃY WĆEPYWAĆ SAM MATYRJOŁŮW KERE SŮM CHRŮŃONE AUTORSKIM PRAWYM BEZ DOZWOLEŃO WŁAŚĆIĆELA!'''",
 'copyrightwarning2' => "Pamjyntej uo tym, aże cołki wkłod do {{GRAMMAR:MS.lp|{{SITENAME}}}} może być sprowjany, pomjyńany abo wyćepany bez inkszych użytkownikůw. Jak ńy chcysz, coby kożdy můg uůnygo zmjyńać a dalij rozpowszychńoć bez uograniczyń, ńy wćepuj go sam.<br />
@@ -808,33 +807,33 @@ Rejer wyćepań tyj zajty je podany půńiżej, cobyś mioł wygoda:",
 'edit-gone-missing' => 'Ńy idźe zaktualizować zajty.
 Zdowo śe, co zostoła wyćepano.',
 'edit-conflict' => 'Kůnflikt sprowjyń.',
-'edit-no-change' => 'Twoje sprowjyńe uostouo zignorowane pů takymu, co ńic žeś we tekśće ńy zmjyńiu.',
+'edit-no-change' => 'Twoje sprowjyńe uostoło zignorowane pů takymu, aże ńic żeś we tekśće ńy zmjyńůł.',
 'postedit-confirmation' => 'Spamjyntano twoje sprowjyńe.',
-'edit-already-exists' => 'Ńy idźe utwořić nowyj zajty.
-Tako zajta juž sam je.',
+'edit-already-exists' => 'Ńy idźe utworzić nowyj zajty.
+Tako zajta już sam je.',
 'defaultmessagetext' => 'Tekst důmyślny',
 
 # Parser/template warnings
-'expensive-parserfunction-warning' => 'Dej pozůr: ta zajta mo za dužo uodwouaÅ\84 do funkcyji parsera, kere mocno uobÄ\87ůnžajům systym.
+'expensive-parserfunction-warning' => 'Dej pozůr: ta zajta mo za dużo uodwouaÅ\84 do funkcyji parsera, kere mocno uobÄ\87ůnżajům systym.
 
-Powinno być myńi jak $2 {{PLURAL:$2|wywouańy|wywouańo|wywouań}}, a terozki {{PLURAL:$1|je $1 wywouańy|sům $1 wywouańo|je $1 wywouań}}.',
-'expensive-parserfunction-category' => 'Zajty kere majům za dužo uodwouaÅ\84 do funkcyji parsera, kere mocno uobÄ\87ůnžajům systym.',
+Powinno być myńi jak $2 {{PLURAL:$2|wywołańy|wywołańo|wywołań}}, a terozki {{PLURAL:$1|je $1 wywołańy|sům $1 wywołańo|je $1 wywołań}}.',
+'expensive-parserfunction-category' => 'Zajty kere majům za dużo uodwoÅ\82\84 do funkcyji parsera, kere mocno uobÄ\87ůnżajům systym.',
 'post-expand-template-inclusion-warning' => 'Dej pozůr: Dokuplowane mustry sům moc wjelge.
 Ńykere mustry ńy bydům dokuplowane.',
 'post-expand-template-inclusion-category' => 'Zajty, na kerych dokuplowane mustry sům moc wjelge',
-'post-expand-template-argument-warning' => 'Dej pozůr: Ta zajta zawjyro přinojmyńi jedyn argument we šablůńe kery powoduje co je ůun za wjelgi. Te argumynty bydům pomińynte.',
+'post-expand-template-argument-warning' => 'Dej pozůr: Ta zajta zawjyro przinojmyńi jedyn argument we mustrze, kery powoduje co je ůun za wjelgi. Te argumynty bydům pomińynte.',
 'post-expand-template-argument-category' => 'Zajty na kerych sům šablůny s pomińyntymi argumyntůma.',
 'parser-template-loop-warning' => 'Wykryto muster zapyntlyńo: [[$1]]',
-'parser-template-recursion-depth-warning' => 'Przekroczůno limit głymbokośći rekurencyji szablona ($1)',
+'parser-template-recursion-depth-warning' => 'Przekroczůno limit głymbokośći rekurencyji mustru ($1)',
 
 # "Undo" feature
 'undo-success' => 'Sprowjyńy zostouo wycůfane. Proša pomjarkować ukozane půnižyj dyferencyje mjyndzy wersyjami, coby zweryfikować jejich poprawność, potym zaś naškryflać pomjyńańo coby zakońčyć uoperacyjo.',
-'undo-failure' => 'Sprowjyńo ńy idźe wycofać skuli kůnflikta ze wersyjůma postřednimi.',
-'undo-norev' => 'Sprowjyńo ńy idźe cofnůńć skuli tego, co ńy istńije abo zostouo wyćepane.',
+'undo-failure' => 'Sprowjyńo ńy idźe wycofać skuli kůnflikta ze wersyjůma postrzedńimi.',
+'undo-norev' => 'Sprowjyńo ńy idźe cofnůńć skuli tego, co ńy istńije abo uostoło wyćepane.',
 'undo-summary' => 'Wycůfańy wersyji $1 naszkryflanej bez [[Special:Contributions/$2|$2]] ([[User talk:$2|godka]])',
 
 # Account creation failure
-'cantcreateaccounttitle' => 'Ńy idźe utwořić kůnta',
+'cantcreateaccounttitle' => 'Ńy do śe utworzić kůnta',
 'cantcreateaccount-text' => "Tworzyńy kůnta s tygo adresu IP ('''$1''') zostoło zawarte bez użytkowńika [[User:$3|$3]].
 
 Skuli: ''$2''",
@@ -842,8 +841,8 @@ Skuli: ''$2''",
 # History pages
 'viewpagelogs' => 'Uoboč rejery uoperacyji lo tyj zajty',
 'nohistory' => 'Ta zajta ńy mo swojij historyje sprowjyń.',
-'currentrev' => 'Aktualno wersyjo',
-'currentrev-asof' => 'Aktualno wersyjo na dźyń $1',
+'currentrev' => 'Aktuelno wersyjo',
+'currentrev-asof' => 'Aktuelno wersyjo na dźyń $1',
 'revisionasof' => 'Wersyjo ze dńa $1',
 'revision-info' => 'Wersyjo s dńa $1; $2',
 'previousrevision' => '← starszo wersyjo',
@@ -852,7 +851,7 @@ Skuli: ''$2''",
 'cur' => 'akt.',
 'next' => 'nastympno',
 'last' => 'poprz.',
-'page_first' => 'počůnek',
+'page_first' => 'poczůnek',
 'page_last' => 'kůńec',
 'histlegend' => 'Wybůr růżńic do porůwnańo: postow kropki we boksach a naćiś enter abo knefel na dole.<br />
 Legynda: (akt.) - růżńice s wersyjům bjeżůncům, (poprz.) - růżńice s wersyjům poprzedzajůncům, d - drobne zmjany',
@@ -868,13 +867,13 @@ Legynda: (akt.) - růżńice s wersyjům bjeżůncům, (poprz.) - růżńice s w
 'history-feed-description' => 'Historyjo wersyje tyj zajty wiki',
 'history-feed-item-nocomment' => '$1 uo $2',
 'history-feed-empty' => 'Wybrano zajta ńy istńije.
-Můgua zostać wyćepano abo přećepano pod inkše mjano.
-MožeÅ¡ tyž [[Special:Search|Å¡nupać]] za tům zajtům.',
+Můgła uostać wyćepano abo przećepano pod inksze mjano.
+Możesz tyż [[Special:Search|sznupać]] za tům zajtům.',
 
 # Revision deletion
 'rev-deleted-comment' => '(kůmyntorz wyćepany)',
-'rev-deleted-user' => '(užytkowńik wyćepany)',
-'rev-deleted-event' => '(škryflańy wyćepane)',
+'rev-deleted-user' => '(użytkowńik wyćepany)',
+'rev-deleted-event' => '(szkryflańy wyćepane)',
 'rev-deleted-text-permission' => 'Wersyjo tyj zajty uostoua wyćepano a ńy je dostympna publičńy. Ščygůuy idźe znejść we [{{fullurl:{{#Special:Log}}/suppress|page={{PAGENAMEE}}}} rejeře wyćepań].',
 'rev-deleted-text-view' => 'Ta wersyjo zajty uostoua wyćepano a ńy je dostympna publičńy.
 Atoli kej admińistrator {{GRAMMAR:MS.lp|{{SITENAME}}}} možeš jům uobejřeć.
@@ -887,15 +886,15 @@ Powody wyćepańo idźe znejść we [{{fullurl:{{#Special:Log}}/suppress|page={{
 'revdelete-no-file' => 'Ńy mo tygo plika.',
 'revdelete-show-file-confirm' => 'Jeżeś echt pewny co chcesz uobejzdrzeć wyćepano wersyjo plika „<nowiki>$1</nowiki>” s $2 $3?',
 'revdelete-show-file-submit' => 'Ja',
-'revdelete-selected' => "'''{{PLURAL:$2|Wybrano wersyja|Wybrane wersyje}} zajty [[:$1]]:'''",
-'logdelete-selected' => "'''{{PLURAL:$1|Wybrane zdařyńy s rejeru|Wybrane zdařyńa s rejeru}}:'''",
+'revdelete-selected' => "'''{{PLURAL:$2|Wybrano wersyjo|Wybrane wersyje}} zajty [[:$1]]:'''",
+'logdelete-selected' => "'''{{PLURAL:$1|Wybrane zdarzyńy ze rejeru|Wybrane zdarzyńa ze rejeru}}:'''",
 'revdelete-text' => "'''Wyćepane wersyje bydům dali widoczne w historyji zajty, nale jejich treść ńy bydźe publiczńy dostympna.'''
 
 Inkśi admińistratorzi {{GRAMMAR:D.lp|{{SITENAME}}}} dali bydům mjeć dostymp do schrůńůnych wersyji a bydům můgli je wćepać nazod, chyba aże uoperator serwisu nouożůł dodatkowe uograńiczyńo.",
 'revdelete-legend' => 'Naštaluj uograńičyńo lo wersyji:',
 'revdelete-hide-text' => 'Schrůń tekst wersyji',
 'revdelete-hide-image' => 'Schrůń zawartość plika',
-'revdelete-hide-name' => 'Schrůń akcyjo a cyl',
+'revdelete-hide-name' => 'Schrůń akcyjo a cwek',
 'revdelete-hide-comment' => 'Schrůń kůmyntoř sprowjyńo',
 'revdelete-hide-user' => 'Schrůń mjano użytkowńika/adres IP',
 'revdelete-hide-restricted' => 'Schrůń informacyje zarůwno przed admińistratorůma jak i przed inkszymi',
@@ -906,15 +905,15 @@ Inkśi admińistratorzi {{GRAMMAR:D.lp|{{SITENAME}}}} dali bydům mjeć dostymp
 'revdelete-unsuppress' => 'Usůń uograńičyńo lo wćepanej nazod historyje pomjyńań',
 'revdelete-log' => 'Czymu:',
 'revdelete-submit' => 'Zaakceptuj do wybrany{{PLURAL:$1|j wersyji|ch wersyji}}',
-'revdelete-success' => 'Půmyślńy zmjyńůno widoczność wersyji.',
-'revdelete-failure' => 'Feler przi zmjyńůńu widoczności wersyji.
-$1',
-'logdelete-success' => 'Půmyślńy půmjyńůno widočność zdařyń',
-'logdelete-failure' => 'Feler przi zmjyńe widoczości rejera.
-$1',
+'revdelete-success' => "'''Půmyślńy zmjyńůno widoczność wersyji.'''",
+'revdelete-failure' => "'''Feler przi pomjyńańu widocznośći wersyji:'''
+$1",
+'logdelete-success' => "'''Půmyślńy půmjyńůno widoczność zdarzyń.'''",
+'logdelete-failure' => "'''Feler przi pomjańe widoczości rejera.'''
+$1",
 'revdel-restore' => 'půmjyń widoczność',
 'pagehist' => 'Historyjo sprowjyń zajty',
-'deletedhist' => 'Wyćepano historyjo sprowjyń',
+'deletedhist' => 'Wyćepano gyszichta sprowjyń',
 'revdelete-hide-current' => 'Feler przi wyćepywańu wersyji $2, $1.',
 'revdelete-show-no-access' => 'Feler przy ukozoniu wersyji $2, $1. Ńy mosz uprawńyń lo njygo.',
 'revdelete-modify-no-access' => 'Feler przy zmjyńe widoczności wersyji $2, $1. Ńy mosz uprawńeń lo njygo.',
@@ -1017,11 +1016,11 @@ $1',
 'search-nonefound' => 'Ńy mo wynikůw, kere uodpadajům kryterjům zapytańo.',
 'powersearch-legend' => 'Sznupańy zaawansowane',
 'powersearch-ns' => 'Sznupej we przestrzyńach mjan:',
-'powersearch-redir' => 'Pokož pÅ\99ekerowańa',
-'powersearch-togglelabel' => 'Zaznocz:',
+'powersearch-redir' => 'Pokoż przekerowańa',
+'powersearch-togglelabel' => 'Uoznocz:',
 'powersearch-toggleall' => 'Wszyjsko',
 'powersearch-togglenone' => 'żodno',
-'search-external' => 'Šnupańy zewnyntřne',
+'search-external' => 'Zewnyntrzne sznupańy',
 'searchdisabled' => 'Šnupańy we {{GRAMMAR:MS.lp|{{SITENAME}}}} zostouo zawarte. Zańim go zouůnčům, možeš sprůbować šnupańo bez Google. Ino zauwaž, co informacyje uo treśći {{GRAMMAR:MS.lp|{{SITENAME}}}} můgům być we Google ńyakuratne.',
 'search-error' => 'Wystůmpjůł feler przi sznupańu: $1',
 
@@ -1040,22 +1039,22 @@ $1',
 'prefs-rc' => 'Ńydowno pomjyńane',
 'prefs-watchlist' => 'Pozůrlista',
 'prefs-watchlist-days' => 'Ličba dńi widočnych na liśće artikli, na kere dowoš pozůr:',
-'prefs-watchlist-days-max' => 'Max $1 {{PLURAL:$1|dźień|dńi}}',
+'prefs-watchlist-days-max' => 'Max $1 {{PLURAL:$1|dźyń|dńi}}',
 'prefs-watchlist-edits' => 'Ličba půmjyńań pokazywanych we rozšyřůnyj liśće artiklůw, na kere dowoš pozůr:',
 'prefs-watchlist-edits-max' => 'Maksymalno liczba: 1000',
-'prefs-watchlist-token' => 'ID půzorlisty:',
+'prefs-watchlist-token' => 'ID pozůrlisty:',
 'prefs-misc' => 'Roztůmajte',
 'prefs-resetpass' => 'Zmjyń hasło',
 'prefs-changeemail' => 'Pomjyno ausdruka e-brif',
 'prefs-setemail' => 'Nastow e-brif',
-'prefs-email' => 'E-brif',
+'prefs-email' => 'Uopcyje e-brifa',
 'prefs-rendering' => 'Wyglůnd',
 'saveprefs' => 'Spamjyntej',
 'restoreprefs' => 'Wćep wszyjskie důmyślne preferencyje',
 'prefs-editing' => 'Sprowjańy',
-'rows' => 'Wjerše:',
-'columns' => 'Kůlumny:',
-'searchresultshead' => 'Šnupańy',
+'rows' => 'Wjyrsze:',
+'columns' => 'Kolůmny:',
+'searchresultshead' => 'Sznupańy',
 'stub-threshold' => 'Maksymalny rozmjar artikla uoznačanygo kej <a href="#" class="stub">stub (kůnsek)</a>',
 'stub-threshold-disabled' => 'Uodymkńynte',
 'recentchangesdays' => 'Ličba dńi do pokazańo we půmjyńanych na uostatku:',
@@ -1063,23 +1062,23 @@ $1',
 'recentchangescount' => 'Liczba pozycyji na liśće půmjyńanych na uostatku, we historyje zajtůw a zajtach rejerůw:',
 'prefs-help-recentchangescount' => 'Ze listům ńydawnych pomjyńan, gyszichta zajt a rejer.',
 'savedprefs' => 'Twoje štalowańo we preferyncyjach zostouy naškryflane.',
-'timezonelegend' => 'Strefa czasowo',
+'timezonelegend' => 'Czasowo sztrefa',
 'localtime' => 'Lokalny czas:',
 'timezoneuseserverdefault' => 'Użyj domyślnygo czasu serwera ($1)',
 'timezoneuseoffset' => 'Inkszo (uokryśl różnica czasu)',
 'servertime' => 'Czas serwera:',
-'guesstimezone' => 'Pobjer z přeglůndarki',
+'guesstimezone' => 'Pobjer ze przeglůndarki',
 'timezoneregion-africa' => 'Afrika',
 'timezoneregion-america' => 'Ameryka',
 'timezoneregion-antarctica' => 'Antarktyda',
 'timezoneregion-arctic' => 'Arktyka',
 'timezoneregion-asia' => 'Azyjo',
 'timezoneregion-atlantic' => 'Uoceon Atlantycki',
-'timezoneregion-australia' => 'Australyjo',
+'timezoneregion-australia' => 'Australijo',
 'timezoneregion-europe' => 'Ojropa',
 'timezoneregion-indian' => 'Ocean Indyjski',
 'timezoneregion-pacific' => 'Uocean Spokojny',
-'allowemail' => 'Inkśi užytkowńicy můgům přesyuać mje e-brify',
+'allowemail' => 'Inksze użytkowńiki můgům posyłać mje e-brify',
 'prefs-searchoptions' => 'Sznupańe',
 'prefs-namespaces' => 'Raumy mjan',
 'defaultns' => 'Důmyślńy sznupej we nastympujůncych przystrzyńach mjan:',
@@ -1092,9 +1091,9 @@ $1',
 'prefs-registration' => 'Czas twůrzyńa kůnta:',
 'yourrealname' => 'Prawdźiwe mjano',
 'yourlanguage' => 'Godka interfejsu',
-'yournick' => 'Twoja šrajba:',
-'badsig' => 'Felerno šrajba, sprowdź značńiki HTML.',
-'badsiglength' => 'Twůj szrajbůng je za dugi. Maksymalno jego dugość to $1 {{PLURAL:$1|buchsztaby|buchsztabůw}}',
+'yournick' => 'Twoja szrajbka:',
+'badsig' => 'Felerno szrajbka, sprawdź znaczńiki HTML.',
+'badsiglength' => 'Twojo szrajbka je za dugo. Ji maksymalno dugość to $1 {{PLURAL:$1|buchsztaby|buchsztabůw}}',
 'yourgender' => 'Płeć:',
 'gender-unknown' => 'ńyznano',
 'gender-male' => 'chop',
@@ -1102,27 +1101,27 @@ $1',
 'email' => 'E-brif',
 'prefs-help-realname' => '* Mjano a nazwisko (uopcjůnalńy): jak żeś zdecydowoł aże je podosz, bydům użyte, coby Twoja robota mjoła atrybucyjo.',
 'prefs-help-email' => 'Ukozańy e-brifowygo adresu ńy je powinne, nale nutne, coby resetować ausdruk, eli zapomńisz.',
-'prefs-help-email-others' => 'Mogesz tyż uůmożnić inkszym używoczům posłać ci e-brif bez twojo zajta używocza abo zajta dyskusyje. Twůj e-brifowy adres śe ńy ukoże.',
+'prefs-help-email-others' => 'Mogesz tyż doć mogebność inkszym używoczům posłać ci e-brif bez twojo zajta używocza abo zajta dyskusyje. Twůj e-brifowy adres śe ńy ukoże.',
 'prefs-help-email-required' => 'Wymogany je adres e-brifa.',
 'prefs-diffs' => 'Diffy',
 
 # User rights
-'userrights' => 'Zařůndzańy prowami užytkowńikůw',
-'userrights-lookup-user' => 'Zařůndzej prowami užytkownika',
-'userrights-user-editname' => 'Wklepej sam nazwa užytkowńika:',
-'editusergroup' => 'Sprowjej grupy užytkowńika',
+'userrights' => 'Zarzůndzańy prowami użytkowńikůw',
+'userrights-lookup-user' => 'Zarzůndzej prowami użytkownika',
+'userrights-user-editname' => 'Wkludź sam mjano użytkowńika:',
+'editusergroup' => 'Sprowjej grupy użytkowńika',
 'editinguser' => "Zmjana uprawńyń užytkowńika '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
-'userrights-editusergroup' => 'Sprowjej grupy užytkowńika',
-'saveusergroups' => 'Zapisz',
-'userrights-groupsmember' => 'Noležy do:',
-'userrights-groups-help' => 'MožeÅ¡ půmjyÅ\84\87 pÅ\99inoležnoÅ\9bÄ\87 tygo užytkowÅ\84ika do podanych grup.
-*Zaznačůne pole uoznačo přinoležność užytkowńika do danej grupy.
-*Ńy zaznačůne pole uoznačo, aže užytkowńik ńy noležy do danej grupy.
-* Gwjozdka * infomuje, co ńy možeš wyćepać s grupy po dodańu do ńij abo dodać po wyćepańu s grupy.',
+'userrights-editusergroup' => 'Sprowjej grupy użytkowńika',
+'saveusergroups' => 'Spamjyntej',
+'userrights-groupsmember' => 'Noleżi do:',
+'userrights-groups-help' => 'Możesz zmjyÅ\84\87 przinależnoÅ\9bÄ\87 tego użytkowÅ\84ika do půdanych grup:
+* Uoznaczůne pole uoznoczo przinależność użytkowńika do danyj grupy.
+* Ńyuoznaczůne pole uoznoczo, aże użytkowńik ńy noleżi do danyj grupy.
+* Gwjozdka * pado, aże ńy możesz wyćepać użytkownika ze grupy po wkludzyńo uůnygo do ńij abo wkludzić po wyćepańu.',
 'userrights-reason' => 'Czymu:',
-'userrights-no-interwiki' => 'Ńy moš dostympu do sprowjańo uprawńyń.',
+'userrights-no-interwiki' => 'Ńy mosz dostympu do sprowjańo uprawńyń.',
 'userrights-nodatabase' => 'Baza danych $1 ńy istńije abo ńy je lokalno.',
-'userrights-nologin' => 'Muśiš [[Special:UserLogin|zalůgować śe]] na kůnto admińistratora, coby nadować uprawńyńo užytkowńikům.',
+'userrights-nologin' => 'Muśisz [[Special:UserLogin|zalůgować śe]] na kůnto admińistratora, coby nadować uprawńyńo użytkowńikům.',
 'userrights-notallowed' => 'Ńy mosz dostympu do nadawańo uprawńyń używaczom.',
 'userrights-changeable-col' => 'Grupy, kere možeš wybrać',
 'userrights-unchangeable-col' => 'Grupy, kerych ńy možeš wybrać',
@@ -1159,8 +1158,8 @@ $1',
 'right-createaccount' => 'Utwořůne nowe kůnta užytkowńikůw',
 'right-minoredit' => 'Uoznocz půmjyńańo kej drobne',
 'right-move' => 'Przećepane zajty',
-'right-move-subpages' => 'Przećep zajty wroz s jejich podzajtůma',
-'right-move-rootuserpages' => 'Překludzańy zajtůw uod užytkowńikůw',
+'right-move-subpages' => 'Przećep zajty wroz ze jejich podzajtůma',
+'right-move-rootuserpages' => 'Przekludzańy zajtůw uod użytkowńikůw',
 'right-movefile' => 'Przećepańe plikůw',
 'right-suppressredirect' => 'Ńy twůrz przekerowańo ze starygo mjana jak przećepujesz zajta',
 'right-upload' => 'Wćepane pliki',
@@ -1178,7 +1177,7 @@ $1',
 'right-bigdelete' => 'Wyćep zajty s dugům historyjům půmjyńań',
 'right-deleterevision' => 'Wyćepywańy a wćepywańy nazod wskazanych sprowjyń zajtůw',
 'right-deletedhistory' => 'Pokazuj historyjo usuńyntych sprowjyń, bez tekstu uopisu',
-'right-browsearchive' => 'Šnupej za wyćepanymi zajtůma',
+'right-browsearchive' => 'Sznupej za wyćepanymi zajtůma',
 'right-undelete' => 'Wćepej nazod wyćepano zajta',
 'right-suppressrevision' => 'Přyglůndańy i uodtwařańy sprowjyń schrůńůnych před admińistratorami',
 'right-suppressionlog' => 'Pokož prywatne lůgi',
index 05c0b60..6a1cd1d 100644 (file)
@@ -97,7 +97,6 @@ $messages = array(
 'tog-numberheadings' => 'தலைப்புகளுக்கு தானியங்கி இலக்கமிடு',
 'tog-showtoolbar' => 'கருவிப்பட்டையைக் காட்டு',
 'tog-editondblclick' => 'இரட்டைச் சொடுக்கில் பக்கங்களைத் தொகு',
-'tog-editsection' => '(தொகு) இணைப்புகளின் வழியாக பிரிவுத் தொகுத்தலை செயலாக்கவும்',
 'tog-editsectiononrightclick' => 'பிரிவுத் தலைப்பின் மீது வலச் சொடுக்குவதன் மூலம் பகுதித்  தொகுப்பை செயலாக்கவும்',
 'tog-showtoc' => 'பொருளடக்க பட்டியலைக் காண்பி (மூன்றுக்கு மேற்பட்ட தலைப்புகளையுடைய கட்டுரைகளுக்கு)',
 'tog-rememberpassword' => 'எனது புகுபதிகை பற்றிய விவரங்களை இவ்வுலாவியில் (மிக அதிகமாக $1 {{PLURAL:$1|நாள்|நாட்கள்}}) வரை நினைவில் வைத்திருக்கவும்.',
index 1d5bc72..daf7eb6 100644 (file)
@@ -153,7 +153,6 @@ $messages = array(
 'tog-numberheadings' => 'శీర్షికలకు అప్రమేయంగా వరుస సంఖ్యలు చేర్చు',
 'tog-showtoolbar' => 'దిద్దుబాటు పనిముట్ల పట్టీని చూపించు',
 'tog-editondblclick' => 'డబుల్‌ క్లిక్కు చేసినప్పుడు పేజీని మార్చు',
-'tog-editsection' => '[మార్చు] లింకు ద్వారా విభాగం మార్పు చేతనం',
 'tog-editsectiononrightclick' => 'విభాగాల శీర్షికల మీద కుడినొక్కుతో విభాగపు దిద్దుబాటును చేతనంచేయి',
 'tog-showtoc' => 'విషయసూచిక చూపించు (3 కంటే ఎక్కువ శీర్షికలున్న పేజీలకు)',
 'tog-rememberpassword' => 'ఈ విహారిణిలో నా ప్రవేశాన్ని గుర్తుంచుకో (గరిష్ఠంగా $1 {{PLURAL:$1|రోజు|రోజుల}}కి)',
@@ -438,6 +437,7 @@ $1',
 'site-atom-feed' => '$1 ఆటమ్ ఫీడు',
 'page-rss-feed' => '"$1" ఆరెసెస్సు(RSS) ఫీడు',
 'page-atom-feed' => '"$1" ఆటమ్ ఫీడు',
+'feed-atom' => 'యాటమ్',
 'red-link-title' => '$1 (పుట లేదు)',
 'sort-descending' => 'అవరోహణ క్రమంలో అమర్చు',
 'sort-ascending' => 'ఆరోహణ క్రమంలో అమర్చు',
@@ -1498,6 +1498,8 @@ $1",
 'recentchanges-label-minor' => 'ఇది ఒక చిన్న మార్పు',
 'recentchanges-label-bot' => 'ఈ మార్పును ఒక బాటు చేసింది',
 'recentchanges-label-unpatrolled' => 'ఈ దిద్దుబాటు మీద నిఘా లేదు',
+'recentchanges-label-plusminus' => 'ఈ పేజి పరిమాణంలో  జరిగిన మార్పుల  బైట్ల సంఖ్య',
+'recentchanges-legend-heading' => "'''సూచిక :'''",
 'recentchanges-legend-newpage' => '([[Special:NewPages|కొత్త పేజీల జాబితా]]ను కూడా చూడండి)',
 'rcnotefrom' => '<b>$2</b> నుండి జరిగిన మార్పులు (<b>$1</b> వరకు చూపబడ్డాయి).',
 'rclistfrom' => '$1 నుండి జరిగిన మార్పులను చూపించు',
@@ -2030,7 +2032,8 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization చూడండి.',
 'listgrouprights' => 'వాడుకరి గుంపుల హక్కులు',
 'listgrouprights-summary' => 'కింది జాబితాలో ఈ వికీలో నిర్వచించిన వాడుకరి గుంపులు, వాటికి సంబంధించిన హక్కులు ఉన్నాయి.
 విడివిడిగా హక్కులకు సంబంధించిన మరింత సమాచారం [[{{MediaWiki:Listgrouprights-helppage}}]] వద్ద లభించవచ్చు.',
-'listgrouprights-key' => '* <span class="listgrouprights-granted">ప్రసాదించిన హక్కు</span>
+'listgrouprights-key' => 'సూచిక:
+* <span class="listgrouprights-granted">ప్రసాదించిన హక్కు</span>
 * <span class="listgrouprights-revoked">వెనక్కి తీసుకున్న హక్కు</span>',
 'listgrouprights-group' => 'గుంపు',
 'listgrouprights-rights' => 'హక్కులు',
@@ -3503,6 +3506,7 @@ $5
 
 # Special:SpecialPages
 'specialpages' => 'ప్రత్యేక పేజీలు',
+'specialpages-note-top' => 'సూచిక',
 'specialpages-note' => '* మామూలు ప్రత్యేక పుటలు.
 * <strong class="mw-specialpagerestricted">నియంత్రిత ప్రత్యేక పుటలు.</strong>
 * <span class="mw-specialpagecached">Cached ప్రత్యేక పుటలు (పాతబడి ఉండొచ్చు).</span>',
index 25ed1cc..6571f09 100644 (file)
@@ -206,7 +206,6 @@ $messages = array(
 'tog-numberheadings' => 'ใส่เลขหัวข้อในสารบัญอัตโนมัติ',
 'tog-showtoolbar' => 'แสดงแถบเครื่องมือแก้ไข',
 'tog-editondblclick' => 'แก้ไขหน้าเมื่อดับเบิลคลิก',
-'tog-editsection' => 'เปิดการแก้ไขเฉพาะส่วนผ่านลิงก์ [แก้ไข]',
 'tog-editsectiononrightclick' => 'เปิดใช้งานการแก้ไขเฉพาะส่วนโดยคลิกขวาที่หัวข้อ',
 'tog-showtoc' => 'แสดงสารบัญ (สำหรับหน้าที่มีมากกว่า 3 หัวข้อ)',
 'tog-rememberpassword' => 'จำการล็อกอินของฉันในเบราว์เซอร์นี้ (สูงสุด $1 วัน)',
@@ -220,7 +219,7 @@ $messages = array(
 'tog-enotifwatchlistpages' => 'อีเมลหาเมื่อหน้าหรือไฟล์ในรายการเฝ้าดูมีการเปลี่ยนแปลง',
 'tog-enotifusertalkpages' => 'อีเมลหาเมื่อหน้าคุยกับผู้ใช้ของฉันมีการเปลี่ยนแปลง',
 'tog-enotifminoredits' => 'อีเมลหาเช่นกันสำหรับการแก้ไขหน้าและไฟล์เล็กน้อย',
-'tog-enotifrevealaddr' => 'à¹\80à¸\9bิà¸\94à¹\80à¸\9cยà¸\97ีà¹\88อยูà¹\88อีà¹\80มลà¹\8cà¸\82อà¸\87à¸\89ัà¸\99à¹\83à¸\99อีà¹\80มลà¹\8cแจ้งเตือน',
+'tog-enotifrevealaddr' => 'à¹\80à¸\9bิà¸\94à¹\80à¸\9cยà¸\97ีà¹\88อยูà¹\88อีà¹\80มลà¸\82อà¸\87à¸\89ัà¸\99à¹\83à¸\99อีà¹\80มลแจ้งเตือน',
 'tog-shownumberswatching' => 'แสดงจำนวนผู้ใช้ที่เฝ้าดู',
 'tog-oldsig' => 'ลายเซ็นที่ใช้อยู่:',
 'tog-fancysig' => 'ใช้คำสั่งวิกิที่ปรากฏในลายเซ็นนี้ (โดยไม่มีลิงก์อัตโนมัติ)',
@@ -326,7 +325,7 @@ $messages = array(
 'category-subcat-count' => '{{PLURAL:$2|หมวดหมู่นี้มีหมวดหมู่ย่อยเพียงหมวดหมู่เดียว|หมวดหมู่นี้มี {{PLURAL:$1|หมวดหมู่ย่อย|$1 หมวดหมู่ย่อย}} จากทั้งหมด $2 หมวดหมู่}}',
 'category-subcat-count-limited' => 'หมวดหมู่นี้มี $1 หมวดหมู่ย่อย',
 'category-article-count' => '{{PLURAL:$2|หมวดหมู่นี้มีอยู่เพียงหน้าเดียว|ในหมวดหมู่นี้มี {{PLURAL:$1|หน้าเดียว|$1 หน้า}} จากทั้งหมด $2 หน้า}}',
-'category-article-count-limited' => '$1 หน้าต่อไปนี้อยู่ในหมวดหมู่นี้',
+'category-article-count-limited' => 'มี $1 หน้าในหมวดหมู่นี้',
 'category-file-count' => '{{PLURAL:$2|หมวดหมู่นี้มีเพียงไฟล์เดียว|ในหมวดหมู่นี้มี $1 ไฟล์ จากทั้งหมด $2 ไฟล์}}',
 'category-file-count-limited' => '{{PLURAL:$1|ไฟล์|ไฟล์}}ต่อไปนี้อยู่ในหมวดหมู่นี้',
 'listingcontinuesabbrev' => 'ต่อ',
@@ -352,8 +351,8 @@ $messages = array(
 'qbedit' => 'แก้ไข',
 'qbpageoptions' => 'หน้านี้',
 'qbmyoptions' => 'หน้าของฉัน',
-'faq' => 'à¸\84ำà¸\96ามà¸\96ามบ่อย',
-'faqpage' => 'Project:à¸\84ำà¸\96ามà¸\96ามบ่อย',
+'faq' => 'à¸\84ำà¸\96ามà¸\9eà¸\9aบ่อย',
+'faqpage' => 'Project:à¸\84ำà¸\96ามà¸\9eà¸\9aบ่อย',
 
 # Vector skin
 'vector-action-addsection' => 'เพิ่มหัวข้อใหม่',
@@ -374,7 +373,7 @@ $messages = array(
 
 'navigation-heading' => 'รายการเลือกป้ายบอกทาง',
 'errorpagetitle' => 'มีข้อผิดพลาด',
-'returnto' => 'กลับไป $1',
+'returnto' => 'กลับไปที่ $1',
 'tagline' => 'จาก {{SITENAME}}',
 'help' => 'คำอธิบาย',
 'search' => 'ค้นหา',
@@ -447,7 +446,7 @@ $1',
 'currentevents-url' => 'Project:เหตุการณ์ปัจจุบัน',
 'disclaimers' => 'ข้อปฏิเสธความรับผิดชอบ',
 'disclaimerpage' => 'Project:ข้อปฏิเสธความรับผิดชอบทั่วไป',
-'edithelp' => 'à¸\84ำอà¸\98ิà¸\9aายà¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82',
+'edithelp' => 'วิà¸\98ีà¹\81à¸\81à¹\89à¹\84à¸\82หà¸\99à¹\89า',
 'helppage' => 'Help:สารบัญ',
 'mainpage' => 'หน้าหลัก',
 'mainpage-description' => 'หน้าหลัก',
@@ -465,7 +464,7 @@ $1',
 'versionrequiredtext' => 'การใช้หน้านี้ต้องการมีเดียวิกิรุ่น $1  ดู[[Special:Version|หน้ารุ่น]]',
 
 'ok' => 'ตกลง',
-'retrievedfrom' => 'รัà¸\9aข้อมูลจาก "$1"',
+'retrievedfrom' => 'à¸\94ึà¸\87ข้อมูลจาก "$1"',
 'youhavenewmessages' => 'คุณมี$1 ($2)',
 'youhavenewmessagesfromusers' => 'คุณมี $1จาก{{PLURAL:$3|ผู้ใช้คนอื่น|ผู้ใช้ $3 คน}} ($2)',
 'youhavenewmessagesmanyusers' => 'คุณมี $1จากผู้ใช้หลายคน ($2)',
@@ -520,8 +519,8 @@ $1',
 รายการหน้าพิเศษที่ถูกต้องดูได้ที่ [[Special:SpecialPages|รายการหน้าพิเศษ]]',
 
 # General errors
-'error' => 'à¸\82à¹\89อà¸\9cิà¸\94à¸\9eลาà¸\94',
-'databaseerror' => 'à¸\84วามà¸\9cิà¸\94à¸\9eลาà¸\94à¸\97ีà¹\88à¸\90าà¸\99à¸\82à¹\89อมูล',
+'error' => 'ผิดพลาด',
+'databaseerror' => 'ผิดพลาดที่ฐานข้อมูล',
 'laggedslavemode' => "'''คำเตือน:''' ข้อมูลในหน้าอาจไม่ใช่ข้อมูลล่าสุด",
 'readonly' => 'ฐานข้อมูลถูกล็อก',
 'enterlockreason' => 'ใส่เหตุแห่งการล็อก ทั้งเวลาที่คาดว่าจะปลดล็อก',
@@ -565,7 +564,7 @@ $1',
 'actionthrottled' => 'การกระทำนี้ถูกระงับไว้ชั่วคราว',
 'actionthrottledtext' => 'เพื่อเป็นมาตรการป้องกันสแปม คุณจึงถูกจำกัดมิให้กระทำสิ่งนี้ไม่ให้ติดต่อกันหลายครั้งเกินไปในช่วงระยะเวลาสั้น ๆ ซึ่งขณะนี้คุณได้กระทำเกินขีดจำกัดแล้ว กรุณารอสักครู่แล้วลองอีกครั้ง',
 'protectedpagetext' => 'หน้านี้ถูกป้องกันมิให้แก้ไขหรือปฏิบัติการอื่น',
-'viewsourcetext' => 'à¸\84ุà¸\93สามารà¸\96à¸\94ูà¹\81ละà¸\84ัà¸\94ลอà¸\81à¹\82à¸\84à¹\89à¸\94หà¸\99à¹\89าà¸\99ีà¹\89à¹\84à¸\94้:',
+'viewsourcetext' => 'à¸\84ุà¸\93สามารà¸\96à¸\94ูà¹\81ละà¸\84ัà¸\94ลอà¸\81à¹\82à¸\84à¹\89à¸\94à¸\82อà¸\87หà¸\99à¹\89าà¸\99ี้:',
 'viewyourtext' => "คุณสามารถดูและคัดลอกต้นฉบับ'''การแก้ไขของคุณ'''ในหน้านี้ได้",
 'protectedinterface' => 'หน้านี้เป็นข้อความอินเตอร์เฟซสำหรับซอฟต์แวร์บนวิกินี้ และถูกป้องกันเพื่อมิให้มีการกระทำผิด
 ในการเพิ่มหรือเปลี่ยนแปลงการแปลสำหรับทุกวิกิ โปรดใช้ [//translatewiki.net/ translatewiki.net] โครงการแปลมีเดียวิกิเป็นภาษาถิ่น',
@@ -709,8 +708,8 @@ $1',
 โปรดใส่ที่อยู่ให้มีรูปแบบถูกต้อง หรือเว้นช่องนั้น',
 'cannotchangeemail' => 'ไม่สามารถเปลี่ยนที่อยู่อีเมลบนวิกินี้',
 'emaildisabled' => 'เว็บไซต์นี้ไม่สามารถส่งอีเมล',
-'accountcreated' => 'à¸\9aัà¸\8dà¸\8aีà¸\96ูà¸\81สรà¹\89าà¸\87à¸\82ึà¹\89à¸\99',
-'accountcreatedtext' => 'à¸\9aัà¸\8dà¸\8aีà¸\9cูà¹\89à¹\83à¸\8aà¹\89สำหรัà¸\9a [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|à¸\9eูà¸\94à¸\84ุย]]) à¸\96ูà¸\81สร้างขึ้นแล้ว',
+'accountcreated' => 'สรà¹\89าà¸\87à¸\9aัà¸\8dà¸\8aีà¹\81ลà¹\89ว',
+'accountcreatedtext' => 'à¸\9aัà¸\8dà¸\8aีà¸\9cูà¹\89à¹\83à¸\8aà¹\89สำหรัà¸\9a [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|à¸\9eูà¸\94à¸\84ุย]]) à¹\84à¸\94à¹\89สร้างขึ้นแล้ว',
 'createaccount-title' => 'สร้างบัญชีสำหรับ {{SITENAME}}',
 'createaccount-text' => 'มีบางคนสร้างบัญชีโดยใช้ที่อยู่อีเมลของคุณบน {{SITENAME}} ($4) โดยใช้ชื่อ "$2" และรหัสผ่าน "$3" คุณควรล็อกอินเพื่อเปลี่ยนรหัสผ่านทันที
 
@@ -810,7 +809,7 @@ $2
 'italic_sample' => 'ข้อความตัวเอน',
 'italic_tip' => 'ทำตัวเอน',
 'link_sample' => 'ลิงก์เชื่อมโยง',
-'link_tip' => 'ลิงก์ภายในเว็บ',
+'link_tip' => 'ลิงก์ภายใน',
 'extlink_sample' => 'http://www.example.com ชื่อเรื่องของลิงก์',
 'extlink_tip' => 'ลิงก์ภายนอก (อย่าลืมใส่ http:// นำหน้าเสมอ)',
 'headline_sample' => 'ข้อความพาดหัว',
@@ -1044,7 +1043,7 @@ $2
 'viewpagelogs' => 'ดูปูมของหน้านี้',
 'nohistory' => 'ไม่มีประวัติการแก้ไขสำหรับหน้านี้',
 'currentrev' => 'รุ่นปัจจุบัน',
-'currentrev-asof' => 'รุ่นปัจจุบันของ $1',
+'currentrev-asof' => 'รุ่นปัจจุบัน เมื่อ $1',
 'revisionasof' => 'รุ่นเมื่อ $1',
 'revision-info' => 'รุ่นเมื่อ $1 โดย $2',
 'previousrevision' => '←รุ่นก่อนหน้า',
@@ -1208,7 +1207,7 @@ $1",
 'editundo' => 'ย้อน',
 'diff-empty' => '(ไม่แตกต่าง)',
 'diff-multi' => '(มิได้แสดง $1 รุ่นระหว่างกลางโดย{{PLURAL:$2|ผู้ใช้คนหนึ่ง|ผู้ใช้ $2 คน}})',
-'diff-multi-manyusers' => '(มิได้แสดง $1 รุ่นระหว่างกลางโดยผู้ใช้กว่า $2 คน)',
+'diff-multi-manyusers' => 'การแก้ไข $1 รายการระหว่างกลางโดยผู้ใช้มากกว่า $2 คนไม่แสดงผล)',
 'difference-missing-revision' => 'ไม่พบรุ่น{{PLURAL:$2|รุ่น| $2 รุ่น}}ของผลต่างนี้ ($1)
 
 โดยปกติเกิดจากการเข้าลิงก์ผลต่างของหน้าที่ถูกลบไปแล้ว 
@@ -1364,7 +1363,7 @@ $1",
 'prefs-info' => 'ข้อมูลเบื้องต้น',
 'prefs-i18n' => 'สากลวิวัตน์',
 'prefs-signature' => 'ลายเซ็น',
-'prefs-dateformat' => 'รูปแบบวันที่',
+'prefs-dateformat' => 'รูปแบบวันที่และเวลา',
 'prefs-timeoffset' => 'ส่วนต่างเวลา',
 'prefs-advancedediting' => 'ตัวเลือกทั่วไป',
 'prefs-preview' => 'การแสดงตัวอย่าง',
@@ -1555,7 +1554,7 @@ $1",
 'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|ตั้งแต่การเข้าชมล่าสุด}}',
 'enhancedrc-history' => 'ประวัติ',
 'recentchanges' => 'ปรับปรุงล่าสุด',
-'recentchanges-legend' => 'ตัวเลือกปรับปรุงล่าสุด',
+'recentchanges-legend' => 'à¸\95ัวà¹\80ลือà¸\81à¸\81ารà¸\9bรัà¸\9aà¸\9bรุà¸\87ลà¹\88าสุà¸\94',
 'recentchanges-summary' => 'ในหน้านี้เป็นรายการการปรับปรุงล่าสุดบนวิกินี้',
 'recentchanges-noresult' => 'ไม่มีการเปลี่ยนแปลงในช่วงที่กำหนดซึ่งตรงกับเกณฑ์เหล่านี้',
 'recentchanges-feed-description' => 'ติดตามการปรับปรุงล่าสุดในวิกินี้ในฟีดนี้',
@@ -1989,7 +1988,7 @@ $1',
 'nimagelinks' => 'ใช้ใน $1 {{PLURAL:$1|หน้า|หน้า}}',
 'ntransclusions' => 'ใช้ใน $1 {{PLURAL:$1|หน้า|หน้า}}',
 'specialpage-empty' => 'ไม่มีผลลัพธ์รายงานนี้',
-'lonelypages' => 'หà¸\99à¹\89าสุà¸\94à¸\97าง',
+'lonelypages' => 'หà¸\99à¹\89าà¸\97ีà¹\88à¹\82ยà¸\87à¹\84à¸\9bà¹\84มà¹\88à¸\96ึง',
 'lonelypagestext' => 'หน้าต่อไปนี้ไม่มีการเชื่อมโยงหรือถูกรวมไว้ในหน้าอื่นใน {{SITENAME}}',
 'uncategorizedpages' => 'หน้าที่ไม่ได้จัดหมวดหมู่',
 'uncategorizedcategories' => 'หมวดหมู่ที่ไม่ได้จัดหมวดหมู่',
@@ -2009,7 +2008,7 @@ $1',
 'mostlinkedcategories' => 'หมวดหมู่ที่มีการเชื่อมโยงหามากที่สุด',
 'mostlinkedtemplates' => 'แม่แบบที่มีการเชื่อมโยงหามากที่สุด',
 'mostcategories' => 'หน้าที่มีหมวดหมู่มากที่สุด',
-'mostimages' => 'ภาà¸\9eà¸\97ีà¹\88มีà¸\81ารà¹\80à¸\8aืà¹\88อมà¹\82ยà¸\87หามากที่สุด',
+'mostimages' => 'ภาà¸\9eà¸\97ีà¹\88มีà¸\81ารà¹\82ยà¸\87à¹\84à¸\9bหามากที่สุด',
 'mostinterwikis' => 'หน้าที่มีลิงก์ข้ามโครงการมากที่สุด',
 'mostrevisions' => 'หน้าที่มีรุ่นมากที่สุด',
 'prefixindex' => 'ทุกหน้าพร้อมคำขึ้นต้น',
@@ -2068,8 +2067,8 @@ $1',
 # Special:AllPages
 'allpages' => 'หน้าทั้งหมด',
 'alphaindexline' => '$1 ถึง $2',
-'nextpage' => 'ถัดไป ($1)',
-'prevpage' => 'ก่อนหน้า ($1)',
+'nextpage' => 'หà¸\99à¹\89าà¸\96ัà¸\94à¹\84à¸\9b ($1)',
+'prevpage' => 'หà¸\99à¹\89าà¸\81à¹\88อà¸\99หà¸\99à¹\89า ($1)',
 'allpagesfrom' => 'แสดงหน้าโดยเริ่มจาก:',
 'allpagesto' => 'แสดงหน้าจบที่:',
 'allarticles' => 'ทุกหน้า',
@@ -2188,7 +2187,7 @@ $1',
 'watchlistfor2' => 'สำหรับ $1 $2',
 'nowatchlist' => 'ไม่มีรายการในรายการเฝ้าดูของคุณ',
 'watchlistanontext' => 'กรุณา$1เพื่อดูหรือแก้ไขรายการในรายการเฝ้าดูของคุณ',
-'watchnologin' => 'ไม่ได้ล็อกอิน',
+'watchnologin' => 'ยัà¸\87à¹\84มà¹\88à¹\84à¸\94à¹\89ลà¹\87อà¸\81อิà¸\99',
 'watchnologintext' => 'ต้อง[[Special:UserLogin|ล็อกอิน]]เพื่อแก้ไขรายการเฝ้าดูของคุณ',
 'addwatch' => 'เพิ่มเข้ารายการเฝ้าดู',
 'addedwatchtext' => 'หน้า "[[:$1]]" ได้เพิ่มลงใน[[Special:Watchlist|รายการเฝ้าดู]]ของคุณแล้ว การเปลี่ยนแปลงในหน้านี้หรือหน้าพูดคุยที่เกี่ยวข้องจะแสดงในรายการดังกล่าว',
@@ -2308,7 +2307,7 @@ $UNWATCHURL
 'editcomment' => "คำอธิบายอย่างย่อคือ: \"''\$1''\"",
 'revertpage' => 'ย้อนการแก้ไขของ [[Special:Contributions/$2|$2]] ([[User talk:$2|Talk]]) ไปยังรุ่นของ [[User:$1|$1]]',
 'revertpage-nouser' => 'ย้อนการแก้ไขโดยผู้ใช้ไม่ระบุชื่อไปยังรุ่นสุดท้ายโดย {{GENDER:$1|[[User:$1|$1]]}}',
-'rollback-success' => 'ยà¹\89อà¸\99รุà¹\88à¸\99à¸\97ีà¹\88แก้ไขโดย $1 ไปยังรุ่นล่าสุดโดย $2',
+'rollback-success' => 'ยà¹\89อà¸\99à¸\81ารแก้ไขโดย $1 ไปยังรุ่นล่าสุดโดย $2',
 
 # Edit tokens
 'sessionfailure-title' => 'ช่วงเวลาสื่อสารล้มเหลว',
@@ -2409,7 +2408,7 @@ $UNWATCHURL
 'undeleteviewlink' => 'ดู',
 'undeleteinvert' => 'กลับการเลือก',
 'undeletecomment' => 'เหตุผล:',
-'undeletedrevisions' => '$1 รุ่นการแก้ไขถูกกู้คืน',
+'undeletedrevisions' => 'กู้คืนการแก้ไข $1 รุ่นแล้ว',
 'undeletedrevisions-files' => '$1 รุ่น และ $2 ไฟล์ถูกกู้คืน',
 'undeletedfiles' => '$1 ไฟล์ถูกกู้คืน',
 'cannotundelete' => 'การกู้คืนล้มเหลว:
@@ -2445,7 +2444,7 @@ $1',
 'blanknamespace' => '(หลัก)',
 
 # Contributions
-'contributions' => 'à¹\80รืà¹\88อà¸\87à¸\97ีà¹\88à¹\80à¸\82ียà¸\99à¹\82à¸\94ย{{GENDER:$1|à¸\9cูà¹\89à¹\83à¸\8aà¹\89}}à¸\99ีà¹\89',
+'contributions' => 'à¹\80รืà¹\88อà¸\87à¸\97ีà¹\88à¸\9cูà¹\89à¹\83à¸\8aà¹\89รายà¸\99ีà¹\89à¹\80à¸\82ียà¸\99',
 'contributions-title' => 'เรื่องที่เขียนโดย $1',
 'mycontris' => 'เรื่องที่เขียน',
 'contribsub2' => 'สำหรับ {{GENDER:$3|$1}} ($2)',
@@ -2593,7 +2592,7 @@ $1',
 'ipb_expiry_invalid' => 'วันหมดอายุไม่ถูกต้อง',
 'ipb_expiry_temp' => 'การบล็อกชื่อผู้ใช้ที่ซ่อนต้องเป็นการบล็อกถาวร',
 'ipb_hide_invalid' => 'ไม่สามารถยับยั้งชื่อผู้ใช้นี้ได้ อาจเพราะมีการแก้ไขมากเกินไป',
-'ipb_already_blocked' => '"$1" ถูกบล็อกแล้วก่อนหน้านี้',
+'ipb_already_blocked' => '"$1" à¸\96ูà¸\81à¸\9aลà¹\87อà¸\81à¹\84à¸\9bà¹\81ลà¹\89วà¸\81à¹\88อà¸\99หà¸\99à¹\89าà¸\99ีà¹\89',
 'ipb-needreblock' => '$1 ถูกบล็อกแล้ว คุณต้องการเปลี่ยนการตั้งค่าหรือไม่',
 'ipb-otherblocks-header' => '{{PLURAL:$1|การบล็อก}}อื่น ๆ',
 'unblock-hideuser' => 'คุณไม่สามารถยกเลิกการบล็อกผู้ใช้งานรายนี้ได้ เพราะชื่อผู้ใช้ถูกซ่อนอยู่',
@@ -2602,7 +2601,7 @@ $1',
 อย่างไรก็ตาม ไอพีนี้ถูกระงับในฐานะที่เป็นส่วนหนึ่งของเลขที่อยู่ไอพีในพิสัย $2 ซึ่งสามารถปลดบล็อกได้',
 'ip_range_invalid' => 'พิสัยไอพีไม่ถูกต้อง',
 'ip_range_toolarge' => 'พิสัยบล็อกที่มีขนาดใหญ่กว่า /$1 จะไม่ได้รับอนุญาต',
-'proxyblocker' => 'บล็อกพร็อกซี',
+'proxyblocker' => 'à¸\95ัวà¸\9aลà¹\87อà¸\81à¸\9eรà¹\87อà¸\81à¸\8bี',
 'proxyblockreason' => 'เลขที่อยู่ไอพีของคุณถูกบล็อกเนื่องจากเป็นพร็อกซีเปิด กรุณาติดต่อผู้ให้บริการอินเทอร์เน็ตหรือฝ่ายสนับสนุนเทคนิคขององค์การคุณ และแจ้งให้พวกเขาทราบถึงปัญหาความปลอดภัยร้ายแรงนี้',
 'sorbsreason' => 'เลขที่อยู่ไอพีของคุณอยู่ในพร็อกซีเปิดในส่วน DNSBL ที่ {{SITENAME}} ใช้',
 'sorbs_create_account_reason' => 'เลขที่อยู่ไอพีของคุณอยู่ในพร็อกซีเปิดในส่วน DNSBL ที่ {{SITENAME}} ใช้ 
@@ -2695,8 +2694,8 @@ $1',
 'delete_and_move_text' => '== ต้องการลบ ==
 
 มีหน้าปลายทาง "[[:$1]]" แล้ว คุณต้องการลบหน้านั้นหรือไม่เพื่อดำเนินการต่อ',
-'delete_and_move_confirm' => 'à¹\83à¸\8aà¹\88 à¸¥à¸\9aหà¸\99à¹\89าà¸\99ัà¹\89à¸\99',
-'delete_and_move_reason' => 'à¸\96ูà¸\81ลà¸\9aà¹\80à¸\9eืà¹\88อà¹\80à¸\9bิà¸\94à¸\8aà¹\88อà¸\87à¹\81à¸\81à¹\88à¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¸\8aืà¹\88อจาก "[[$1]]"',
+'delete_and_move_confirm' => 'à¹\83à¸\8aà¹\88 à¸\95à¹\89อà¸\87à¸\81ารà¸\88ะลà¸\9aà¹\81ละยà¹\89าย',
+'delete_and_move_reason' => 'ลà¸\9aà¹\80à¸\9eืà¹\88อสรà¹\89าà¸\87หà¸\99à¸\97าà¸\87à¸\97ีà¹\88à¸\88ะยà¹\89ายจาก "[[$1]]"',
 'selfmove' => 'ชื่อหน้าต้นทางและปลายทางเป็นชื่อเดียวกัน ไม่สามารถเปลี่ยนชื่อได้มาใช้ชื่อเดิมได้',
 'immobile-source-namespace' => 'ไม่สามารถเปลี่ยนชื่อหน้าในเนมสเปซ "$1"',
 'immobile-target-namespace' => 'ไม่สามารถย้ายหน้าไปยังเนมสเปซ "$1" ได้',
@@ -3176,15 +3175,15 @@ $1',
 'exif-focallength-format' => '$1 มม.',
 'exif-subjectarea' => 'จุดวัตถุ',
 'exif-flashenergy' => 'พลังงานแฟลช',
-'exif-focalplanexresolution' => 'ความละเอียระนาบโฟกัส X',
-'exif-focalplaneyresolution' => 'ความละเอียระนาบโฟกัส Y',
+'exif-focalplanexresolution' => 'à¸\84วามละà¹\80อียà¸\94ระà¸\99าà¸\9aà¹\82à¸\9fà¸\81ัส X',
+'exif-focalplaneyresolution' => 'à¸\84วามละà¹\80อียà¸\94ระà¸\99าà¸\9aà¹\82à¸\9fà¸\81ัส Y',
 'exif-focalplaneresolutionunit' => 'หน่วยความละเอียดระนาบโฟกัส',
 'exif-subjectlocation' => 'ตำแหน่งวัตถุ',
 'exif-exposureindex' => 'ดัชนีเอกซ์โพเชอร์',
 'exif-sensingmethod' => 'วิถีการวัด',
 'exif-filesource' => 'ต้นฉบับไฟล์',
 'exif-scenetype' => 'ชนิดซีน',
-'exif-customrendered' => 'à¸\81ารà¸\9bระมวà¸\93ภาพ',
+'exif-customrendered' => 'à¸\81ารà¸\9bระมวลภาพ',
 'exif-exposuremode' => 'โหมดเอกซ์โพเชอร์',
 'exif-whitebalance' => 'ไวต์บาลานซ์',
 'exif-digitalzoomratio' => 'อัตราซูมดิจิทัล',
@@ -3244,13 +3243,13 @@ $1',
 'exif-unknowndate' => 'ไม่ทราบวัน',
 
 'exif-orientation-1' => 'ปกติ',
-'exif-orientation-2' => 'à¸\96ูà¸\81สลัà¸\9aแนวนอน',
-'exif-orientation-3' => 'à¸\96ูà¸\81หมุà¸\99 180°',
-'exif-orientation-4' => 'à¸\96ูà¸\81สลัà¸\9aแนวตั้ง',
-'exif-orientation-5' => 'à¸\96ูà¸\81หมุà¸\99 90° à¸\97วà¸\99à¹\80à¸\82à¹\87มà¸\99าฬิà¸\81า à¹\81ละà¸\96ูà¸\81สลัà¸\9aแนวตั้ง',
-'exif-orientation-6' => 'à¸\96ูà¸\81หมุà¸\99 90° à¸\97วà¸\99à¹\80à¸\82à¹\87มà¸\99าฬิà¸\81า',
-'exif-orientation-7' => 'à¸\96ูà¸\81หมุà¸\99 90° à¸\95ามà¹\80à¸\82à¹\87มà¸\99าฬิà¸\81า à¹\81ละà¸\96ูà¸\81สลัà¸\9aแนวตั้ง',
-'exif-orientation-8' => 'à¸\96ูà¸\81หมุà¸\99 90° à¸\95ามà¹\80à¸\82à¹\87มà¸\99าฬิà¸\81า',
+'exif-orientation-2' => 'à¸\9eลิà¸\81แนวนอน',
+'exif-orientation-3' => 'หมุน 180°',
+'exif-orientation-4' => 'à¸\9eลิà¸\81แนวตั้ง',
+'exif-orientation-5' => 'หมุà¸\99 90° à¸\97วà¸\99à¹\80à¸\82à¹\87มà¸\99าฬิà¸\81าà¹\81ละà¸\9eลิà¸\81แนวตั้ง',
+'exif-orientation-6' => 'หมุน 90° ทวนเข็มนาฬิกา',
+'exif-orientation-7' => 'หมุà¸\99 90° à¸\95ามà¹\80à¸\82à¹\87มà¸\99าฬิà¸\81าà¹\81ละà¸\9eลิà¸\81แนวตั้ง',
+'exif-orientation-8' => 'หมุน 90° ตามเข็มนาฬิกา',
 
 'exif-planarconfiguration-1' => 'รูปแบบชังกี',
 'exif-planarconfiguration-2' => 'รูปแบบเพลนาร์',
@@ -3544,8 +3543,8 @@ $5
 'bitrate-yottabits' => '$1 ยอตตะบิตต่อวินาที',
 
 # Live preview
-'livepreview-loading' => 'à¸\81ำลัà¸\87à¹\82หลà¸\94…',
-'livepreview-ready' => 'à¸\81ำลัà¸\87à¹\82หลà¸\94… เสร็จ!',
+'livepreview-loading' => 'à¸\81ำลัà¸\87à¸\84à¹\89à¸\99หา…',
+'livepreview-ready' => 'à¸\81ำลัà¸\87à¸\84à¹\89à¸\99หา… เสร็จ!',
 'livepreview-failed' => 'แสดงตัวอย่างทันทีไม่ได้ ให้ลองใช้การแสดงตัวอย่างแบบธรรมดา',
 'livepreview-error' => 'เชื่อมต่อไม่ได้: $1 "$2" ให้ลองใช้แสดงตัวอย่างแบบธรรมดา',
 
@@ -3569,7 +3568,7 @@ $5
 เมื่อเสร็จแล้ว ให้กด "{{int:Watchlistedit-raw-submit}}" 
 ซึ่งอาจแก้ไขผ่าน [[Special:EditWatchlist|โปรแกรมแก้ไขข้อความทั่วไป]]',
 'watchlistedit-raw-titles' => 'ชื่อเรื่อง:',
-'watchlistedit-raw-submit' => 'ปรับรายการเฝ้าดู',
+'watchlistedit-raw-submit' => 'à¸\9bรัà¸\9aà¸\9bรุà¸\87รายà¸\81ารà¹\80à¸\9dà¹\89าà¸\94ู',
 'watchlistedit-raw-done' => 'รายการเฝ้าดูของคุณได้ปรับแล้ว',
 'watchlistedit-raw-added' => '$1 ชื่อเรื่องได้ถูกเพิ่มเข้าไป:',
 'watchlistedit-raw-removed' => '$1 ชื่อเรื่องได้ถูกนำออกไป:',
@@ -3805,7 +3804,9 @@ $5
 'duration-millennia' => '$1 สหัสวรรษ',
 
 # Special:ExpandTemplates
+'expand_templates_output' => 'ผลลัพธ์',
 'expand_templates_ok' => 'ตกลง',
+'expand_templates_remove_comments' => 'นำส่วนความเห็นออก',
 'expand_templates_preview' => 'ตัวอย่างผลแสดง',
 
 );
index 24a11aa..6bda8a7 100644 (file)
@@ -49,7 +49,6 @@ $messages = array(
 'tog-numberheadings' => 'Atlary awtomatik usulda belgile',
 'tog-showtoolbar' => 'Redaktirleme mahalynda gural panelini görkez (JavaScript)',
 'tog-editondblclick' => 'Sahypany jübüt tyklap, redaktirläp başla (JavaScript)',
-'tog-editsection' => 'Her bir bölümde [redaktirle] çykgydyny görkez',
 'tog-editsectiononrightclick' => 'Bölümleri bölümiň adyna sag tyklap redaktirlemäge mümkinçilik döret (JavaScript)',
 'tog-showtoc' => 'Mazmun tablisasyny görkez (3 sanydan köp ady bar bolan sahypalar üçin)',
 'tog-rememberpassword' => 'Sessiýamy şu brauzerde ýatda sakla  (iň köp $1 {{PLURAL:$1|günläp|günläp}})',
index 997680c..7d21181 100644 (file)
@@ -8,6 +8,7 @@
  * @file
  *
  * @author AnakngAraw
+ * @author Aze
  * @author Dosmiin Barsbold
  * @author Felipe Aira
  * @author Jojit fb
@@ -157,7 +158,6 @@ $messages = array(
 'tog-numberheadings' => 'Automatikong bilangin ang mga pamagat',
 'tog-showtoolbar' => "Ipakita ang ''toolbar'' ng pagbabago (JavaScript)",
 'tog-editondblclick' => 'Magbago ng mga pahina sa dalawahang pagpindot (JavaScript)',
-'tog-editsection' => 'Payagan ang mga pagbabagong panseksyon sa mga [baguhin] na kawing',
 'tog-editsectiononrightclick' => 'Payagan ang mga pagbabagong panseksyon sa pakanang pagpindot ng mga panseksyong pamagat (JavaScript)',
 'tog-showtoc' => 'Ipakita ang talaan ng mga nilalaman (sa mga pahinang may higit sa 3 punong pamagat)',
 'tog-rememberpassword' => 'Tandaan ang paglagda ko sa panghanaphanap na ito (pinakamarami na ang $1 {{PLURAL:$1|araw|mga araw}})',
@@ -561,13 +561,19 @@ Tandaan na may ilang pahinang maaaring magpatuloy na nagpapakitang parang nakala
 'welcomecreation-msg' => 'Nilikha na ang iyong kuwenta.
 Huwag kalimutang baguhin ang iyong [[Special:Preferences|mga kagustuhan sa {{SITENAME}}]].',
 'yourname' => 'Bansag:',
+'userlogin-yourname' => 'Pangngalan',
+'userlogin-yourname-ph' => 'Ilagay ang iyong Pangngalan',
+'createacct-another-username-ph' => 'Ilagay ang Pangngalan',
 'yourpassword' => 'Hudyat:',
 'userlogin-yourpassword' => 'Hudyat',
 'userlogin-yourpassword-ph' => 'Ipasok ang iyong hudyat',
+'createacct-yourpassword-ph' => 'Ilagay ang hudyat',
 'yourpasswordagain' => 'Hudyat mo uli:',
 'createacct-yourpasswordagain' => 'Tiyakin ang hudyat',
+'createacct-yourpasswordagain-ph' => 'Muling ilagay ang hudyat',
 'remembermypassword' => 'Tandaan ang paglagda ko sa kompyuter na ito (pinakamarami na ang $1 {{PLURAL:$1|araw|mga araw}})',
 'userlogin-remembermypassword' => 'Panatilihin akong nakalagda',
+'userlogin-signwithsecure' => 'Gumamit ng wastong koneksyon',
 'yourdomainname' => 'Dominyo mo:',
 'password-change-forbidden' => 'Hindi mo maaaring palitan ang mga hudyat sa wiking ito.',
 'externaldberror' => 'Maaaring may kamalian sa pagpapatotoo ng kalipunan ng mga dato o kaya hindi ka pinahintulutang isapanahon ng iyong panlabas na kuwenta o patnugutan.',
@@ -587,15 +593,23 @@ Huwag kalimutang baguhin ang iyong [[Special:Preferences|mga kagustuhan sa {{SIT
 'gotaccount' => 'May kuwenta ka na ba? $1.',
 'gotaccountlink' => 'Lumagda',
 'userlogin-resetlink' => 'Nakalimutan mo ang iyong mga detalyeng panglagda?',
+'userlogin-resetpassword-link' => 'Nakalimutan ang hudyat?',
+'userlogin-createanother' => 'Lumikha ng isang akawnt',
+'createacct-join' => 'Ilagay ang iyong impormasyon sa baba.',
+'createacct-another-join' => 'Ilagay ang impormasyon ng bagong akawnt sa baba.',
 'createacct-emailrequired' => 'Direksiyong e-liham:',
 'createaccountmail' => 'Gumamit ng pansamantalang walang-piling hudyat at ipadala ito sa direksiyong e-liham na nakasaad sa ibaba',
 'createacct-realname' => 'Tunay na pangalan (maaaring wala)',
 'createaccountreason' => 'Dahilan:',
 'createacct-reason' => 'Dahilan',
+'createacct-reason-ph' => 'Bakit ka gagawa ng isa pang akawnt?',
+'createacct-imgcaptcha-ph' => 'Ilagay ang tekstong makikita sa taas.',
+'createacct-benefit-heading' => '{{SITENAME}} ay linikha ng mga taong tulad mo.',
 'badretype' => 'Hindi magkatugma ang ipinasok mong mga hudyat.',
 'userexists' => 'May gumagamit na ng ipinasok na bansag.
 Pumili po ng ibang pangalan.',
 'loginerror' => 'Kamalian sa paglagda',
+'createacct-error' => 'May pagkakamali sa paglikha ng akawnt',
 'createaccounterror' => 'Hindi mailikha ang kuwenta: $1',
 'nocookiesnew' => "Nalikha ang kuwenta ng tagagamit, ngunit hindi ka nakalagda.
 Gumagamit ang {{SITENAME}} ng mga kuki (''cookies'') upang makalagda ang mga tagagamit.
@@ -624,7 +638,7 @@ Pakisubok muli.',
 'passwordtooshort' => 'Ang mga hudyat ay dapat mayroong {{PLURAL:$1|1 panitik|$1 panitik}} (karakter).',
 'password-name-match' => 'Dapat magkaiba ang hudyat mo sa bansag mo.',
 'password-login-forbidden' => 'Ipinagbabawal ang paggamit ng ganitong pangalan ng tagagamit at hudyat.',
-'mailmypassword' => 'Ipadala sa pamamagitan ng e-liham ang bagong hudyat',
+'mailmypassword' => 'Muling itakda ang hudyat',
 'passwordremindertitle' => 'Bagong pansamantalang hudyat para sa {{SITENAME}}',
 'passwordremindertext' => 'Mayroong (na maaaring ikaw, mula sa adres ng IP na $1) humiling ng isang bagong
 hudyat para sa {{SITENAME}} ($4). Isang pansamantalang hudyat ang nilikha
index 6b6cc4c..64b2f3d 100644 (file)
@@ -54,6 +54,7 @@
  * @author Szoszv
  * @author Tarikozket
  * @author Tarkovsky
+ * @author Trncmvsr
  * @author Universal Life
  * @author Urhixidur
  * @author Uğur Başak
@@ -365,7 +366,6 @@ $messages = array(
 'tog-numberheadings' => 'Başlıkları otomatik numaralandır',
 'tog-showtoolbar' => 'Düzenleme araç çubuğunu göster',
 'tog-editondblclick' => 'Çift tıklayarak sayfaları düzenle',
-'tog-editsection' => 'Bölümleri [{{int:Editsection}}] bağlantıları ile düzenlemeyi etkinleştir',
 'tog-editsectiononrightclick' => 'Bölüm başlığına sağ tıklayarak bölümleri düzenleyebilme olanağı ver',
 'tog-showtoc' => 'İçindekiler tablosunu göster (3 taneden fazla başlığı olan sayfalar için)',
 'tog-rememberpassword' => 'Girişimi bu tarayıcıda hatırla (en fazla $1 {{PLURAL:$1|gün|gün}} için)',
@@ -1180,6 +1180,8 @@ Sayfa zaten mevcut.',
 'content-not-allowed-here' => '"$1" içeriğine, [[$2]] sayfasında izin verilmemekte.',
 'editwarning-warning' => 'Bu sayfadan ayrılmak yaptığınız herhangi bir değişikliği kaybetmenize sebep olabilir.
 Eğer giriş yaptıysanız, bu uyarıyı, tercihlerinizin "Sayfa yazma alanı" bölümünde devre dışı bırakabilirsiniz.',
+'editpage-notsupportedcontentformat-title' => 'İçerik biçimi desteklenmiyor',
+'editpage-notsupportedcontentformat-text' => '$1 içerik biçimi $2 içerik modeli tarafından desteklenmiyor.',
 
 # Content models
 'content-model-wikitext' => 'vikimetin',
@@ -1431,6 +1433,7 @@ Ayrıntılar [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} silme g
 'search-result-score' => 'Uygunluk: $1%',
 'search-redirect' => '($1 sayfasından yönlendirme)',
 'search-section' => '($1 bölümü)',
+'search-file-match' => '(dosya içeriğiyle eşleşiyor)',
 'search-suggest' => 'Bunu mu demek istediniz: $1',
 'search-interwiki-caption' => 'Kardeş projeler',
 'search-interwiki-default' => '$1 sonuçlar:',
@@ -1873,6 +1876,8 @@ Dosyanızı yinede yüklemek istiyorsanız, lütfen geri dönüp yeni bir isim k
 Dosyanızı yinede yüklemek istiyorsanız, lütfen geri gidip yeni bir isim kullanın. [[File:$1|thumb|center|$1]]',
 'file-exists-duplicate' => 'Bu dosya aşağıdaki {{PLURAL:$1|dosyanın|dosyaların}} kopyasıdır:',
 'file-deleted-duplicate' => 'Bu dosyanın özdeşi olan başka bir dosya ([[:$1]]) daha önceden silindi. Bu dosyayı yeniden yüklemeden önce diğer dosyanın silme kayıtlarını kontrol etmelisiniz.',
+'file-deleted-duplicate-notitle' => 'Bu dosyaya eş bir dosya daha önceden silinmiş, ve başlık bastırılmış.
+Dosyayı tekrar yüklemeye devam etmeden önce, bastırılmış dosya verisini görme yetkisine sahip birisine durumu gözden geçirmesini istemelisiniz.',
 'uploadwarning' => 'Yükleme uyarısı',
 'uploadwarning-text' => 'Lütfen aşağıdaki dosya açıklamasını değiştirin ve tekrar deneyin.',
 'savefile' => 'Dosyayı kaydet',
@@ -2531,7 +2536,7 @@ Böyle sayfaların silinmesi, {{SITENAME}} sitesini bozmamak için sınırlanmak
 'delete-warning-toobig' => 'Bu sayfanın büyük bir değişiklik geçmişi var, $1 {{PLURAL:$1|revizyonun|revizyonun}} üzerinde.
 Bunu silmek {{SITENAME}} işlemlerini aksatabilir;
 dikkatle devam edin.',
-'deleting-backlinks-warning' => "'''Uyarı:''' Silmek üzere olduğunuz sayfaya başka sayfalardan bağlantılar var.",
+'deleting-backlinks-warning' => "'''Uyarı:''' Silmek üzere olduğunuz sayfaya başka sayfalardan bağlantıları var veya sayfanın bazı bölümleri başka sayfalar tarafından alıntı olarak kullanılıyor.",
 
 # Rollback
 'rollback' => 'değişiklikleri geri al',
@@ -2768,6 +2773,7 @@ Son engelleme günlüğü girdisi kaynak amacıyla aşağıda verilmiştir:',
 Engellemeleri gözden geçirmek için [[Special:BlockList|engel listesine]] bakınız.',
 'ipb-blockingself' => 'Kendinizi engellemek üzeresiniz! Bunu yapmak istediğinizden emin misiniz?',
 'ipb-confirmhideuser' => '"Kullanıcıyı gizle" seçiliyken bir kullanıcı engellemek üzeresiniz. Bu, kullanıcının adını tüm listeler ile günlük girişlerinde bastıracaktır. Bunu yapmak istediğinizden emin misiniz?',
+'ipb-confirmaction' => 'Bunu gerçekten yapmak istediğinize eminseniz, lütfen en alttaki "{{int:ipb-confirm}}" alanını işaretleyin.',
 'ipb-edit-dropdown' => 'Engelleme nedenleri düzenle',
 'ipb-unblock-addr' => '$1 için engellemeyi kaldır',
 'ipb-unblock' => 'Engellemeyi kaldır',
@@ -2829,7 +2835,7 @@ Gizleme günlüğü referans için aşağıda sağlanmıştır:',
 'range_block_disabled' => 'Hizmetliler için aralık engellemesi oluşturma yeteneği devre dışı.',
 'ipb_expiry_invalid' => 'Geçersiz bitiş zamanı.',
 'ipb_expiry_temp' => 'Gizli kullanıcı adı engellemeleri kalıcı olmalı.',
-'ipb_hide_invalid' => 'Kullanıcı hesabı gizlenemiyor; çok fazla değişikliği olabilir.',
+'ipb_hide_invalid' => 'Kullanıcı hesabı gizlenemiyor;  {{PLURAL:$1|Bir düzenleme|$1 düzenleme}}den daha fazla düzenlemesi var.',
 'ipb_already_blocked' => '"$1" zaten engellenmiş',
 'ipb-needreblock' => '$1 zaten engellenmiş. Ayarları değiştirmek istiyor musunuz?',
 'ipb-otherblocks-header' => 'Diğer {{PLURAL:$1|engelleme|engellemeler}}',
@@ -3971,7 +3977,7 @@ Ayrıca [[Special:EditWatchlist|standart düzenleme sayfasını]] da kullanabili
 'version-parser-function-hooks' => 'Derleyici fonksiyon çengelleri',
 'version-hook-name' => 'Çengel adı',
 'version-hook-subscribedby' => 'Abone olan',
-'version-version' => '(Sürüm $1)',
+'version-version' => '($1 sürümü)',
 'version-license' => 'MediaWiki Lisansı',
 'version-ext-license' => 'Lisans',
 'version-ext-colheader-name' => 'Uzantı',
@@ -3981,6 +3987,8 @@ Ayrıca [[Special:EditWatchlist|standart düzenleme sayfasını]] da kullanabili
 'version-ext-colheader-credits' => 'Yazarlar',
 'version-license-title' => '$1 için Lisans',
 'version-license-not-found' => 'Bu uzantı için detaylı lisans bilgisi bulunamadı.',
+'version-credits-title' => '$1 için Krediler',
+'version-credits-not-found' => 'Bu eklenti için detaylı kredi bilgisi bulunamadı.',
 'version-poweredby-credits' => "Bu wiki '''[https://www.mediawiki.org/ MediaWiki]''' programı kullanılarak oluşturulmuştur, telif © 2001-$1 $2.",
 'version-poweredby-others' => 'diğerleri',
 'version-poweredby-translators' => 'translatewiki.net çevirmenleri',
@@ -4198,6 +4206,7 @@ Bu programla birlikte [{{SERVER}}{{SCRIPTPATH}}/COPYING GNU Genel Kamu Lisansın
 'api-error-overwrite' => 'Varolan dosyanın üzerine yazmaya izin verilmiyor.',
 'api-error-stashfailed' => 'İç hata: Sunucu, geçici dosyaları kaybetti.',
 'api-error-publishfailed' => 'İç hata: Sunucu geçici dosyayı yayınlarken başarısız oldu.',
+'api-error-stasherror' => 'Dosya zulaya yüklenirken hata oluştu.',
 'api-error-timeout' => 'Sunucu beklenen süre içinde yanıt vermedi.',
 'api-error-unclassified' => 'Bilinmeyen bir hata oluştu.',
 'api-error-unknown-code' => 'Bilinmeyen hata: "$1"',
@@ -4253,4 +4262,6 @@ Aslında, çift ayraçlı hemen hemen her şeyi genişletir.',
 'expand_templates_generate_rawhtml' => 'Ham HTML göster',
 'expand_templates_preview' => 'Önizleme',
 
+# Unknown messages
+'uploadinvalidxml' => 'Yüklenen dosyadaki XML işlenemedi.',
 );
index 5c4857b..233145d 100644 (file)
@@ -8,6 +8,7 @@
  * @file
  *
  * @author Ariyo
+ * @author Arjunaraoc
  */
 
 $messages = array(
index 1a2e627..e7903e9 100644 (file)
@@ -58,7 +58,6 @@ $messages = array(
 'tog-numberheadings' => 'ماۋزۇغا ئۆزلۈكىدىن تەرتىپ نومۇرى قوش',
 'tog-showtoolbar' => 'تەھرىر قورال بالداقنى كۆرسەت',
 'tog-editondblclick' => 'قوش چەككەندە بەت تەھرىرلە',
-'tog-editsection' => '[تەھرىر] ئۇلانمىسىنى چېكىپ ئابزاس تەھرىرلەشكە يول قوي',
 'tog-editsectiononrightclick' => 'تېمىنى ئوڭ چېكىپ ئابزاس تەھرىرلەشكە يول قوي',
 'tog-showtoc' => 'مەزمۇن جەدۋىلى كۆرسەت (بىر بەتتە 3 تىن ئارتۇق ماۋزۇ بار بەتكە قارىتىلغان)',
 'tog-rememberpassword' => 'بۇ كومپيۇتېردا كىرگىنىمنى ئەستە ساقلا(ئەڭ ئۇزۇن بولغاندا $1 {{PLURAL:$1|كۈن|كۈن}})',
index 016ed3f..3528a47 100644 (file)
@@ -377,7 +377,6 @@ $messages = array(
 'tog-numberheadings' => 'Автоматично нумерувати заголовки',
 'tog-showtoolbar' => 'Показувати панель інструментів',
 'tog-editondblclick' => 'Редагувати сторінки при подвійному клацанні мишкою',
-'tog-editsection' => 'Показувати посилання [ред.] для кожного розділу',
 'tog-editsectiononrightclick' => 'Редагувати розділи при клацанні правою кнопкою мишки на заголовку',
 'tog-showtoc' => 'Показувати зміст (для сторінок з більш ніж трьома заголовками)',
 'tog-rememberpassword' => "Запам'ятати мій обліковий запис для цього браузера (на строк не більше $1 {{PLURAL:$1|1=дня|днів}})",
@@ -934,6 +933,8 @@ $1',
 'retypenew' => 'Ще раз введіть новий пароль:',
 'resetpass_submit' => 'Установити пароль і ввійти',
 'changepassword-success' => 'Ваш пароль успішно змінено!',
+'changepassword-throttled' => 'Ви нещодавно зробили надто багато спроб ввійти до системи.
+Будь ласка, зачекайте $1 перед повторною спробою.',
 'resetpass_forbidden' => 'Пароль не можна змінювати',
 'resetpass-no-info' => 'Щоб звертатися безпосередньо до цієї сторінки, вам слід увійти до системи.',
 'resetpass-submit-loggedin' => 'Змінити пароль',
@@ -960,7 +961,7 @@ $1',
 
 $2
 
-{{PLURAL:$3|1=Цей тимчасовий пароль|Ці тимчасові паролі}} стануть недійсні через {{PLURAL:$5|день|$5 дні|$5 днів}}.
+{{PLURAL:$3|1=Цей тимчасовий пароль стане недійсним|Ці тимчасові паролі стануть недійсними}} через $5 {{PLURAL:$5|день|дні|днів}}.
 Ви маєте ввійти в систему і вибрати новий пароль. Якщо ж цей запит зробив хтось інший, або Ви пам'ятаєте свій старий пароль і не бажаєте його змінювати, можете просто проігнорувати це повідомлення та продовжувати використовувати старий пароль.",
 'passwordreset-emailtext-user' => "Користувач $1 з {{SITENAME}} попросив нагадати деталі Вашого облікового запису для {{SITENAME}} ($4). З Вашою електронною скринькою пов'язан{{PLURAL:$3|1=ий такий запис|і такі записи}}:
 
@@ -985,6 +986,8 @@ $2
 'changeemail-password' => 'Ваш пароль проекту {{SITENAME}}:',
 'changeemail-submit' => 'Змінити адресу електронної пошти',
 'changeemail-cancel' => 'Скасувати',
+'changeemail-throttled' => 'Ви зробили надто багато спроб ввійти до системи.
+Будь ласка, зачекайте $1 перед повторною спробою.',
 
 # Special:ResetTokens
 'resettokens' => 'Скидання жетонів',
@@ -1211,6 +1214,8 @@ $2
 'content-not-allowed-here' => 'Вміст «$1» недопустимий на сторінці [[$2]]',
 'editwarning-warning' => 'Перехід на іншу сторінку призведе до втрати ваших змін.
 Якщо ви ввійшли до системи, то ви можете відключити це попередження в розділі «Редагування» ваших налаштувань.',
+'editpage-notsupportedcontentformat-title' => 'Непідтримуваний формат вмісту',
+'editpage-notsupportedcontentformat-text' => 'Формат вмісту $1 не підтримується моделлю вмісту $2.',
 
 # Content models
 'content-model-wikitext' => 'вікітекст',
@@ -1462,6 +1467,7 @@ $1",
 'search-result-score' => 'Відповідність: $1 %',
 'search-redirect' => '(перенаправлення $1)',
 'search-section' => '(розділ $1)',
+'search-file-match' => '(збігається із вмістом файлу)',
 'search-suggest' => 'Можливо, ви мали на увазі: $1',
 'search-interwiki-caption' => 'Братні проекти',
 'search-interwiki-default' => '$1 результати:',
@@ -1571,7 +1577,7 @@ $1",
 Перевірте коректність HTML-тегів.',
 'badsiglength' => 'Ваш підпис дуже довгий.
 Повинно бути не більше $1 {{PLURAL:$1|символу|символів|символів}}.',
-'yourgender' => 'Як Ð²Ð¸ Ð²Ð¾Ð»Ñ\96Ñ\94Ñ\82е Ð±Ñ\83Ñ\82и Ð¾Ð¿Ð¸Ñ\81аним?',
+'yourgender' => 'СÑ\82аÑ\82Ñ\8c:',
 'gender-unknown' => 'Не визначена',
 'gender-male' => 'Чоловіча',
 'gender-female' => 'Жіноча',
@@ -2586,7 +2592,7 @@ $UNWATCHURL
 'delete-warning-toobig' => 'У цієї сторінки дуже довга історія редагувань, більше $1 {{PLURAL:$1|версії|версій|версій}}.
 Її вилучення може призвести до порушень у роботі бази даних сайту {{SITENAME}};
 дійте обережно.',
-'deleting-backlinks-warning' => "'''Ð\9fопеÑ\80едженнÑ\8f:''' Ñ\96нÑ\88Ñ\96 Ñ\81Ñ\82оÑ\80Ñ\96нки Ð¿Ð¾Ñ\81илаÑ\8eÑ\82Ñ\8cÑ\81Ñ\8f Ð½Ð° сторінку, яку ви маєте намір видалити.",
+'deleting-backlinks-warning' => "'''Ð\9fопеÑ\80едженнÑ\8f:''' Ñ\96нÑ\88Ñ\96 Ñ\81Ñ\82оÑ\80Ñ\96нки Ð¿Ð¾Ñ\81илаÑ\8eÑ\82Ñ\8cÑ\81Ñ\8f Ð°Ð±Ð¾ Ð¼Ñ\96Ñ\81Ñ\82Ñ\8fÑ\82Ñ\8c сторінку, яку ви маєте намір видалити.",
 
 # Rollback
 'rollback' => 'Відкинути редагування',
@@ -2752,7 +2758,7 @@ $1',
 'sp-contributions-uploads' => 'завантаження',
 'sp-contributions-logs' => 'журнали',
 'sp-contributions-talk' => 'обговорення',
-'sp-contributions-userrights' => 'керування правами користувача',
+'sp-contributions-userrights' => 'управління правами користувача',
 'sp-contributions-blocked-notice' => 'Цей користувач наразі заблокований. Останній запис у журналі блокувань такий:',
 'sp-contributions-blocked-notice-anon' => 'Доступ з цієї IP-адреси зараз заблокований.
 Далі наведено останній запис з журналу блокувань:',
@@ -2882,7 +2888,7 @@ $1',
 'range_block_disabled' => 'Адміністраторам заборонено блокувати діапазони.',
 'ipb_expiry_invalid' => 'Невірно вказано термін.',
 'ipb_expiry_temp' => 'Блокування із приховуванням імені користувача мають бути безстроковими.',
-'ipb_hide_invalid' => 'Ð\9dеможливо Ð¿Ñ\80иÑ\85оваÑ\82и Ð¾Ð±Ð»Ñ\96ковий Ð·Ð°Ð¿Ð¸Ñ\81; Ð· Ð½Ñ\8cого Ð·Ñ\80облено Ð´Ñ\83же Ð±Ð°Ð³Ð°Ñ\82о Ñ\80едагÑ\83ванÑ\8c.',
+'ipb_hide_invalid' => 'Ð\9dеможливо Ð¿Ñ\80иÑ\85оваÑ\82и Ð¾Ð±Ð»Ñ\96ковий Ð·Ð°Ð¿Ð¸Ñ\81; Ð· Ð½Ñ\8cого Ð·Ñ\80облено Ð¿Ð¾Ð½Ð°Ð´{{PLURAL:$1|одне Ñ\80едагÑ\83ваннÑ\8f|$1 Ñ\80едагÑ\83ваннÑ\8f|$1 Ñ\80едагÑ\83ванÑ\8c}}.',
 'ipb_already_blocked' => '«$1» уже заблоковано. Для того, щоб призначити новий термін блокування, спочатку розблокуйте його.',
 'ipb-needreblock' => 'Користувач $1 вже заблокований. Хочете змінити параметри блокування?',
 'ipb-otherblocks-header' => '{{PLURAL:$1|1=Інше блокування|Інші блокування}}',
@@ -4463,4 +4469,6 @@ MediaWiki поширюється в надії, що вона буде кори
 'expand_templates_generate_rawhtml' => 'Показати сирий HTML',
 'expand_templates_preview' => 'Попередній перегляд',
 
+# Unknown messages
+'uploadinvalidxml' => 'Не вдалося проаналізувати XML у завантаженому файлі.',
 );
index ce0d3b8..bdc6761 100644 (file)
@@ -121,7 +121,6 @@ $messages = array(
 'tog-numberheadings' => 'Sarlavhalarni avtomatik raqamlash',
 'tog-showtoolbar' => 'Tahrirlash asboblari joylashgan yoʻlakchani koʻrsatish (JavaScript orqali)',
 'tog-editondblclick' => 'Sichqoncha tugmasini ikki marta bosish orqali tahrirlashni boshlash',
-'tog-editsection' => '[tahrir] havolasini har bir boʻlim boshida koʻrsatish',
 'tog-editsectiononrightclick' => 'Boʻlim sarlavhasiga sichqonchaning oʻng tugmasi bilan bosib tahrirlashni boshlash',
 'tog-showtoc' => 'Mundarijani koʻrsatish (3 tadan koʻproq sarlavha bor sahifalarda)',
 'tog-rememberpassword' => 'Hisob ma’lumotlarim ushbu brauzerda eslab qolinsin (ko‘pi bilan $1 kunga)',
@@ -452,14 +451,16 @@ Shuni e'tiborga olingki, ayrim sahifalar siz brauzeringiz keshini tozalamaguning
 'yourname' => 'Foydalanuvchi nomi:',
 'userlogin-yourname' => 'Foydalanuvchi nomi',
 'userlogin-yourname-ph' => 'Foydalanuvchi nomingizni kiriting',
+'createacct-another-username-ph' => 'Foydalanuvchi nomingizni kiriting',
 'yourpassword' => 'Maxfiy soʻz:',
+'userlogin-yourpassword' => 'Maxfiy soʻz',
 'userlogin-yourpassword-ph' => 'Maxfiy soʻzni kiriting',
 'createacct-yourpassword-ph' => 'Maxfiy soʻzni kiriting',
 'yourpasswordagain' => 'Maxfiy so‘zni qayta kiriting:',
 'createacct-yourpasswordagain' => 'Maxfiy soʻzni tasdiqlang',
 'createacct-yourpasswordagain-ph' => 'Maxfiy soʻzni yana bir bor kiriting',
 'remembermypassword' => 'Hisob ma’lumotlarim ushbu brauzerda eslab qolinsin (ko‘pi bilan $1 {{PLURAL:$1|kunga|kunga}})',
-'userlogin-remembermypassword' => 'Esda saqla',
+'userlogin-remembermypassword' => 'Kirgan deb esda saqla',
 'userlogin-signwithsecure' => 'Himoyalangan holda kirish',
 'yourdomainname' => 'Sizning domeningiz:',
 'password-change-forbidden' => 'Siz bu vikida maxfiy soʻzni oʻzgartira olmaysiz.',
@@ -479,16 +480,22 @@ Shuni e'tiborga olingki, ayrim sahifalar siz brauzeringiz keshini tozalamaguning
 'gotaccount' => "Hisobingiz bormi? '''$1'''.",
 'gotaccountlink' => 'Kirish',
 'userlogin-resetlink' => 'Kirish maʻlumotlaringiz esdan chiqdimi?',
-'userlogin-resetpassword-link' => 'Maxfiy soʻzni yangilash',
+'userlogin-resetpassword-link' => 'Unutib qoʻydingizmi?',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Kirish uchun yordam]]',
+'userlogin-loggedin' => 'Siz {{GENDER:$1|$1}} nomi bilan kirgansiz.
+Boshqa hisob raqami orqali kirish uchun quyidagi formadan foydalaning.',
+'userlogin-createanother' => 'Boshqa hisob yaratish',
 'createacct-join' => 'Maʼlumotlaringizni quyiga yozing',
+'createacct-another-join' => 'Yangi hisob yozuvi maʼlumotlarini quyida koʻrsating.',
 'createacct-emailoptional' => 'Elektron pochta manzili (majburiy emas)',
 'createacct-email-ph' => 'Elektron pochtangiz manzilini kiriting',
-'createaccountmail' => "E-mail orqali maxfiy so'zni jo'natish",
+'createacct-another-email-ph' => 'Elektron pochta manzilini kiriting',
+'createaccountmail' => 'Tasodifan tanlab beriladigan vaqtinchalik maxfiy soʻzdan foydalanish (elektron pochta manzilingizga joʻnatiladi)',
 'createaccountreason' => 'Sabab:',
 'createacct-captcha' => 'Xavfsizlik tekshiruvi',
 'createacct-imgcaptcha-ph' => 'Yuqoridagi yozuvni bu yerga kiriting',
 'createacct-submit' => 'Hisob yaratish',
+'createacct-another-submit' => 'Boshqa hisob yaratish',
 'createacct-benefit-heading' => '{{SITENAME}} Sizga oʻxshagan odamlar tomonidan yaratiladi',
 'createacct-benefit-body1' => 'tahrirlar soni',
 'createacct-benefit-body2' => 'maqolalar soni',
@@ -504,7 +511,7 @@ Ism yozilishini tekshirib koʻring.',
 'login-userblocked' => 'Bu foydalanuvchi chetlatilgan. Tizimga kirishga ruxsat yoʻq.',
 'wrongpassword' => 'Kiritgan mahfiy soʻzingiz notoʻgʻri. Iltimos, qaytadan kiritib koʻring.',
 'wrongpasswordempty' => 'Maxfiy soʻz koʻrsatilmagan. Qaytadan urinib koʻring.',
-'mailmypassword' => 'Yangi maxfiy soʻzni elektron pochta orqali joʻnatish',
+'mailmypassword' => 'Maxfiy soʻzni yangilash',
 'passwordremindertitle' => "{{SITENAME}} uchun vaqtinchalik yangi maxfiy so'z",
 'emailauthenticated' => 'Sizning elektron pochta manzilingiz $2, $3 da tasdiqlangan.',
 'emailconfirmlink' => 'Sizning elektron pochta manzilingizni tasdiqlash',
@@ -520,6 +527,7 @@ Ism yozilishini tekshirib koʻring.',
 'newpassword' => "Yangi mahfiy so'z:",
 'retypenew' => 'Yangi mahfiy soʻzni qayta tering:',
 'resetpass_submit' => "Maxfiy so'zni o'rnatish va kirish",
+'changepassword-success' => 'Maxfiy soʻzni oʻzgartirish muvaffaqiyatli oʻtdi!',
 'resetpass_forbidden' => "Maxfiy so'z o'zgartirilishi mumkin emas",
 'resetpass-submit-loggedin' => 'Maxfiy soʻzni oʻzgartirish',
 'resetpass-submit-cancel' => 'Bekor',
@@ -527,7 +535,7 @@ Ism yozilishini tekshirib koʻring.',
 # Special:PasswordReset
 'passwordreset' => 'Maxfiy soʻzni yangilash',
 'passwordreset-text-one' => 'Mahfiy soʻzni tashlash uchun ushbu oynalarni toʻltiring.',
-'passwordreset-text-many' => '{{PLURAL:$1|Maxfiy soʻzni yangilash uchun quyidagi oynalardan birini toʻldiring.}}',
+'passwordreset-text-many' => '{{PLURAL:$1|Quyidagi oynalardan birini toʻldirsangiz, elektron pochtangizga vaqtinchalik maxfiy soʻz joʻnatiladi.}}',
 'passwordreset-legend' => 'Maxfiy soʻzni yangilash',
 'passwordreset-username' => 'Foydalanuvchi nomi:',
 'passwordreset-domain' => 'Domen:',
@@ -536,7 +544,7 @@ Ism yozilishini tekshirib koʻring.',
 Vaqtinchalik maxfiy so'z: $2",
 
 # Special:ChangeEmail
-'changeemail' => "Elektron pochta manzilini o'zgartirish",
+'changeemail' => 'Elektron pochta manzilini oʻzgartirish',
 'changeemail-header' => "Elektron pochta manzilini o'zgaritish",
 'changeemail-oldemail' => 'Joriy elektron pochta manzili',
 'changeemail-newemail' => 'Elektron pochtaning yangi manzili',
@@ -674,11 +682,10 @@ Ayrim andozalar qo'shilmaydi.",
 'last' => 'oxirgi',
 'page_first' => 'birinchi',
 'page_last' => 'oxirgi',
-'histlegend' => 'Farqlar: solishtirish uchun kerakli radiobokslarni belgilang va pastdagi tugmani yoki Enterni bosing.<br />
-Bu yerda: (joriy) = hozirgi koʻrinish bilan farq,
-(oxirgi) = avvalgi koʻrinish bilan farq, k = kichkina tahrir.',
+'histlegend' => "Farqlarni tanlash: solishtirish uchun kerakli radiobokslarni belgilang va '''{{int:compare-submit}}''' tugmasini bosing.<br />
+Bu yerda: '''({{int:cur}})''' = hozirgi koʻrinish bilan farqi, '''({{int:last}})''' = avvalgi koʻrinish bilan farqi, '''{{int:minoreditletter}}''' = kichkina tahrir.",
 'history-fieldset-title' => 'Tarixni koʻrish',
-'history-show-deleted' => 'Faqat o‘chirilganlari',
+'history-show-deleted' => 'Faqat yoʻqotilganlari',
 'histfirst' => 'Eng avvalgi',
 'histlast' => 'Eng soʻnggi',
 'historysize' => '({{PLURAL:$1|1 bayt|$1 bayt}})',
@@ -774,7 +781,7 @@ Bu yerda: (joriy) = hozirgi koʻrinish bilan farq,
 'showingresultsheader' => "$4 uchun {{PLURAL:$5|'''$3'''dan '''$1''' natija|'''$3'''dan '''$1 - $2''' natijalar}}",
 'search-nonefound' => 'Talabga javob beradigan natija topilmadi.',
 'powersearch-legend' => 'Kengaytirilgan qidiruv',
-'powersearch-ns' => 'Bu nom-fazolarda izla:',
+'powersearch-ns' => 'Quyidagi nomfazolardan qidir:',
 'powersearch-redir' => 'Qayta yoʻnaltirishlarni koʻrsatish',
 'powersearch-togglelabel' => 'Belgilash:',
 'powersearch-toggleall' => 'Hammasini',
@@ -923,6 +930,7 @@ Agar keltirsangiz, undan sahifa kim tomonidan tahrirlanganini koʻrsatish uchun
 
 # User rights log
 'rightslog' => 'Foydalanuvchi huquqlari koʻrsatilgan qaydlar',
+'rightslogtext' => 'Foydalanuvchi huquqlarini oʻzgartirish qaydlari.',
 
 # Associated actions - in the sentence "You do not have permission to X"
 'action-edit' => 'ushbu sahifani tahrirlash',
@@ -935,11 +943,15 @@ Agar keltirsangiz, undan sahifa kim tomonidan tahrirlanganini koʻrsatish uchun
 'recentchanges' => 'Yangi oʻzgarishlar',
 'recentchanges-legend' => 'Yangi oʻzgarishlar moslamalari',
 'recentchanges-summary' => 'Bu sahifada siz {{SITENAME}}da sodir boʻlgan soʻnggi oʻzgarishlarni koʻrishingiz mumkin.',
+'recentchanges-noresult' => 'Koʻrsatilgan muddatga va shartlarga oid oʻzgarishlar topilmadi.',
 'recentchanges-feed-description' => 'Vikida mazkur oqimdagi oxirgi oʻzgarishlarni kuzatish',
-'recentchanges-label-newpage' => 'Bu tahrir orqali yangi sahifa yaratildi',
-'recentchanges-label-minor' => 'Bu kichik tahrir',
-'recentchanges-label-bot' => 'Bu tahrirni bot bajardi',
+'recentchanges-label-newpage' => 'Bu tahrir orqali yangi sahifa yaratilgan',
+'recentchanges-label-minor' => 'Bu tahrir kichik deb belgilangan',
+'recentchanges-label-bot' => 'Bu tahrirni bot bajargan',
 'recentchanges-label-unpatrolled' => 'Bu tahrir hali tekshirilmagan',
+'recentchanges-label-plusminus' => 'vazni qanchaga oʻzgargani (bayt)',
+'recentchanges-legend-heading' => "'''Izoh:'''",
+'recentchanges-legend-newpage' => '([[Special:NewPages|alohida roʻyxat]])',
 'rcnotefrom' => "Quyida <strong>$2</strong> dan (<strong>$1</strong> gacha) bo'lgan o'zgarishlar keltirilgan.",
 'rclistfrom' => '$1 dan boshlab yangi oʻzgarishlarni koʻrsat.',
 'rcshowhideminor' => 'Kichik tahrirlarni $1',
@@ -952,7 +964,7 @@ Agar keltirsangiz, undan sahifa kim tomonidan tahrirlanganini koʻrsatish uchun
 'diff' => 'farq',
 'hist' => 'tarix',
 'hide' => 'yashir',
-'show' => 'Koʻrsat',
+'show' => 'koʻrsat',
 'minoreditletter' => 'k',
 'newpageletter' => 'Y',
 'boteditletter' => 'b',
@@ -989,6 +1001,7 @@ Agar keltirsangiz, undan sahifa kim tomonidan tahrirlanganini koʻrsatish uchun
 'license-header' => 'Litsenziyalash',
 
 # Special:ListFiles
+'listfiles-summary' => 'Ushbu maxsus sahifada barcha yuklangan fayllar koʻrsatilgan.',
 'imgfile' => 'fayl',
 'listfiles' => 'Fayllar roʻyxati',
 'listfiles_thumb' => 'Miniatura',
@@ -1087,10 +1100,14 @@ Uning [$2 fayl tavsifi sahifasidan] olingan tavsifi quyida keltirilgan.',
 
 # Special:Log
 'specialloguserlabel' => 'Ijrochi:',
-'speciallogtitlelabel' => 'Moʻljal (nom yoki foydalanuvchi):',
+'speciallogtitlelabel' => 'Moʻljal (foydalanuvchi yoki sahifa nomi):',
 'log' => 'Qaydlar',
 'all-logs-page' => 'Barcha ochiq qaydlar',
-'logempty' => 'Qaydnomada mos keladigan yozuvlar mavjud emas.',
+'alllogstext' => "{{SITENAME}}dagi barcha jurnallar roʻyxati.
+Natijalarni jurnal nomi, foydalanuvchi nomi (harflar katta-kichikligi inobatga olinadi) yoki sahifa nomi boʻyicha saralashingiz mumkin.
+* Biror foydalanuvchi ''amalga oshirgan qaydni'', uning foydalanuvchi nomini \"Ijrochi\" oynasiga kiritib qidirish mumkin.
+* Biror foydalanuvchi yoki sahifaga ''nisbatan'' amalga oshirilgan qaydni, ularning nomini \"Moʻljal\" oynasiga kiritib qidirish mumkin.",
+'logempty' => 'Talabga mos yozuvlar mavjud emas.',
 'log-title-wildcard' => 'Shu matndan boshlanuvchi sarlavhalarni izlash',
 
 # Special:AllPages
@@ -1142,7 +1159,11 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'activeusers-noresult' => 'Foydalanuvchilar topilmadi.',
 
 # Special:ListGroupRights
-'listgrouprights' => 'Foydalanuvchilar guruhi huquqlari',
+'listgrouprights' => 'Foydalanuvchilar guruhlari roʻyxati',
+'listgrouprights-summary' => 'Har bir viki-loyihada boʻlgani kabi, Oʻzbekcha Vikipediyada ham foydalanuvchilar bir nechta guruhlarga boʻlingan boʻlib, quyida ularning roʻyxati va tegishli huquqlari keltirilgan. Alohida huquqlar haqida [[{{MediaWiki:Listgrouprights-helppage}}|qoʻshimcha maʼlumotlar]] boʻlishi mumkin.',
+'listgrouprights-key' => 'Izohlar:
+* <span class="listgrouprights-granted">Amaldagi huquqlar</span>
+* <span class="listgrouprights-revoked">Bekor qilingan huquqlar</span>',
 'listgrouprights-group' => 'Guruh',
 'listgrouprights-rights' => 'Huquqlar',
 'listgrouprights-helppage' => 'Help:Guruhlar huquqlari',
@@ -1193,8 +1214,9 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'unwatchthispage' => "Kuzatuvni to'xtatish",
 'notanarticle' => 'Maqola emas',
 'watchlist-details' => 'Sizning kuzatuv roʻyxatingizda hozirda {{PLURAL:$1|bitta sahifa|$1ta sahifa}} mavjud (munozara sahifalarini hisobga olmaganda).',
+'wlheader-showupdated' => "Siz oxirgi marta kirganingizdan keyin oʻzgartirilgan sahifalar '''qalin''' yozuv bilan ajratib koʻrsatilgan.",
 'wlnote' => "Below {{PLURAL:$1|is the last change|are the last '''$1''' changes}} in the last {{PLURAL:$2|hour|'''$2''' hours}}, as of $3, $4.",
-'wlshowlast' => 'Oxirgi $1 soatdagi $2 kundagi tahrirlarni ko‘rsatish. $3 tahrirlarni ko‘rsatish',
+'wlshowlast' => 'Oxirgi $1 soatdagi $2 kundagi tahrirlarni koʻrsat $3',
 'watchlist-options' => 'Kuzatuv roʻyxati moslamalari',
 
 # Displayed when you click the "watch" button and it is in the process of watching
@@ -1202,7 +1224,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'unwatching' => "Kuzatuv ro'yxatidan o'chirish...",
 
 'enotif_mailer' => "{{SITENAME}} Pochta orqali e'lon qilish xizmati",
-'enotif_reset' => 'Hamma sahifalarni koʻrib chiqilgan deb belgilash',
+'enotif_reset' => 'Hammasini koʻrib chiqilgan deb belgilash',
 'enotif_impersonal_salutation' => '{{SITENAME}} ishtirokchisi',
 'enotif_subject_deleted' => '{{SITENAME}} loyihasining $1 nomli sahifasi foydalanuvchi {{gender:$2|$2}} tomonidan o‘chirildi',
 'enotif_subject_created' => '{{SITENAME}} loyihasining $1 nomli sahifasi foydalanuvchi {{gender:$2|$2}} tomonidan yaratildi',
@@ -1273,7 +1295,7 @@ Yaqinda sodir etilgan yoʻqotishlar uchun $2ni koʻring.',
 'rollbacklinkcount' => '$1 ta tahrirni ortga qaytarish',
 'rollbacklinkcount-morethan' => '$1 {{PLURAL:$1| tadan koʻp tahrir}}ni eski holiga keltirish',
 'rollbackfailed' => 'Eski holiga keltirishda xatolik',
-'revertpage' => '[[Special:Contributions/$2|$2]] ([[User talk:$2|munozara]]) tahrirlari [[User:$1|$1]] versiyasiga qaytarildi',
+'revertpage' => '[[Special:Contributions/$2|$2]] tahrirlari [[User:$1|$1]] versiyasiga qaytarildi',
 
 # Edit tokens
 'sessionfailure-title' => 'Seansda xatolik',
@@ -1341,7 +1363,7 @@ Yaqinda sodir etilgan yoʻqotishlar uchun $2ni koʻring.',
 'contributions-title' => '{{GENDER:$1|Foydalanuvchi}} $1 hissasi',
 'mycontris' => 'Hissam',
 'contribsub2' => '$1 uchun ($2)',
-'nocontribs' => 'Belgilangan shartlarga muvofiq oʻzgarishlar topilmadi',
+'nocontribs' => 'Belgilangan shartlarga muvofiq oʻzgarishlar topilmadi.',
 'uctop' => '(joriy)',
 'month' => 'Oydan (va avvalroq)',
 'year' => 'Yildan (va avvalroq)',
@@ -1350,11 +1372,12 @@ Yaqinda sodir etilgan yoʻqotishlar uchun $2ni koʻring.',
 'sp-contributions-newbies-sub' => 'Yangi hisob yozuvlaridan',
 'sp-contributions-newbies-title' => 'Yangi hisob yozuvlarining hissalari',
 'sp-contributions-blocklog' => 'chetlatishlar',
-'sp-contributions-deleted' => "o'chirilgan tahrirlar",
+'sp-contributions-deleted' => 'yoʻqotilgan tahrirlar',
 'sp-contributions-uploads' => 'yuklamalar',
 'sp-contributions-logs' => 'qaydlar',
 'sp-contributions-talk' => 'munozara',
 'sp-contributions-userrights' => 'foydalanuvchining huquqlarini boshqarish',
+'sp-contributions-blocked-notice' => 'Ushbu foydalanuvchi hozirda tahrirlashdan chetlatilgan. Quyida chetlatish qaydlaridan soʻnggi yozuv keltirilgan:',
 'sp-contributions-search' => 'Hissalarni qidirish',
 'sp-contributions-username' => 'IP-manzil yoki foydalanuvchi nomi:',
 'sp-contributions-toponly' => 'Faqat oxirgi deb hisoblangan tahrirlarni koʻrsat',
@@ -1388,14 +1411,14 @@ Yaqinda sodir etilgan yoʻqotishlar uchun $2ni koʻring.',
 'ipadressorusername' => 'IP-manzil yoki foydalanuvchi nomi:',
 'ipbexpiry' => 'Tugaydi:',
 'ipbreason' => 'Sabab:',
-'ipbreason-dropdown' => "* Chetlashtirishning andazaviy sabablari
-** Yolg'on axborot kiritish
-** Sahifa matnini o'chirish
-** Tashqi saytlarga spam-yo'llanmalar
-** Ma'nosiz matn/axlat qo'shish
-** Tahdid, ishtirokchilarni ta'qib qilish
-** Bir necha hisob yozuvlaridan o'z manfaatlarida foydalanish
-** Ishtirokchining nomaqbul ismi",
+'ipbreason-dropdown' => '* Chetlashtirishning odatiy sabablari
+** Yolgʻon maʼlumot kiritish
+** Sahifa matnini toʻliq oʻchirish
+** Tashqi saytlarga spam-havolalar
+** Maʼnosiz matn/axlat qoʻshish
+** Foydalanuvchilarga tahdid qilish, ularni taʼqib qilish
+** Bir nechta hisob yozuvlaridan oʻz manfaatlarida foydalanish
+** Nomaqbul foydalanuvchi nomi',
 'ipbsubmit' => 'Ushbu foydalanuvchini chetlashtirish',
 'ipbother' => 'Boshqa vaqt:',
 'ipboptions' => '2 soat:2 hours,1 kun:1 day,3 kun:3 days,1 hafta:1 week,2 hafta:2 weeks,1 oy:1 month,3 oy:3 months,6 oy:6 months,1 yil:1 year,cheksiz:infinite',
@@ -1625,7 +1648,7 @@ Umumiy omborda [[:$1]] mavjud. Faylning bu nomga qayta nomlanishi faylning umumi
 'exif-iimcategory-wea' => 'Ob-havo',
 
 # 'all' in various places, this might be different for inflected languages
-'watchlistall2' => 'Barcha',
+'watchlistall2' => 'hammasi',
 'namespacesall' => 'Barchasi',
 'monthsall' => 'barchasi',
 
@@ -1641,8 +1664,10 @@ Umumiy omborda [[:$1]] mavjud. Faylning bu nomga qayta nomlanishi faylning umumi
 'table_pager_prev' => 'Oldingi sahifa',
 'table_pager_first' => 'Birinchi sahifa',
 'table_pager_last' => 'Oxirgi sahifa',
+'table_pager_limit_label' => 'Bir sahifadagi yozuvlar soni:',
 
 # Auto-summaries
+'autosumm-blank' => 'Sahifa tozalandi',
 'autoredircomment' => '[[$1]]ga yoʻnaltirildi',
 'autosumm-new' => '"$1" yozuvi orqali yangi sahifa yaratildi',
 
@@ -1669,6 +1694,9 @@ Umumiy omborda [[:$1]] mavjud. Faylning bu nomga qayta nomlanishi faylning umumi
 # Special:Tags
 'tag-filter' => '[[Special:Tags|Nishonlar]] filtri:',
 
+# Special:ComparePages
+'compare-submit' => 'Solishtirish',
+
 # HTML forms
 'htmlform-reset' => 'Oʻzgarishlarni bekor qilish',
 'htmlform-selectorother-other' => 'Boshqa',
@@ -1678,14 +1706,18 @@ Umumiy omborda [[:$1]] mavjud. Faylning bu nomga qayta nomlanishi faylning umumi
 'logentry-move-move' => '$1 $3 sahifasini $4ga koʻchirdi',
 'logentry-move-move-noredirect' => '$1 $3 sahifasini $4ga {{GENDER:$2|koʻchirdi}}',
 'logentry-patrol-patrol-auto' => '$1 $3 sahifasining $4 versiyasini avtomatik patrulladi',
-'logentry-newusers-newusers' => '$1 hisob yozuvi yaratildi',
-'logentry-newusers-create' => '$1 hisob yozuvi yaratildi',
+'logentry-newusers-newusers' => '$1 hisob yozuvi {{GENDER:$2|yaratildi}}',
+'logentry-newusers-create' => '$1 hisob yozuvi {{GENDER:$2|yaratildi}}',
+'logentry-newusers-autocreate' => '$1 hisob yozuvi avtomatik ravishda {{GENDER:$2|yaratilgan}}',
+'logentry-rights-rights' => '$1 $3ning guruhlardagi aʼzoligini $4dan $5ga {{GENDER:$2|oʻzgartirdi}}',
+'logentry-rights-rights-legacy' => '$1 $3ning guruhlardagi aʼzoligini oʻzgartirdi',
 
 # Feedback
 'feedback-close' => 'Bajarildi',
 
 # Search suggestions
 'searchsuggest-search' => 'Qidiruv',
+'searchsuggest-containing' => 'ichida bu boʻlgan...',
 
 # API errors
 'api-error-unknown-code' => 'Noaniq xato: "$1".',
index 2e47da9..6653a61 100644 (file)
@@ -170,7 +170,6 @@ $messages = array(
 'tog-numberheadings' => 'Numerasion automatega de i titołi de sesion',
 'tog-showtoolbar' => 'Mostra ła bara de i strumenti de modifega (el richiede JavaScript)',
 'tog-editondblclick' => 'Modifega de łe pajine tramite dopio clic (el richiede JavaScript)',
-'tog-editsection' => 'Modifega de łe sesion tramite el cołegamento [modifega]',
 'tog-editsectiononrightclick' => 'Modifega de łe sesion tramite clic destro sol titoło (el richiede JavaScript)',
 'tog-showtoc' => "Mostra l'indexe par łe pajine con pì de 3 sesion",
 'tog-rememberpassword' => 'Tiente in mente la me password so sto computer (par un massimo de $1 {{PLURAL:$1|zorno|zorni}})',
@@ -641,7 +640,7 @@ Asicurate de 'ver ativà i cookie, ricarica sta pajina e riprova.",
 'passwordtooshort' => 'Łe password e ga da contegnere almanco {{PLURAL:$1|1 caratere|$1 carateri}}.',
 'password-name-match' => 'Ła password a ga da esare difarente dal nome utente.',
 'password-login-forbidden' => 'Sto nome utente e/o password i xè stai proibìi',
-'mailmypassword' => 'Màndeme na password nova al me indirisso e-mail',
+'mailmypassword' => 'Rinposta ła password',
 'passwordremindertitle' => 'Servisio Password Reminder de {{SITENAME}}',
 'passwordremindertext' => 'Qualcheduni (probabilmente ti, da l\'indirizo IP $1) el gà domandà che ghe vegna mandà na nova password par {{SITENAME}} ($4).
 Na password tenporànea par l\'utente "$2" la xe stà creà e inpostà a "$3".
@@ -826,7 +825,7 @@ Se prega de specificar el to indirizo IP atuale ($3) e el nùmaro del bloco (ID
 'nosuchsectiontext' => 'Te ghè sercà de modificar na sezion che no esiste.
 Forse la xe stà spostà o scancelà fin che te sèri drio vardar la pagina.',
 'loginreqtitle' => "Par modificar sta pagina bisogna prima eseguir l'acesso al sito.",
-'loginreqlink' => 'login',
+'loginreqlink' => 'far el login',
 'loginreqpagetext' => 'Par védar altre pagine bisogna $1.',
 'accmailtitle' => 'Password spedia.',
 'accmailtext' => "Na password xenerà casualmente par [[User talk:$1|$1]] la xe stà mandà a $2.
@@ -1009,8 +1008,8 @@ La motivazion del bloco fornìa da $3 la xe sta qua: ''$2''",
 Legenda: '''({{int:cur}})''' = difarense co l'ultima version, '''({{int:last}})''' = difarense co la version subito prima, '''{{int:minoreditletter}}''' = canbiamento picenin",
 'history-fieldset-title' => 'Ruma in te la storia',
 'history-show-deleted' => 'Solo quei scancelà',
-'histfirst' => 'Prima',
-'histlast' => 'Ultema',
+'histfirst' => 'pi vecia',
+'histlast' => 'pi nova',
 'historysize' => '({{PLURAL:$1|1 byte|$1 byte}})',
 'historyempty' => '(voda)',
 
@@ -1068,15 +1067,15 @@ I altri aministradori de {{SITENAME}} i podarà vardar istesso i contenuti scont
 * Informassion personali mia apropriate
 *: ''indirissi de casa e nùmari de telefono, nùmari de previdensa sociale, etc.''",
 'revdelete-legend' => 'Inposta le seguenti limitazion su le versioni scancelàe:',
-'revdelete-hide-text' => 'Scondi el testo de ła version',
+'revdelete-hide-text' => 'El testo de ła version',
 'revdelete-hide-image' => 'Scondi i contenuti del file',
 'revdelete-hide-name' => 'Scondi azion e ogeto de la stessa',
-'revdelete-hide-comment' => "Scondi l'oggetto de ła modifega",
-'revdelete-hide-user' => "Scondi el nome o l'indirisso IP dell'autore",
+'revdelete-hide-comment' => "L'ogeto de ła modifega",
+'revdelete-hide-user' => "El nome o l'indirisso IP de l'autor",
 'revdelete-hide-restricted' => 'Scóndighe le informassion indicà anca ai aministradori',
 'revdelete-radio-same' => '(no stà canbiar)',
-'revdelete-radio-set' => 'Sì',
-'revdelete-radio-unset' => 'No',
+'revdelete-radio-set' => 'Sconto',
+'revdelete-radio-unset' => 'Visibile',
 'revdelete-suppress' => 'Scondi le informazion anca ai aministradori',
 'revdelete-unsuppress' => 'Elimina le limitazion su le revision ripristinà',
 'revdelete-log' => 'Motivassion:',
@@ -1308,6 +1307,7 @@ Co qualcheduni te scrivarà, nol vedarà mia el to indirizo.',
 'prefs-dateformat' => 'Formato de la data',
 'prefs-timeoffset' => 'Ore de difarensa',
 'prefs-advancedediting' => 'Preferense avansade',
+'prefs-editor' => 'Contributor',
 'prefs-advancedrc' => 'Preferense avansade',
 'prefs-advancedrendering' => 'Preferense avansade',
 'prefs-advancedsearchoptions' => 'Preferense avansade',
@@ -1493,7 +1493,7 @@ Co qualcheduni te scrivarà, nol vedarà mia el to indirizo.',
 'rclistfrom' => 'Fà védar i canbiamenti fati dal $1',
 'rcshowhideminor' => '$1 i canbiamenti picenini',
 'rcshowhidebots' => '$1 i bot',
-'rcshowhideliu' => '$1 i utenti registrai',
+'rcshowhideliu' => '$1 i utenti registrài',
 'rcshowhideanons' => '$1 i utenti anonimi',
 'rcshowhidepatr' => '$1 łe modifeghe controłae',
 'rcshowhidemine' => '$1 i me canbiamenti',
@@ -1510,7 +1510,7 @@ Co qualcheduni te scrivarà, nol vedarà mia el to indirizo.',
 'rc_categories_any' => 'Qualsiasi',
 'rc-change-size-new' => '$1 {{PLURAL:$1|byte}} dopo ła modifega',
 'newsectionsummary' => '/* $1 */ sezion nova',
-'rc-enhanced-expand' => 'Mostra detaji (richiede JavaScript)',
+'rc-enhanced-expand' => 'Mostra detaji',
 'rc-enhanced-hide' => 'Scondi detaji',
 'rc-old-title' => 'creà in orijine come "$1"',
 
@@ -1530,8 +1530,7 @@ Le pagine [[Special:Watchlist|tegnùe d'ocio]] le xe in '''grosso'''.",
 'reuploaddesc' => 'Lassa pèrdar el caricamento e torna al modulo de caricamento',
 'upload-tryagain' => 'Invia la descrission del file modificà',
 'uploadnologin' => 'Te devi far el login par exeguire sta operassion.',
-'uploadnologintext' => 'Te ghè da far [[Special:UserLogin|el login]]
-par poder cargar dei file.',
+'uploadnologintext' => 'Te ghè da $1 par cargar dei file.',
 'upload_directory_missing' => 'La cartèla de caricamento ($1) no la esiste mìa e no la pode vegner creàda dal browser web.',
 'upload_directory_read_only' => "El server web no l'è bon de scrìvar ne la directory de caricamento ($1).",
 'uploaderror' => 'Eror nel caricamento',
@@ -1868,7 +1867,9 @@ Probabilmente te vui modifegar ła descrision prexente inte ła [$2 pàjina de d
 
 # Random page in category
 'randomincategory' => 'Pagina a ocio in te na categoria',
+'randomincategory-invalidcategory' => '"$1" no\'l và mia ben come nome de categoria.',
 'randomincategory-nopages' => 'No ghe xe mia pagine in [[:Category:$1]].',
+'randomincategory-selectcategory' => 'Ciapa na pagina a ocio da la categoria: $1 $2.',
 'randomincategory-selectcategory-submit' => 'Và',
 
 # Random redirect
@@ -1965,12 +1966,14 @@ Le righe <del>sbarà</del> le xe xà stà sistemà.',
 'protectedpages' => 'Pagine protete',
 'protectedpages-indef' => 'Solo le protezion infinìe',
 'protectedpages-cascade' => 'Solo protezion ricorsive',
+'protectedpages-noredirect' => 'Scondi rimandi',
 'protectedpagesempty' => 'Al momento no ghe xe pagine protete',
 'protectedtitles' => 'Titoli proteti',
 'protectedtitlesempty' => 'Al momento no ghe xe titoli proteti coi parametri specificà.',
 'listusers' => 'Elenco dei utenti',
 'listusers-editsonly' => 'Fà védar sol che i utenti che gà fato dei contributi',
 'listusers-creationsort' => 'Òrdena par data de creassion',
+'listusers-desc' => 'Ordina in senso decresente',
 'usereditcount' => '$1 {{PLURAL:$1|contributo|contributi}}',
 'usercreated' => '{{GENDER:$3|Creà|Creà}} el $1 a le $2',
 'newpages' => 'Pagine nove',
@@ -2383,9 +2386,9 @@ $1',
 'contributions' => 'Contributi {{GENDER:$1|utente}}',
 'contributions-title' => 'Contributi de $1',
 'mycontris' => 'Contributi',
-'contribsub2' => 'Par $1 ($2)',
+'contribsub2' => 'Par {{GENDER:$3|$1}} ($2)',
 'nocontribs' => 'No xe stà catà nissuna modifica che vaga ben par sti critèri.',
-'uctop' => '(ultima)',
+'uctop' => '(de dèsso)',
 'month' => 'Dal mese (e quei prima):',
 'year' => "Da l'ano (e quei prima):",
 
@@ -2958,7 +2961,7 @@ La so esecuzion la podarìa danegiar el to computer.",
 'svg-long-desc' => 'file en formato SVG, dimension nominałi $1 × $2 pixel, dimension del file: $3',
 'svg-long-desc-animated' => 'file in formato SVG animà, dimension nominałi $1 × $2 pixel, dimension del file: $3',
 'svg-long-error' => 'File SVG mìa valido: $1',
-'show-big-image' => 'Version ad alta risołusion',
+'show-big-image' => 'File original',
 'show-big-image-preview' => 'Dimension de sta anteprima: $1.',
 'show-big-image-other' => '{{PLURAL:$2|Altra risołusion|Altre risołusion}}: $1.',
 'show-big-image-size' => '$1 × $2 pixel',
@@ -3520,6 +3523,9 @@ Par piaser, conferma che te vołi dal bon ricrear sta voxe.',
 'imgmultigo' => 'Và',
 'imgmultigoto' => 'Và a la pagina $1',
 
+# Language selector for translatable SVGs
+'img-lang-default' => '(lengua predefinìa)',
+
 # Table pager
 'ascending_abbrev' => 'cresc',
 'descending_abbrev' => 'decresc',
@@ -3600,7 +3606,13 @@ Nota che te pol anca [[Special:EditWatchlist|modificar la lista con l'interfacia
 'version-hook-name' => "Nome de l'hook",
 'version-hook-subscribedby' => 'Sotoscrizioni',
 'version-version' => '(Version $1)',
-'version-license' => 'Licensa',
+'version-license' => 'Licensa MediaWiki',
+'version-ext-license' => 'Licensa',
+'version-ext-colheader-name' => 'Estension',
+'version-ext-colheader-version' => 'Version',
+'version-ext-colheader-license' => 'Licensa',
+'version-ext-colheader-description' => 'Descrission',
+'version-license-title' => 'Licensa par $1',
 'version-poweredby-credits' => "Sta wiki la va con '''[https://www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
 'version-poweredby-others' => 'altri',
 'version-poweredby-translators' => 'tradutori de translatewiki.net',
@@ -3681,6 +3693,7 @@ Insieme co sto programa te dovaressi 'ver ricevùo na copia de la Licensa Public
 'tags-tag' => 'Nome del tag',
 'tags-display-header' => 'Aspetto ne la lista de le modifiche',
 'tags-description-header' => 'Descrission conpleta del significado',
+'tags-active-header' => 'Ativo?',
 'tags-hitcount-header' => 'Modifiche che gà dei tag',
 'tags-edit' => 'modìfega',
 'tags-hitcount' => '$1 {{PLURAL:$1|modìfega|modìfeghe}}',
index 2eb912a..cef8f60 100644 (file)
@@ -99,7 +99,6 @@ $messages = array(
 'tog-numberheadings' => 'Nomeruida avtomatižikš pälkirjutesed',
 'tog-showtoolbar' => "Ozutada redaktiruindan panel'",
 'tog-editondblclick' => 'Redaktiruida lehtpoled kaksitadud plokul',
-'tog-editsection' => 'Ozutada "Redaktiruida"-kosketuz kaikuččen sekcijan täht',
 'tog-editsectiononrightclick' => 'Redaktiruida sekcijad hiren oiktal plokul pälkirjutesele',
 'tog-showtoc' => 'Ozutada südäiolend (lehtpoled, kudambil om enamba, mi 3 pälkirjutest)',
 'tog-rememberpassword' => 'Muštta minun kävutajan nimi neciš kompjuteras (enintään $1 {{PLURAL:$1|päivä|päivää}})',
@@ -1053,7 +1052,7 @@ Otkat sil'mnägubale üks-se, miše {{SITENAME}}-saitan sädäimišt voib olda v
 'timezoneregion-indian' => 'Indijan valdmeri',
 'timezoneregion-pacific' => "Tün' valdmeri",
 'allowemail' => 'Laskkat toižile kävutajile oigeta teile e-počtad',
-'prefs-searchoptions' => 'Ecindan järgendused',
+'prefs-searchoptions' => 'Ec',
 'prefs-namespaces' => 'Nimiavarused',
 'defaultns' => 'Toižiš statjoiš ectä neniš nimiavarusiš:',
 'default' => 'augotižjärgendusen mödhe',
index f6fd03c..4af0432 100644 (file)
@@ -27,6 +27,7 @@
  * @author Vietbio
  * @author Vinhtantran
  * @author Vương Ngân Hà
+ * @author Withoutaname
  * @author לערי ריינהארט
  */
 
@@ -347,7 +348,6 @@ $messages = array(
 'tog-numberheadings' => 'Tự động đánh số các đề mục',
 'tog-showtoolbar' => 'Hiển thị thanh định dạng',
 'tog-editondblclick' => 'Nhấn đúp để sửa đổi trang',
-'tog-editsection' => 'Cho phép sửa đổi đề mục qua liên kết [sửa]',
 'tog-editsectiononrightclick' => 'Bấm chuột phải vào đề mục để sửa đổi phần trang',
 'tog-showtoc' => 'Hiển thị mục lục (cho trang có trên 3 đề mục)',
 'tog-rememberpassword' => 'Nhớ thông tin đăng nhập của tôi trong trình duyệt này (cho đến $1 ngày)',
@@ -505,7 +505,7 @@ $messages = array(
 'vector-action-unprotect' => 'Đổi mức khóa',
 'vector-simplesearch-preference' => 'Hộp tìm kiếm đơn giản (cần bề ngoài Vectơ)',
 'vector-view-create' => 'Tạo',
-'vector-view-edit' => 'Sửa',
+'vector-view-edit' => 'Sửa đổi',
 'vector-view-history' => 'Xem lịch sử',
 'vector-view-view' => 'Đọc',
 'vector-view-viewsource' => 'Xem mã nguồn',
@@ -551,16 +551,16 @@ $messages = array(
 'postcomment' => 'Đề mục mới',
 'articlepage' => 'Xem trang nội dung',
 'talk' => 'Thảo luận',
-'views' => 'Xem',
+'views' => 'Hình dạng',
 'toolbox' => 'Công cụ',
 'userpage' => 'Xem trang thành viên',
 'projectpage' => 'Xem trang dự án',
 'imagepage' => 'Xem trang tập tin',
 'mediawikipage' => 'Thông điệp giao diện',
-'templatepage' => 'Trang bản mẫu',
-'viewhelppage' => 'Trang trợ giúp',
-'categorypage' => 'Trang thể loại',
-'viewtalkpage' => 'Trang thảo luận',
+'templatepage' => 'Xem trang bản mẫu',
+'viewhelppage' => 'Xem trang trợ giúp',
+'categorypage' => 'Xem trang thể loại',
+'viewtalkpage' => 'Xem trang thảo luận',
 'otherlanguages' => 'Ngôn ngữ khác',
 'redirectedfrom' => '(đổi hướng từ $1)',
 'redirectpagesub' => 'Trang đổi hướng',
@@ -883,6 +883,7 @@ Nếu bạn đồng ý cung cấp, nó sẽ dùng để ghi nhận công lao c
 'retypenew' => 'Gõ lại:',
 'resetpass_submit' => 'Chọn mật khẩu và đăng nhập',
 'changepassword-success' => 'Đã đổi mật khẩu thành công!',
+'changepassword-throttled' => 'Bạn thử đăng nhập gần đây nhiều lần quá. Xin chờ $1 trước khi bạn thử lần nữa.',
 'resetpass_forbidden' => 'Không được đổi mật khẩu',
 'resetpass-no-info' => 'Bạn phải đăng nhập mới có thể truy cập trực tiếp trang này.',
 'resetpass-submit-loggedin' => 'Thay đổi mật khẩu',
@@ -942,6 +943,7 @@ Mật khẩu tạm: $2',
 'changeemail-password' => 'Mật khẩu của bạn tại {{SITENAME}}:',
 'changeemail-submit' => 'Đổi địa chỉ',
 'changeemail-cancel' => 'Hủy bỏ',
+'changeemail-throttled' => 'Bạn thử đăng nhập nhiều lần quá. Xin chờ $1 trước khi bạn thử lần nữa.',
 
 # Special:ResetTokens
 'resettokens' => 'Đặt lại dấu hiệu',
@@ -1157,6 +1159,8 @@ Nó đã tồn tại.',
 'content-not-allowed-here' => 'Không cho phép đưa nội dung “$1” vào trang [[$2]]',
 'editwarning-warning' => 'Rời khỏi trang này sẽ khiến bạn mất các sửa đổi đã thực hiện.
 Nếu đã đăng nhập, bạn có thể tắt cảnh báo này tại mục “Sửa đổi” trong tùy chọn cá nhân.',
+'editpage-notsupportedcontentformat-title' => 'Không hỗ trợ định dạng nội dung',
+'editpage-notsupportedcontentformat-text' => 'Mô hình nội dung $2 không hỗ trợ định dạng nội dung $1.',
 
 # Content models
 'content-model-wikitext' => 'mã wiki',
@@ -1406,6 +1410,7 @@ Xem chi tiết trong [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}}
 'search-result-score' => 'Độ phù hợp: $1%',
 'search-redirect' => '(đổi hướng $1)',
 'search-section' => '(đề mục $1)',
+'search-file-match' => '(khớp nội dung tập tin)',
 'search-suggest' => 'Có phải bạn muốn tìm: $1',
 'search-interwiki-caption' => 'Các dự án liên quan',
 'search-interwiki-default' => '$1 kết quả:',
@@ -2511,7 +2516,7 @@ Việc xóa các trang như vậy bị hạn chế để ngăn ngừa phá hoạ
 'delete-warning-toobig' => 'Trang này có lịch sử sửa đổi lớn, đến hơn {{PLURAL:$1|lần|lần}} sửa đổi.
 Việc xóa các trang có thể làm tổn hại đến hoạt động của cơ sở dữ liệu {{SITENAME}};
 hãy cẩn trọng khi thực hiện.',
-'deleting-backlinks-warning' => "'''Cảnh báo:''' Có trang khác liên kết đến trang mà bạn sắp xóa.",
+'deleting-backlinks-warning' => "'''Cảnh báo:''' Có trang khác liên kết đến hoặc nhúng trang mà bạn sắp xóa.",
 
 # Rollback
 'rollback' => 'Lùi tất cả sửa đổi',
@@ -2806,7 +2811,7 @@ Xem lại những lần cấm tại [[Special:BlockList|danh sách cấm]].',
 'range_block_disabled' => 'Đã tắt khả năng cấm hàng loạt của quản lý.',
 'ipb_expiry_invalid' => 'Thời điểm hết hạn không hợp lệ.',
 'ipb_expiry_temp' => 'Cấm tên người dùng ẩn nên là cấm vô hạn.',
-'ipb_hide_invalid' => 'Không thể ẩn tài khoản này; có thể do nó có quá nhiều sửa đổi.',
+'ipb_hide_invalid' => 'Không thể ẩn tài khoản này; nó đã sửa đổi hơn {{PLURAL:$1|một lần|$1 lần}}.',
 'ipb_already_blocked' => '“$1” đã bị cấm rồi',
 'ipb-needreblock' => '$1 đã bị cấm. Bạn có muốn thay đổi các thiết lập?',
 'ipb-otherblocks-header' => '{{PLURAL:$1|Tác vụ cấm|Các tác vụ cấm}} khác',
@@ -4329,4 +4334,7 @@ Nếu không thì bạn có thể điền biểu mẫu đơn giản ở dưới.
 'expand_templates_generate_rawhtml' => 'Hiển thị HTML thô',
 'expand_templates_preview' => 'Xem trước',
 
+# Unknown messages
+'createaccount-hook-aborted' => '$1',
+'uploadinvalidxml' => 'Không thể phân tích mã XML trong tập tin tải lên.',
 );
index 0db027e..0eace4e 100644 (file)
@@ -74,7 +74,6 @@ $messages = array(
 'tog-numberheadings' => 'Auto-nga-ihap nga mga pagngaran',
 'tog-showtoolbar' => 'Igpakita an edit toolbar',
 'tog-editondblclick' => 'Igliwat in mga pakli ha doble nga klik',
-'tog-editsection' => 'Tugoti in seksyon nga pagliwat pinaagi hin [igliwat] nga mga sumpay',
 'tog-editsectiononrightclick' => 'Tugoti in pagliwat hin seksyon ha pag klik-ha-tuo dida hin mga ngaran o titulo hin seksyon',
 'tog-showtoc' => 'Igpakita in tabla hin sulod (para hin mga pakli nga sobra hin 3 ka titulo o pagngaran)',
 'tog-rememberpassword' => 'Hinumdomi an akon pan-sakob dinhi nga browser (para hin maximum nga $1 {{PLURAL:$1|nga adlaw|nga mga adlaw}})',
@@ -273,7 +272,7 @@ $messages = array(
 'talkpage' => 'Pakighimangraw hiunong hini nga pakli',
 'talkpagelinktext' => 'Hiruhimangraw',
 'specialpage' => 'Ispisyal nga Pakli',
-'personaltools' => 'Kalugaringon nga mga garamiton',
+'personaltools' => 'Mga pankalugaring nga garamiton',
 'postcomment' => 'Bag-o nga bahin',
 'articlepage' => 'Kitaa in may sulod nga pakli',
 'talk' => 'Hiruhimangraw',
index 48e7bee..37d344c 100644 (file)
@@ -94,7 +94,6 @@ $messages = array(
 'tog-numberheadings' => 'Koj yi jox lim seen bopp',
 'tog-showtoolbar' => 'Wone bànqaasu njëlu coppite bi (JavaScript)',
 'tog-editondblclick' => 'Cuq cuqaatal ngir soppi aw xët (JavaScript)',
-'tog-editsection' => 'Soppi ab xaaj jaare ko cib lëkkalekaay [Soppi]',
 'tog-editsectiononrightclick' => 'Soppi ab xaaj cib cuqub ndeyjoor ci kojam  (JavaScript)',
 'tog-showtoc' => 'Wone tëralinu ne-ne yi (ngir xët yi ëpp 3 xaaj)',
 'tog-rememberpassword' => 'Fattalikul sama baatujàll  (for a maximum of $1 {{PLURAL:$1|day|days}})',
@@ -911,7 +910,6 @@ Soo jëfandikoo lëkkalekaayu joow yi day neenal boyot yi nga jotoon a fal.',
 'rows' => 'Rëdd:',
 'columns' => 'Kenu :',
 'searchresultshead' => 'Seet',
-'resultsperpage' => 'Limu ngérte ci xët wu ne :',
 'recentchangesdays' => 'Limu bes yi nga koy wone ci coppite yu mujj yi :',
 'recentchangesdays-max' => '(bi ëpp $1 {{PLURAL:$1|bés|bés}})',
 'recentchangescount' => 'Limu coppite yi ngay wone ci coppite yu mujj yi cig wàccaale:',
index 16f460f..4c44ac2 100644 (file)
@@ -207,7 +207,6 @@ $messages = array(
 'tog-numberheadings' => 'נומערירן קעפלעך אויטאמאטיש',
 'tog-showtoolbar' => 'ווײַזן רעדאקטירן געצייג-שטאנג',
 'tog-editondblclick' => 'רעדאקטירן בלעטער דורך טאפל קליק',
-'tog-editsection' => 'ערמעגליכט אפטייל ענדערן דורך [ענדערן] לינקס',
 'tog-editsectiononrightclick' => 'באמעגלעכן אפטייל רעדאקטירן דורכן רעכטס־קליקן אויף אפטייל קעפלעך',
 'tog-showtoc' => 'ווייז דאס אינהאלט קעסטל<br />(פאר בלעטער מיט מער ווי 3 קעפלעך)',
 'tog-rememberpassword' => 'געדענק מיין אריינלאגירן אין דעם בלעטערער (ביז $1 {{PLURAL:$1|טאָג|טעג}})',
@@ -1045,6 +1044,8 @@ $2
 'content-not-allowed-here' => '"$1" אינהאלט נישט דערלויבט אויף בלאט [[$2]]',
 'editwarning-warning' => 'איבערלאזן דעם בלאט קען גורם זײַן פֿארלירן אײַערע ענדערונגען.
 אויב איר זענט ארײַנלאגירט, קענט איר מבטל זײַן די דאזיגע ווארענונג אין דער "באארבעטן" אפטיילונג פון אײַערע פרעפערענצן.',
+'editpage-notsupportedcontentformat-title' => 'אינהאלט־פארמאט נישט געשטיצט',
+'editpage-notsupportedcontentformat-text' => 'דער אינהאלט־פארמאט $1 ווערט ניט געשטיצט דורכן אינהאלט־מאדעל $2.',
 
 # Content models
 'content-model-wikitext' => 'וויקיטעקסט',
@@ -2348,7 +2349,7 @@ $UNWATCHURL
 'delete-edit-reasonlist' => 'רעדאַקטירן די אויסמעקן סיבות',
 'delete-toobig' => 'דער בלאַט האט א גרויסע רעדאקטירונג היסטאריע, מער ווי $1 {{PLURAL:$1|רעוויזיע|רעוויזיעס}}. אויסמעקן אזעלכע בלעטער איז באַגרענעצט געווארן בכדי צו פֿאַרמײַדן א צופֿעליגע פֿאַרשטערונג פֿון  {{SITENAME}}.',
 'delete-warning-toobig' => 'דער בלאַט האט א גרויסע רעדאקטירונג היסטאריע, מער ווי $1 {{PLURAL:$1|רעוויזיע|רעוויזיעס}}. אויסמעקן אים קען פֿאַרשטערן דאַטנבאַזע אפעראַציעס פֿון {{SITENAME}}; זײַט פֿארזיכטיג איידער איר מעקט אויס.',
-'deleting-backlinks-warning' => "'''ווארענוג:''' אנדערע בלעטער פארבינדן צום בלאט איר האלט ביי אויסמעקן.",
+'deleting-backlinks-warning' => "'''×\95×\95×\90רענ×\95×\92:''' ×\90× ×\93ערע ×\91×\9c×¢×\98ער ×¤×\90ר×\91×\99× ×\93×\9f ×¦×\95×\9d ×\91×\9c×\90×\98 ×\90×\93ער ×\90ר×\99×\91ערש×\9c×\99ס×\9f ×¤×\95× ×¢×\9d ×\91×\9c×\90×\98 ×\90×\99ר ×\94×\90×\9c×\98 ×\91×\99×\99 ×\90×\95×\99ס×\9eעק×\9f.",
 
 # Rollback
 'rollback' => 'צוריקדרייען רעדאַקטירונגען',
@@ -2646,7 +2647,7 @@ $1',
 '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|אנדער בלאקירונג|אנדערע בלאקירונגען}}',
index 3f0e17d..0ecfdc8 100644 (file)
@@ -64,7 +64,6 @@ $messages = array(
 'tog-numberheadings' => 'Àwọn àkọlé nọmba-araẹni',
 'tog-showtoolbar' => 'Ìfihàn pẹpẹ irinṣẹ́ àtúnṣe',
 'tog-editondblclick' => "Ṣ'àtúnṣe àwọn ojúewé ní kíkàn lẹ́mẹjì",
-'tog-editsection' => 'Ìgbàláyè àtúnṣe abala láti inú [àtúnṣe] àwọn àjápọ̀',
 'tog-editsectiononrightclick' => 'Ìgbàláyè àtúnṣe abala nípa klííkì ọ̀tún lórí àkọlé abala',
 'tog-showtoc' => 'Ìfihàn tábìlì àkóónú (fún àwọn ojúewé tó ní ju orí ọ̀rọ̀ 3 lọ)',
 'tog-rememberpassword' => "Ṣè'rántí àkọọ́lẹ̀ ìwọlé mi lórí agbétàkùn yìí (fún {{PLURAL:$1|ọjọ́|ọjọ́}} $1 pípẹ́jùlọ)",
index 2e3b9c1..4e8563a 100644 (file)
@@ -244,7 +244,6 @@ $messages = array(
 'tog-numberheadings' => '標題自動編號',
 'tog-showtoolbar' => '顯示修改工具列(需要JavaScript)',
 'tog-editondblclick' => '撳兩下改嘢(需要JavaScript)',
-'tog-editsection' => '可以用 [修改] 掣更改個別段落',
 'tog-editsectiononrightclick' => '可以撳右掣更改個別段落(需要JavaScript)',
 'tog-showtoc' => '多過三段時顯示目錄',
 'tog-rememberpassword' => '響呢個瀏覽器度記住我嘅登入資料 (最高維持$1{{PLURAL:$1|日|日}})',
index fe01717..a4c1cfd 100644 (file)
@@ -73,6 +73,7 @@
  * @author Xiaomingyan
  * @author Yfdyh000
  * @author 乌拉跨氪
+ * @author 御坂美琴
  * @author 燃玉
  * @author 阿pp
  */
@@ -392,7 +393,6 @@ $messages = array(
 'tog-numberheadings' => '自动编号标题',
 'tog-showtoolbar' => '显示编辑工具栏',
 'tog-editondblclick' => '双击编辑页面',
-'tog-editsection' => '启用[编辑]链接编辑段落',
 'tog-editsectiononrightclick' => '启用右击段落标题编辑段落',
 'tog-showtoc' => '显示目录(对于有多于3个标题的页面)',
 'tog-rememberpassword' => '在该浏览器记住我的登录状态(最长$1天)',
@@ -517,7 +517,7 @@ $messages = array(
 'category-file-count-limited' => '以下{{PLURAL:$1|文件|$1个文件}}属于当前分类。',
 'listingcontinuesabbrev' => '续',
 'index-category' => '可索引页面',
-'noindex-category' => '不可索引页面',
+'noindex-category' => '禁止索引的页面',
 'broken-file-category' => '有受损文件链接的页面',
 'categoryviewer-pagedlinks' => '($1)($2)',
 
@@ -924,6 +924,7 @@ $2',
 'retypenew' => '确认密码:',
 'resetpass_submit' => '设定密码并登录',
 'changepassword-success' => '您已经修改了您的密码!',
+'changepassword-throttled' => '您最近尝试了多次登录。请等待$1后再试。',
 'resetpass_forbidden' => '无法更改密码',
 'resetpass-no-info' => '您必须登录后直接进入这个页面。',
 'resetpass-submit-loggedin' => '更改密码',
@@ -973,6 +974,7 @@ $2
 'changeemail-password' => '你的{{SITENAME}}密码:',
 'changeemail-submit' => '更改电子邮件地址',
 'changeemail-cancel' => '取消',
+'changeemail-throttled' => '您最近尝试了太多次登录。请等待$1后再试。',
 
 # Special:ResetTokens
 'resettokens' => '重置密钥',
@@ -1062,7 +1064,7 @@ $2
 'newarticletext' => "你点击了一个尚不存在的页面的链接。要创建该页面,请在下面的编辑框中输入内容(更多信息请见[[{{MediaWiki:Helppage}}|帮助页面]])。如果你是错误地到达这里,请点击你的浏览器的'''返回'''按钮。",
 'anontalkpagetext' => "---- ''这是一个还未建立账户的匿名用户的讨论页, 因此我们只能用IP地址来与他或她联络。该IP地址可能由几名用户共享。如果您是一名匿名用户并认为此页上的评语与您无关,请[[Special:UserLogin/signup|创建新账户]]或[[Special:UserLogin|登录]]以避免在未来与其他匿名用户混淆。''",
 'noarticletext' => '本页面目前没有内容。你可以在其他页面中[[Special:Search/{{PAGENAME}}|搜索本页标题]]、<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 搜索相关日志]或[{{fullurl:{{FULLPAGENAME}}|action=edit}} 编辑本页面]。</span>',
-'noarticletext-nopermission' => '本页面目前没有内容。你可以在其他页面中[[Special:Search/{{PAGENAME}}|搜索本页标题]]或<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 搜索相关日志],但你没有权限创建本页面。',
+'noarticletext-nopermission' => '本页面目前没有内容。你可以在其他页面中[[Special:Search/{{PAGENAME}}|搜索本页标题]]或<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 搜索相关日志]</span>,但你没有权限创建本页面。',
 'missing-revision' => '“{{PAGENAME}}”的修订#$1不存在。
 
 这通常是因为进入了一个已被删除的页面的历史链接。
@@ -1159,6 +1161,8 @@ $2
 'invalid-content-data' => '无效的内容数据',
 'content-not-allowed-here' => '[[$2]]页面上不允许“$1”内容',
 'editwarning-warning' => '离开本页面可能导致你失去任何你已经作出的更改。如果你处于登录状态,你可以在你的设置的“编辑”部分停用该警告。',
+'editpage-notsupportedcontentformat-title' => '内容格式尚不支持',
+'editpage-notsupportedcontentformat-text' => '内容模型$2尚不支持内容格式$1。',
 
 # Content models
 'content-model-wikitext' => 'wiki文本',
@@ -1387,6 +1391,7 @@ $1",
 'search-result-score' => '相关度:$1%',
 'search-redirect' => '(重定向自“$1”)',
 'search-section' => '(“$1”段落)',
+'search-file-match' => '(匹配文件内容)',
 'search-suggest' => '您是不是要找:$1',
 'search-interwiki-caption' => '姊妹项目',
 'search-interwiki-default' => '$1项结果:',
@@ -2438,7 +2443,7 @@ $UNWATCHURL
 'delete-edit-reasonlist' => '编辑删除原因',
 'delete-toobig' => '这个页面有一个十分大量的编辑历史,超过$1次修订。删除此类页面的动作已经被限制,以防止在{{SITENAME}}上的意外扰乱。',
 'delete-warning-toobig' => '这个页面有一个十分大量的编辑历史,超过$1次修订。删除它可能会扰乱{{SITENAME}}的数据库操作;在继续此动作前请小心。',
-'deleting-backlinks-warning' => "'''警告:'''有其他页面链接到你要删除的页面。",
+'deleting-backlinks-warning' => "'''警告:'''有其他页面链接至或transclude自您要删除的页面。",
 
 # Rollback
 'rollback' => '回退编辑',
@@ -2728,7 +2733,7 @@ $1被封禁的理由是:“$2”',
 'range_block_disabled' => '管理员执行段封禁的权限已被禁用。',
 'ipb_expiry_invalid' => '无效的终止时间。',
 'ipb_expiry_temp' => '隐藏用户名的封禁必须是永久性的。',
-'ipb_hide_invalid' => '无法隐藏此账户,它可能有太多编辑。',
+'ipb_hide_invalid' => '无法封禁此账户;它拥有多于$1次编辑。',
 'ipb_already_blocked' => '“$1”已被封禁',
 'ipb-needreblock' => '$1已被封禁。您是否想更改封禁设置?',
 'ipb-otherblocks-header' => '其他{{PLURAL:$1|封禁}}',
@@ -4152,4 +4157,7 @@ MediaWiki发表时预期有用,但对此'''无任何保证''',亦无隐含
 'expand_templates_generate_rawhtml' => '显示原始HTML',
 'expand_templates_preview' => '预览',
 
+# Unknown messages
+'createaccount-hook-aborted' => '$1',
+'uploadinvalidxml' => '上传文件中的XML无法解析。',
 );
index de658bf..b7adb9f 100644 (file)
@@ -279,7 +279,6 @@ $messages = array(
 'tog-numberheadings' => '標題自動編號',
 'tog-showtoolbar' => '顯示編輯工具欄',
 'tog-editondblclick' => '雙擊編輯頁面',
-'tog-editsection' => '允許通過點擊[編輯]連結編輯段落',
 'tog-editsectiononrightclick' => '允許右擊標題編輯段落',
 'tog-showtoc' => '顯示目錄 (針對一頁超過3個標題的頁面)',
 'tog-rememberpassword' => '在這個瀏覽器上記住我的登入狀態(最多 $1 天)',
@@ -825,6 +824,7 @@ $2',
 'retypenew' => '確認密碼:',
 'resetpass_submit' => '設定密碼並登入',
 'changepassword-success' => '您的密碼已成功變更!',
+'changepassword-throttled' => '您近期嘗試了多次登錄。請等待$1后再試。',
 'resetpass_forbidden' => '無法變更密碼',
 'resetpass-no-info' => '您必須登入後直接進入這個頁面。',
 'resetpass-submit-loggedin' => '變更密碼',
@@ -879,6 +879,7 @@ $2
 'changeemail-password' => '您的{{SITENAME}}密碼:',
 'changeemail-submit' => '變更電子郵件',
 'changeemail-cancel' => '取消',
+'changeemail-throttled' => '您近期嘗試了太多次登錄。請等待$1后再試。',
 
 # Special:ResetTokens
 'resettokens' => '重設密鑰',
@@ -1089,6 +1090,8 @@ $2
 'invalid-content-data' => '內容資料無效',
 'content-not-allowed-here' => '[[$2]]頁面上不允許「$1」內容',
 'editwarning-warning' => '離開這個頁面可能會令您失去之前作出的所有更改。若您已經登入,您可在偏好設定的「編輯」部份裡關閉此警告。',
+'editpage-notsupportedcontentformat-title' => '內容格式尚無法支援',
+'editpage-notsupportedcontentformat-text' => '內容模型$2尚無法支援內容格式$1。',
 
 # Content models
 'content-model-wikitext' => '圍記文字(Wikitext)',
@@ -1320,6 +1323,7 @@ $1",
 'search-result-score' => '相關度: $1%',
 'search-redirect' => '(重定向 $1)',
 'search-section' => '(段落 $1)',
+'search-file-match' => '(匹配檔案內容)',
 'search-suggest' => '{{GENDER:|你|妳|你}}是不是要找:$1',
 'search-interwiki-caption' => '姊妹計劃',
 'search-interwiki-default' => '$1 項結果:',
@@ -2397,7 +2401,7 @@ $UNWATCHURL
 'delete-edit-reasonlist' => '編輯刪除理由',
 'delete-toobig' => '這個頁面有一個十分大量的編輯歷史,超過$1次修訂。刪除此類頁面的動作已經被限制,以防止在{{SITENAME}}上的意外擾亂。',
 'delete-warning-toobig' => '這個頁面有一個十分大量的編輯歷史,超過$1次修訂。刪除它可能會擾亂{{SITENAME}}的資料庫操作;在繼續此動作前請小心。',
-'deleting-backlinks-warning' => "'''警告:'''您要刪除的頁面有其他頁面連接至此。",
+'deleting-backlinks-warning' => "'''警告:'''您要刪除的頁面有其他頁面連接至此或從此頁面transclude。",
 
 # Rollback
 'rollback' => '回退編輯',
@@ -2692,7 +2696,7 @@ $1被封禁的理由是“$2”',
 'range_block_disabled' => '只有管理員才能創建禁止查封的範圍。',
 'ipb_expiry_invalid' => '無效的終止時間。',
 'ipb_expiry_temp' => '隱藏用戶名封鎖必須是永久性的。',
-'ipb_hide_invalid' => '不能壓止這個賬戶;它可能有太多編輯。',
+'ipb_hide_invalid' => '不能抑制此賬戶;它擁有多於$1次編輯。',
 'ipb_already_blocked' => '已經封鎖「$1」',
 'ipb-needreblock' => '$1已經被封鎖。您是否想更改這個設定?',
 'ipb-otherblocks-header' => '其他{{PLURAL:$1|封鎖}}',
@@ -4114,4 +4118,7 @@ MediaWiki是基於使用目的而加以發佈,然而不負任何擔保責任
 'expand_templates_generate_rawhtml' => '顯示原始HTML',
 'expand_templates_preview' => '預覽',
 
+# Unknown messages
+'createaccount-hook-aborted' => '$1',
+'uploadinvalidxml' => '上載檔案中的XML無法解析。',
 );
index 09b9295..8bacb26 100644 (file)
@@ -347,15 +347,33 @@ class CopyFileBackend extends Maintenance {
                } else {
                        $dstStat = $dst->getFileStat( array( 'src' => $dPath ) );
                }
-               return (
+               // Initial fast checks to see if files are obviously different
+               $sameFast = (
                        is_array( $srcStat ) // sanity check that source exists
                        && is_array( $dstStat ) // dest exists
                        && $srcStat['size'] === $dstStat['size']
-                       && ( !$skipHash || $srcStat['mtime'] <= $dstStat['mtime'] )
-                       && ( $skipHash || $src->getFileSha1Base36( array( 'src' => $sPath, 'latest' => 1 ) )
-                               === $dst->getFileSha1Base36( array( 'src' => $dPath, 'latest' => 1 ) )
-                       )
                );
+               // More thorough checks against files
+               if ( !$sameFast ) {
+                       $same = false; // no need to look farther
+               } elseif ( isset( $srcStat['md5'] ) && isset( $dstStat['md5'] ) ) {
+                       // If MD5 was already in the stat info, just use it.
+                       // This is useful as many objects stores can return this in object listing,
+                       // so we can use it to avoid slow per-file HEADs.
+                       $same = ( $srcStat['md5'] === $dstStat['md5'] );
+               } elseif ( $skipHash ) {
+                       // This mode is good for copying to a backup location or resyncing clone
+                       // backends in FileBackendMultiWrite (since they get writes second, they have
+                       // higher timestamps). However, when copying the other way, this hits loads of
+                       // false positives (possibly 100%) and wastes a bunch of time on GETs/PUTs.
+                       $same = ( $srcStat['mtime'] <= $dstStat['mtime'] );
+               } else {
+                       // This is the slowest method which does many per-file HEADs (unless an object
+                       // store tracks SHA-1 in listings).
+                       $same = ( $src->getFileSha1Base36( array( 'src' => $sPath, 'latest' => 1 ) )
+                               === $dst->getFileSha1Base36( array( 'src' => $dPath, 'latest' => 1 ) ) );
+               }
+               return $same;
        }
 }
 
index 543156d..ebbc22c 100644 (file)
@@ -90,7 +90,6 @@ Edit
 Editor
 Education
 Egrave
-Ehcache
 Elig
 Email
 Empty
@@ -1313,7 +1312,6 @@ editusercssjs
 edituserjs
 edoe
 egrave
-ehcache
 ei
 eich
 eiinvalidparammix
index ee8c48f..32ecb1d 100644 (file)
@@ -42,6 +42,11 @@ require_once __DIR__ . '/Maintenance.php';
  * @ingroup Maintenance
  */
 class FindHooks extends Maintenance {
+       /*
+        * Hooks that are ignored
+        */
+       protected static $ignore = array( 'testRunLegacyHooks' );
+
        public function __construct() {
                parent::__construct();
                $this->mDescription = 'Find hooks that are undocumented, missing, or just plain wrong';
@@ -255,8 +260,11 @@ class FindHooks extends Maintenance {
                if ( $sort ) {
                        asort( $arr );
                }
+
                foreach ( $arr as $v ) {
-                       $this->output( "$msg: $v\n" );
+                       if ( !in_array( $v, self::$ignore ) ) {
+                               $this->output( "$msg: $v\n" );
+                       }
                }
        }
 }
index 52cb209..60bb8d8 100644 (file)
@@ -23,6 +23,8 @@
  * @author Antoine Musso <hashar@free.fr>
  */
 
+define( 'MW_SETUP_NO_CACHE', 1 );
+define( 'MW_SETUP_NO_CONTEXT', 1 );
 require_once __DIR__ . '/Maintenance.php';
 
 /**
index 83cc088..cde7d3b 100644 (file)
@@ -1,6 +1,8 @@
+# Custom tags for JSDuck 4.x
 # See also:
 # - https://github.com/senchalabs/jsduck/wiki/Tags
 # - https://github.com/senchalabs/jsduck/wiki/Custom-tags
+# - https://github.com/senchalabs/jsduck/wiki/Custom-tags/7f5c32e568eab9edc8e3365e935bcb836cb11f1d
 require 'jsduck/meta_tag'
 
 class SourceTag < JsDuck::MetaTag
@@ -67,3 +69,35 @@ class SeeTag < JsDuck::MetaTag
     end
   end
 end
+
+# As of JSDuck 5 this is in core
+class FiresTag < JsDuck::MetaTag
+  def initialize
+    @name = 'fires'
+    @multiline = true
+  end
+
+  # @param tags All matches of this tag on one class.
+  def to_html(tags)
+    doc = []
+    doc << '<h3 class="pa">Fires</h3>'
+    doc << [
+        '<ul>',
+        tags.map {|tag| render_long_event(tag) },
+        '</ul>',
+      ]
+    doc
+  end
+
+  def render_long_event(tag)
+    if tag =~ /\A(\w+)( .*)?\Z/m
+      name = $1
+      doc = $2 ? ': ' + $2 : ''
+      return [
+        '<li>',
+        format("{@link #event-#{name}} #{doc}"),
+        '</li>'
+      ]
+    end
+  end
+end
index c595980..bbe1860 100644 (file)
@@ -21,6 +21,7 @@
                                "name": "General",
                                "classes": [
                                        "mw.Title",
+                                       "mw.Uri",
                                        "mw.inspect",
                                        "mw.inspect.reports",
                                        "mw.notification",
                        {
                                "name": "API",
                                "classes": ["mw.Api*"]
+                       },
+                       {
+                               "name": "Language",
+                               "classes": [
+                                       "mw.language*",
+                                       "mw.cldr"
+                               ]
                        }
                ]
        },
        {
                "name": "Upstream",
                "groups": [
+                       {
+                               "name": "OOJS",
+                               "classes": ["OO", "OO.*"]
+                       },
                        {
                                "name": "jQuery",
                                "classes": ["jQuery", "jQuery.Event", "jQuery.Callbacks", "jQuery.Promise", "jQuery.Deferred", "jQuery.jqXHR", "QUnit"]
index e6e0f65..d0e2628 100644 (file)
@@ -13,6 +13,7 @@
                "../../resources/mediawiki/mediawiki.log.js",
                "../../resources/mediawiki/mediawiki.util.js",
                "../../resources/mediawiki/mediawiki.Title.js",
+               "../../resources/mediawiki/mediawiki.Uri.js",
                "../../resources/mediawiki/mediawiki.inspect.js",
                "../../resources/mediawiki/mediawiki.notify.js",
                "../../resources/mediawiki/mediawiki.notification.js",
@@ -21,7 +22,9 @@
                "../../resources/mediawiki.action/mediawiki.action.view.postEdit.js",
                "../../resources/mediawiki.page/mediawiki.page.startup.js",
                "../../resources/mediawiki.api",
+               "../../resources/mediawiki.language",
                "../../resources/jquery/jquery.localize.js",
-               "../../resources/jquery/jquery.spinner.js"
+               "../../resources/jquery/jquery.spinner.js",
+               "../../resources/oojs"
        ]
 }
diff --git a/maintenance/language/generateNormalizerData.php b/maintenance/language/generateNormalizerData.php
deleted file mode 100644 (file)
index b638b63..0000000
+++ /dev/null
@@ -1,160 +0,0 @@
-<?php
-/**
- * Generates normalizer data files for Arabic and Malayalam.
- *
- * 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
- */
-
-require_once __DIR__ . '/../../includes/normal/UtfNormalUtil.php';
-
-require_once __DIR__ . '/../Maintenance.php';
-
-/**
- * Generates normalizer data files for Arabic and Malayalam.
- * For NFC see includes/normal.
- *
- * @ingroup MaintenanceLanguage
- */
-class GenerateNormalizerData extends Maintenance {
-       public $dataFile;
-
-       public function __construct() {
-               parent::__construct();
-               $this->addOption( 'unicode-data-file', 'The local location of the data file ' .
-                       'from http://unicode.org/Public/UNIDATA/UnicodeData.txt', false, true );
-       }
-
-       public function execute() {
-               if ( !$this->hasOption( 'unicode-data-file' ) ) {
-                       $this->dataFile = 'UnicodeData.txt';
-                       if ( !file_exists( $this->dataFile ) ) {
-                               $this->error( "Unable to find UnicodeData.txt. Please specify " .
-                                       "its location with --unicode-data-file=<FILE>" );
-                               exit( 1 );
-                       }
-               } else {
-                       $this->dataFile = $this->getOption( 'unicode-data-file' );
-                       if ( !file_exists( $this->dataFile ) ) {
-                               $this->error( 'Unable to find the specified data file.' );
-                               exit( 1 );
-                       }
-               }
-
-               $this->generateArabic();
-               $this->generateMalayalam();
-       }
-
-       function generateArabic() {
-               $file = fopen( $this->dataFile, 'r' );
-               if ( !$file ) {
-                       $this->error( 'Unable to open the data file.' );
-                       exit( 1 );
-               }
-
-               // For the file format, see http://www.unicode.org/reports/tr44/
-               $fieldNames = array(
-                       'Code',
-                       'Name',
-                       'General_Category',
-                       'Canonical_Combining_Class',
-                       'Bidi_Class',
-                       'Decomposition_Type_Mapping',
-                       'Numeric_Type_Value',
-                       'Bidi_Mirrored',
-                       'Unicode_1_Name',
-                       'ISO_Comment',
-                       'Simple_Uppercase_Mapping',
-                       'Simple_Lowercase_Mapping',
-                       'Simple_Titlecase_Mapping'
-               );
-
-               $pairs = array();
-
-               $lineNum = 0;
-               while ( false !== ( $line = fgets( $file ) ) ) {
-                       ++$lineNum;
-
-                       # Strip comments
-                       $line = trim( substr( $line, 0, strcspn( $line, '#' ) ) );
-                       if ( $line === '' ) {
-                               continue;
-                       }
-
-                       # Split fields
-                       $numberedData = explode( ';', $line );
-                       $data = array();
-                       foreach ( $fieldNames as $number => $name ) {
-                               $data[$name] = $numberedData[$number];
-                       }
-
-                       $code = base_convert( $data['Code'], 16, 10 );
-                       if ( ( $code >= 0xFB50 && $code <= 0xFDFF ) # Arabic presentation forms A
-                               || ( $code >= 0xFE70 && $code <= 0xFEFF ) # Arabic presentation forms B
-                       ) {
-                               if ( $data['Decomposition_Type_Mapping'] === '' ) {
-                                       // No decomposition
-                                       continue;
-                               }
-                               if ( !preg_match( '/^ *(<\w*>) +([0-9A-F ]*)$/',
-                                       $data['Decomposition_Type_Mapping'], $m )
-                               ) {
-                                       $this->error( "Can't parse Decomposition_Type/Mapping on line $lineNum" );
-                                       $this->error( $line );
-                                       continue;
-                               }
-
-                               $source = hexSequenceToUtf8( $data['Code'] );
-                               $dest = hexSequenceToUtf8( $m[2] );
-                               $pairs[$source] = $dest;
-                       }
-               }
-
-               global $IP;
-               file_put_contents( "$IP/serialized/normalize-ar.ser", serialize( $pairs ) );
-               echo "ar: " . count( $pairs ) . " pairs written.\n";
-       }
-
-       function generateMalayalam() {
-               $hexPairs = array(
-                       # From http://unicode.org/versions/Unicode5.1.0/#Malayalam_Chillu_Characters
-                       '0D23 0D4D 200D' => '0D7A',
-                       '0D28 0D4D 200D' => '0D7B',
-                       '0D30 0D4D 200D' => '0D7C',
-                       '0D32 0D4D 200D' => '0D7D',
-                       '0D33 0D4D 200D' => '0D7E',
-
-                       # From http://permalink.gmane.org/gmane.science.linguistics.wikipedia.technical/46413
-                       '0D15 0D4D 200D' => '0D7F',
-               );
-
-               $pairs = array();
-               foreach ( $hexPairs as $hexSource => $hexDest ) {
-                       $source = hexSequenceToUtf8( $hexSource );
-                       $dest = hexSequenceToUtf8( $hexDest );
-                       $pairs[$source] = $dest;
-               }
-
-               global $IP;
-               file_put_contents( "$IP/serialized/normalize-ml.ser", serialize( $pairs ) );
-               echo "ml: " . count( $pairs ) . " pairs written.\n";
-       }
-}
-
-$maintClass = 'GenerateNormalizerData';
-require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/language/generateNormalizerDataAr.php b/maintenance/language/generateNormalizerDataAr.php
new file mode 100644 (file)
index 0000000..ece0450
--- /dev/null
@@ -0,0 +1,133 @@
+<?php
+/**
+ * Generates the normalizer data file for Arabic.
+ *
+ * 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
+ */
+
+require_once __DIR__ . '/../Maintenance.php';
+
+/**
+ * Generates the normalizer data file for Arabic.
+ * For NFC see includes/normal.
+ *
+ * @ingroup MaintenanceLanguage
+ */
+class GenerateNormalizerDataAr extends Maintenance {
+       public function __construct() {
+               parent::__construct();
+               $this->mDescription = 'Generate the normalizer data file for Arabic';
+               $this->addOption( 'unicode-data-file', 'The local location of the data file ' .
+                       'from http://unicode.org/Public/UNIDATA/UnicodeData.txt', false, true );
+       }
+
+       public function getDbType() {
+               return Maintenance::DB_NONE;
+       }
+
+       public function execute() {
+               if ( !$this->hasOption( 'unicode-data-file' ) ) {
+                       $dataFile = 'UnicodeData.txt';
+                       if ( !file_exists( $dataFile ) ) {
+                               $this->error( "Unable to find UnicodeData.txt. Please specify " .
+                                       "its location with --unicode-data-file=<FILE>" );
+                               exit( 1 );
+                       }
+               } else {
+                       $dataFile = $this->getOption( 'unicode-data-file' );
+                       if ( !file_exists( $dataFile ) ) {
+                               $this->error( 'Unable to find the specified data file.' );
+                               exit( 1 );
+                       }
+               }
+
+               $file = fopen( $dataFile, 'r' );
+               if ( !$file ) {
+                       $this->error( 'Unable to open the data file.' );
+                       exit( 1 );
+               }
+
+               // For the file format, see http://www.unicode.org/reports/tr44/
+               $fieldNames = array(
+                       'Code',
+                       'Name',
+                       'General_Category',
+                       'Canonical_Combining_Class',
+                       'Bidi_Class',
+                       'Decomposition_Type_Mapping',
+                       'Numeric_Type_Value_6',
+                       'Numeric_Type_Value_7',
+                       'Numeric_Type_Value_8',
+                       'Bidi_Mirrored',
+                       'Unicode_1_Name',
+                       'ISO_Comment',
+                       'Simple_Uppercase_Mapping',
+                       'Simple_Lowercase_Mapping',
+                       'Simple_Titlecase_Mapping'
+               );
+
+               $pairs = array();
+
+               $lineNum = 0;
+               while ( false !== ( $line = fgets( $file ) ) ) {
+                       ++$lineNum;
+
+                       # Strip comments
+                       $line = trim( substr( $line, 0, strcspn( $line, '#' ) ) );
+                       if ( $line === '' ) {
+                               continue;
+                       }
+
+                       # Split fields
+                       $numberedData = explode( ';', $line );
+                       $data = array();
+                       foreach ( $fieldNames as $number => $name ) {
+                               $data[$name] = $numberedData[$number];
+                       }
+
+                       $code = base_convert( $data['Code'], 16, 10 );
+                       if ( ( $code >= 0xFB50 && $code <= 0xFDFF ) # Arabic presentation forms A
+                               || ( $code >= 0xFE70 && $code <= 0xFEFF ) # Arabic presentation forms B
+                       ) {
+                               if ( $data['Decomposition_Type_Mapping'] === '' ) {
+                                       // No decomposition
+                                       continue;
+                               }
+                               if ( !preg_match( '/^ *(<\w*>) +([0-9A-F ]*)$/',
+                                       $data['Decomposition_Type_Mapping'], $m )
+                               ) {
+                                       $this->error( "Can't parse Decomposition_Type/Mapping on line $lineNum" );
+                                       $this->error( $line );
+                                       continue;
+                               }
+
+                               $source = hexSequenceToUtf8( $data['Code'] );
+                               $dest = hexSequenceToUtf8( $m[2] );
+                               $pairs[$source] = $dest;
+                       }
+               }
+
+               global $IP;
+               file_put_contents( "$IP/serialized/normalize-ar.ser", serialize( $pairs ) );
+               echo "ar: " . count( $pairs ) . " pairs written.\n";
+       }
+}
+
+$maintClass = 'GenerateNormalizerDataAr';
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/language/generateNormalizerDataMl.php b/maintenance/language/generateNormalizerDataMl.php
new file mode 100644 (file)
index 0000000..c7237cf
--- /dev/null
@@ -0,0 +1,69 @@
+<?php
+/**
+ * Generates the normalizer data file for Malayalam.
+ *
+ * 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
+ */
+
+require_once __DIR__ . '/../Maintenance.php';
+
+/**
+ * Generates the normalizer data file for Malayalam.
+ * For NFC see includes/normal.
+ *
+ * @ingroup MaintenanceLanguage
+ */
+class GenerateNormalizerDataMl extends Maintenance {
+       public function __construct() {
+               parent::__construct();
+               $this->mDescription = 'Generate the normalizer data file for Malayalam';
+       }
+
+       public function getDbType() {
+               return Maintenance::DB_NONE;
+       }
+
+       public function execute() {
+               $hexPairs = array(
+                       # From http://unicode.org/versions/Unicode5.1.0/#Malayalam_Chillu_Characters
+                       '0D23 0D4D 200D' => '0D7A',
+                       '0D28 0D4D 200D' => '0D7B',
+                       '0D30 0D4D 200D' => '0D7C',
+                       '0D32 0D4D 200D' => '0D7D',
+                       '0D33 0D4D 200D' => '0D7E',
+
+                       # From http://permalink.gmane.org/gmane.science.linguistics.wikipedia.technical/46413
+                       '0D15 0D4D 200D' => '0D7F',
+               );
+
+               $pairs = array();
+               foreach ( $hexPairs as $hexSource => $hexDest ) {
+                       $source = hexSequenceToUtf8( $hexSource );
+                       $dest = hexSequenceToUtf8( $hexDest );
+                       $pairs[$source] = $dest;
+               }
+
+               global $IP;
+               file_put_contents( "$IP/serialized/normalize-ml.ser", serialize( $pairs ) );
+               echo "ml: " . count( $pairs ) . " pairs written.\n";
+       }
+}
+
+$maintClass = 'GenerateNormalizerDataMl';
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/language/generateUtf8Case.php b/maintenance/language/generateUtf8Case.php
new file mode 100644 (file)
index 0000000..dbb70c1
--- /dev/null
@@ -0,0 +1,129 @@
+<?php
+/**
+ * Generates Utf8Case.ser from the Unicode Character Database and
+ * supplementary files.
+ *
+ * Copyright © 2004, 2008 Brion Vibber <brion@pobox.com>
+ * http://www.mediawiki.org/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup MaintenanceLanguage
+ */
+
+require_once __DIR__ . '/../Maintenance.php';
+
+/**
+ * Generates Utf8Case.ser from the Unicode Character Database and
+ * supplementary files.
+ *
+ * @ingroup MaintenanceLanguage
+ */
+class GenerateUtf8Case extends Maintenance {
+
+       public function __construct() {
+               parent::__construct();
+               $this->mDescription = 'Generate Utf8Case.ser from the Unicode Character Database ' .
+                       'and supplementary files';
+               $this->addOption( 'unicode-data-file', 'The local location of the data file ' .
+                       'from http://unicode.org/Public/UNIDATA/UnicodeData.txt', false, true );
+       }
+
+       public function getDbType() {
+               return Maintenance::DB_NONE;
+       }
+
+       public function execute() {
+               if ( !$this->hasOption( 'unicode-data-file' ) ) {
+                       $dataFile = 'UnicodeData.txt';
+                       if ( !file_exists( $dataFile ) ) {
+                               $this->error( "Unable to find UnicodeData.txt. Please specify " .
+                                       "its location with --unicode-data-file=<FILE>" );
+                               exit( 1 );
+                       }
+               } else {
+                       $dataFile = $this->getOption( 'unicode-data-file' );
+                       if ( !file_exists( $dataFile ) ) {
+                               $this->error( 'Unable to find the specified data file.' );
+                               exit( 1 );
+                       }
+               }
+
+               $file = fopen( $dataFile, 'r' );
+               if ( !$file ) {
+                       $this->error( 'Unable to open the data file.' );
+                       exit( 1 );
+               }
+
+               // For the file format, see http://www.unicode.org/reports/tr44/
+               $fieldNames = array(
+                       'Code',
+                       'Name',
+                       'General_Category',
+                       'Canonical_Combining_Class',
+                       'Bidi_Class',
+                       'Decomposition_Type_Mapping',
+                       'Numeric_Type_Value_6',
+                       'Numeric_Type_Value_7',
+                       'Numeric_Type_Value_8',
+                       'Bidi_Mirrored',
+                       'Unicode_1_Name',
+                       'ISO_Comment',
+                       'Simple_Uppercase_Mapping',
+                       'Simple_Lowercase_Mapping',
+                       'Simple_Titlecase_Mapping'
+               );
+
+               $upper = array();
+               $lower = array();
+
+               $lineNum = 0;
+               while ( false !== ( $line = fgets( $file ) ) ) {
+                       ++$lineNum;
+
+                       # Strip comments
+                       $line = trim( substr( $line, 0, strcspn( $line, '#' ) ) );
+                       if ( $line === '' ) {
+                               continue;
+                       }
+
+                       # Split fields
+                       $numberedData = explode( ';', $line );
+                       $data = array();
+                       foreach ( $fieldNames as $number => $name ) {
+                               $data[$name] = $numberedData[$number];
+                       }
+
+                       $source = hexSequenceToUtf8( $data['Code'] );
+                       if ( $data['Simple_Uppercase_Mapping'] ) {
+                               $upper[$source] = hexSequenceToUtf8( $data['Simple_Uppercase_Mapping'] );
+                       }
+                       if ( $data['Simple_Lowercase_Mapping'] ) {
+                               $lower[$source] = hexSequenceToUtf8( $data['Simple_Lowercase_Mapping'] );
+                       }
+               }
+
+               global $IP;
+               file_put_contents( "$IP/serialized/Utf8Case.ser", serialize( array(
+                       'wikiUpperChars' => $upper,
+                       'wikiLowerChars' => $lower,
+               ) ) );
+       }
+}
+
+$maintClass = 'GenerateUtf8Case';
+require_once RUN_MAINTENANCE_IF_MAIN;
index d3c70d6..e0dd8ee 100644 (file)
@@ -246,6 +246,13 @@ $wgIgnoredMessages = array(
        'tags-summary',
        'comparepages-summary',
        'resettokens-summary',
+       '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-index-php',
        'version-entrypoints-api-php',
        'version-entrypoints-load-php',
@@ -264,6 +271,7 @@ $wgIgnoredMessages = array(
        'autocomment-prefix',
        'move-redirect-text',
        'interlanguage-link-title-langonly',
+       'createaccount-hook-abort',
 );
 
 /** Optional messages, which may be translated only if changed in the target language. */
@@ -491,6 +499,8 @@ $wgOptionalMessages = array(
        'limitreport-expensivefunctioncount-value',
        'interlanguage-link-title',
        'img-lang-opt',
+       'quotation-marks',
+       'recentchanges-legend-plusminus',
 );
 
 /** Exif messages, which may be set as optional in several checks, but are generally mandatory */
index aa8f5ed..d698552 100644 (file)
@@ -37,9 +37,7 @@ $wgMessageStructure = array(
                'tog-numberheadings',
                'tog-showtoolbar',
                'tog-editondblclick',
-               'tog-editsection',
                'tog-editsectiononrightclick',
-               'tog-showtoc',
                'tog-rememberpassword',
                'tog-watchcreations',
                'tog-watchdefault',
@@ -581,6 +579,7 @@ $wgMessageStructure = array(
                'retypenew',
                'resetpass_submit',
                'changepassword-success',
+               'changepassword-throttled',
                'resetpass_forbidden',
                'resetpass-no-info',
                'resetpass-submit-loggedin',
@@ -621,6 +620,7 @@ $wgMessageStructure = array(
                'changeemail-password',
                'changeemail-submit',
                'changeemail-cancel',
+               'changeemail-throttled'
        ),
        'resettokens' => array(
                'resettokens',
@@ -766,6 +766,8 @@ $wgMessageStructure = array(
                'invalid-content-data',
                'content-not-allowed-here',
                'editwarning-warning',
+               'editpage-notsupportedcontentformat-title',
+               'editpage-notsupportedcontentformat-text',
        ),
        'contentmodels' => array(
                'content-model-wikitext',
@@ -977,6 +979,7 @@ $wgMessageStructure = array(
                'search-result-score',
                'search-redirect',
                'search-section',
+               'search-file-match',
                'search-suggest',
                'search-interwiki-caption',
                'search-interwiki-default',
@@ -2469,6 +2472,7 @@ $wgMessageStructure = array(
                'allmessages-prefix',
                'allmessages-language',
                'allmessages-filter-submit',
+               'allmessages-filter-translate',
        ),
        'thumbnails' => array(
                'thumbnail-more',
@@ -3683,6 +3687,13 @@ $wgMessageStructure = array(
                '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',
diff --git a/maintenance/locking/LockServerDaemon.php b/maintenance/locking/LockServerDaemon.php
deleted file mode 100644 (file)
index d98654e..0000000
+++ /dev/null
@@ -1,640 +0,0 @@
-<?php
-/**
- * Simple lock server daemon that accepts lock/unlock requests.
- *
- * This code should not require MediaWiki setup or PHP files.
- *
- * 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 LockManager Maintenance
- */
-
-if ( PHP_SAPI !== 'cli' ) {
-       die( "This is not a valid entry point.\n" );
-}
-error_reporting( E_ALL );
-
-// Run the server...
-set_time_limit( 0 );
-LockServerDaemon::init(
-       getopt( '', array(
-               'address:', 'port:', 'authKey:',
-               'lockTimeout::', 'maxClients::', 'maxBacklog::', 'maxLocks::',
-       ) )
-)->main();
-
-/**
- * Simple lock server daemon that accepts lock/unlock requests
- *
- * @ingroup LockManager Maintenance
- */
-class LockServerDaemon {
-       /** @var resource */
-       protected $sock; // socket to listen/accept on
-       /** @var Array */
-       protected $sessions = array(); // (session => resource)
-       /** @var Array */
-       protected $deadSessions = array(); // (session => UNIX timestamp)
-
-       /** @var LockHolder */
-       protected $lockHolder;
-
-       protected $address; // string IP address
-       protected $port; // integer
-       protected $authKey; // string key
-       protected $lockTimeout; // integer number of seconds
-       protected $maxBacklog; // integer
-       protected $maxClients; // integer
-
-       protected $startTime; // integer UNIX timestamp
-       protected $ticks = 0; // integer counter
-
-       /* @var LockServerDaemon */
-       protected static $instance = null;
-
-       /**
-        * @params $config Array
-        * @param array $config
-        * @throws Exception
-        * @return LockServerDaemon
-        */
-       public static function init( array $config ) {
-               if ( self::$instance ) {
-                       throw new Exception( 'LockServer already initialized.' );
-               }
-               foreach ( array( 'address', 'port', 'authKey' ) as $par ) {
-                       if ( !isset( $config[$par] ) ) {
-                               die( "Usage: php LockServerDaemon.php " .
-                                       "--address <address> --port <port> --authKey <key> " .
-                                       "[--lockTimeout <seconds>] " .
-                                       "[--maxLocks <integer>] [--maxClients <integer>] [--maxBacklog <integer>]\n"
-                               );
-                       }
-               }
-               self::$instance = new self( $config );
-               return self::$instance;
-       }
-
-       /**
-        * @params $config Array
-        */
-       protected function __construct( array $config ) {
-               // Required parameters...
-               $this->address = $config['address'];
-               $this->port = $config['port'];
-               $this->authKey = $config['authKey'];
-               // Parameters with defaults...
-               $this->lockTimeout = isset( $config['lockTimeout'] )
-                       ? (int)$config['lockTimeout']
-                       : 60;
-               $this->maxClients = isset( $config['maxClients'] )
-                       ? (int)$config['maxClients']
-                       : 1000; // less than default FD_SETSIZE
-               $this->maxBacklog = isset( $config['maxBacklog'] )
-                       ? (int)$config['maxBacklog']
-                       : 100;
-               $maxLocks = isset( $config['maxLocks'] )
-                       ? (int)$config['maxLocks']
-                       : 10000;
-
-               $this->lockHolder = new LockHolder( $maxLocks );
-       }
-
-       /**
-        * @throws Exception
-        * @return void
-        */
-       protected function setupServerSocket() {
-               if ( !function_exists( 'socket_create' ) ) {
-                       throw new Exception( "PHP sockets extension missing from PHP CLI mode." );
-               }
-               $sock = socket_create( AF_INET, SOCK_STREAM, SOL_TCP );
-               if ( $sock === false ) {
-                       throw new Exception( "socket_create(): " . socket_strerror( socket_last_error() ) );
-               }
-               socket_set_option( $sock, SOL_SOCKET, SO_REUSEADDR, 1 ); // bypass 2MLS
-               socket_set_nonblock( $sock ); // don't block on accept()
-               if ( socket_bind( $sock, $this->address, $this->port ) === false ) {
-                       throw new Exception( "socket_bind(): " .
-                               socket_strerror( socket_last_error( $sock ) ) );
-               } elseif ( socket_listen( $sock, $this->maxBacklog ) === false ) {
-                       throw new Exception( "socket_listen(): " .
-                               socket_strerror( socket_last_error( $sock ) ) );
-               }
-               $this->sock = $sock;
-               $this->startTime = time();
-       }
-
-       /**
-        * Entry-point function that listens to the server socket, accepts
-        * new clients, and recieves/responds to requests to lock resources.
-        */
-       public function main() {
-               $this->setupServerSocket(); // setup listening socket
-               $socketArray = new SocketArray(); // sockets being serviced
-               $socketArray->addSocket( $this->sock ); // add listening socket
-               do {
-                       list( $read, $write ) = $socketArray->socketsForSelect();
-                       if ( socket_select( $read, $write, $except = null, null ) < 1 ) {
-                               continue; // wait
-                       }
-                       // Check if there is a client trying to connect...
-                       if ( in_array( $this->sock, $read ) && $socketArray->size() < $this->maxClients ) {
-                               $newSock = socket_accept( $this->sock );
-                               if ( $newSock ) {
-                                       socket_set_option( $newSock, SOL_SOCKET, SO_KEEPALIVE, 1 );
-                                       socket_set_nonblock( $newSock ); // don't block on read()/write()
-                                       $socketArray->addSocket( $newSock );
-                               }
-                       }
-                       // Loop through all the clients that have data to read...
-                       foreach ( $read as $read_sock ) {
-                               if ( $read_sock === $this->sock ) {
-                                       continue; // skip listening socket
-                               }
-                               // Avoids PHP_NORMAL_READ per https://bugs.php.net/bug.php?id=33471
-                               $data = socket_read( $read_sock, 65535 );
-                               // Check if the client is disconnected
-                               if ( $data === false || $data === '' ) {
-                                       $socketArray->closeSocket( $read_sock );
-                                       $this->recordDeadSocket( $read_sock ); // remove session
-                               // Check if we reached the end of a message
-                               } elseif ( substr( $data, -1 ) === "\n" ) {
-                                       // Newline is the last char (given ping-pong message usage)
-                                       $cmd = $socketArray->readRcvBuffer( $read_sock ) . $data;
-                                       // Perform the requested command...
-                                       $response = $this->doCommand( rtrim( $cmd ), $read_sock );
-                                       // Send the response to the client...
-                                       $socketArray->appendSndBuffer( $read_sock, $response . "\n" );
-                               // Otherwise, we just have more message data to append
-                               } elseif ( !$socketArray->appendRcvBuffer( $read_sock, $data ) ) {
-                                       $socketArray->closeSocket( $read_sock ); // too big
-                                       $this->recordDeadSocket( $read_sock ); // remove session
-                               }
-                       }
-                       // Loop through all the clients that have data to write...
-                       foreach ( $write as $write_sock ) {
-                               $bytes = socket_write( $write_sock, $socketArray->readSndBuffer( $write_sock ) );
-                               // Check if the client is disconnected
-                               if ( $bytes === false ) {
-                                       $socketArray->closeSocket( $write_sock );
-                                       $this->recordDeadSocket( $write_sock ); // remove session
-                               // Otherwise, truncate these bytes from the start of the write buffer
-                               } else {
-                                       $socketArray->consumeSndBuffer( $write_sock, $bytes );
-                               }
-                       }
-                       // Prune dead locks every few socket events...
-                       if ( ++$this->ticks >= 9 ) {
-                               $this->ticks = 0;
-                               $this->purgeExpiredLocks();
-                       }
-               } while ( true );
-       }
-
-       /**
-        * @param $data string
-        * @param $sourceSock resource
-        * @return string
-        */
-       protected function doCommand( $data, $sourceSock ) {
-               $cmdArr = $this->getCommand( $data );
-               if ( is_string( $cmdArr ) ) {
-                       return $cmdArr; // error
-               }
-               list( $function, $session, $type, $resources ) = $cmdArr;
-               // On first command, track the session => sock correspondence
-               if ( !isset( $this->sessions[$session] ) ) {
-                       $this->sessions[$session] = $sourceSock;
-                       unset( $this->deadSessions[$session] ); // renew if dead
-               }
-               if ( $function === 'ACQUIRE' ) {
-                       return $this->lockHolder->lock( $session, $type, $resources );
-               } elseif ( $function === 'RELEASE' ) {
-                       return $this->lockHolder->unlock( $session, $type, $resources );
-               } elseif ( $function === 'RELEASE_ALL' ) {
-                       return $this->lockHolder->release( $session );
-               } elseif ( $function === 'STAT' ) {
-                       return $this->stat();
-               }
-               return 'INTERNAL_ERROR';
-       }
-
-       /**
-        * @param $data string
-        * @return Array
-        */
-       protected function getCommand( $data ) {
-               $m = explode( ':', $data ); // <session, key, command, type, values>
-               if ( count( $m ) == 5 ) {
-                       list( $session, $key, $command, $type, $values ) = $m;
-                       $goodKey = hash_hmac( 'sha1',
-                               "{$session}\n{$command}\n{$type}\n{$values}", $this->authKey );
-                       if ( $goodKey !== $key ) {
-                               return 'BAD_KEY';
-                       } elseif ( strlen( $session ) !== 32 ) {
-                               return 'BAD_SESSION';
-                       }
-                       $values = explode( '|', $values );
-                       if ( $command === 'ACQUIRE' ) {
-                               $needsLockArgs = true;
-                       } elseif ( $command === 'RELEASE' ) {
-                               $needsLockArgs = true;
-                       } elseif ( $command === 'RELEASE_ALL' ) {
-                               $needsLockArgs = false;
-                       } elseif ( $command === 'STAT' ) {
-                               $needsLockArgs = false;
-                       } else {
-                               return 'BAD_COMMAND';
-                       }
-                       if ( $needsLockArgs ) {
-                               if ( $type !== 'SH' && $type !== 'EX' ) {
-                                       return 'BAD_TYPE';
-                               }
-                               foreach ( $values as $value ) {
-                                       if ( strlen( $value ) !== 31 ) {
-                                               return 'BAD_FORMAT';
-                                       }
-                               }
-                       }
-                       return array( $command, $session, $type, $values );
-               }
-               return 'BAD_FORMAT';
-       }
-
-       /**
-        * Remove a socket's corresponding session from tracking and
-        * store it in the dead session tracking if it still has locks.
-        *
-        * @param $socket resource
-        * @return bool
-        */
-       protected function recordDeadSocket( $socket ) {
-               $session = array_search( $socket, $this->sessions );
-               if ( $session !== false ) {
-                       unset( $this->sessions[$session] );
-                       // Record recently killed sessions that still have locks
-                       if ( $this->lockHolder->sessionHasLocks( $session ) ) {
-                               $this->deadSessions[$session] = time();
-                       }
-                       return true;
-               }
-               return false;
-       }
-
-       /**
-        * Clear locks for sessions that have been dead for a while
-        *
-        * @return integer Number of sessions purged
-        */
-       protected function purgeExpiredLocks() {
-               $count = 0;
-               $now = time();
-               foreach ( $this->deadSessions as $session => $timestamp ) {
-                       if ( ( $now - $timestamp ) > $this->lockTimeout ) {
-                               $this->lockHolder->release( $session );
-                               unset( $this->deadSessions[$session] );
-                               ++$count;
-                       }
-               }
-               return $count;
-       }
-
-       /**
-        * Get the current timestamp and memory usage
-        *
-        * @return string
-        */
-       protected function stat() {
-               return ( time() - $this->startTime ) . ':' . memory_get_usage();
-       }
-}
-
-/**
- * LockServerDaemon helper class that keeps track socket states
- */
-class SocketArray {
-       /* @var Array */
-       protected $clients = array(); // array of client sockets
-       /* @var Array */
-       protected $rBuffers = array(); // corresponding socket read buffers
-       /* @var Array */
-       protected $wBuffers = array(); // corresponding socket write buffers
-
-       const BUFFER_SIZE = 65535;
-
-       /**
-        * @return Array (list of sockets to read, list of sockets to write)
-        */
-       public function socketsForSelect() {
-               $rSockets = array();
-               $wSockets = array();
-               foreach ( $this->clients as $key => $socket ) {
-                       if ( $this->wBuffers[$key] !== '' ) {
-                               $wSockets[] = $socket; // wait for writing to unblock
-                       } else {
-                               $rSockets[] = $socket; // wait for reading to unblock
-                       }
-               }
-               return array( $rSockets, $wSockets );
-       }
-
-       /**
-        * @return integer Number of client sockets
-        */
-       public function size() {
-               return count( $this->clients );
-       }
-
-       /**
-        * @param $sock resource
-        * @return bool
-        */
-       public function addSocket( $sock ) {
-               $this->clients[] = $sock;
-               $this->rBuffers[] = '';
-               $this->wBuffers[] = '';
-               return true;
-       }
-
-       /**
-        * @param $sock resource
-        * @return bool
-        */
-       public function closeSocket( $sock ) {
-               $key = array_search( $sock, $this->clients );
-               if ( $key === false ) {
-                       return false;
-               }
-               socket_close( $sock );
-               unset( $this->clients[$key] );
-               unset( $this->rBuffers[$key] );
-               unset( $this->wBuffers[$key] );
-               return true;
-       }
-
-       /**
-        * @param $sock resource
-        * @param $data string
-        * @return bool
-        */
-       public function appendRcvBuffer( $sock, $data ) {
-               $key = array_search( $sock, $this->clients );
-               if ( $key === false ) {
-                       return false;
-               } elseif ( ( strlen( $this->rBuffers[$key] ) + strlen( $data ) ) > self::BUFFER_SIZE ) {
-                       return false;
-               }
-               $this->rBuffers[$key] .= $data;
-               return true;
-       }
-
-       /**
-        * @param $sock resource
-        * @return string|bool
-        */
-       public function readRcvBuffer( $sock ) {
-               $key = array_search( $sock, $this->clients );
-               if ( $key === false ) {
-                       return false;
-               }
-               $data = $this->rBuffers[$key];
-               $this->rBuffers[$key] = ''; // consume data
-               return $data;
-       }
-
-       /**
-        * @param $sock resource
-        * @param $data string
-        * @return bool
-        */
-       public function appendSndBuffer( $sock, $data ) {
-               $key = array_search( $sock, $this->clients );
-               if ( $key === false ) {
-                       return false;
-               } elseif ( ( strlen( $this->wBuffers[$key] ) + strlen( $data ) ) > self::BUFFER_SIZE ) {
-                       return false;
-               }
-               $this->wBuffers[$key] .= $data;
-               return true;
-       }
-
-       /**
-        * @param $sock resource
-        * @return bool
-        */
-       public function readSndBuffer( $sock ) {
-               $key = array_search( $sock, $this->clients );
-               if ( $key === false ) {
-                       return false;
-               }
-               return $this->wBuffers[$key];
-       }
-
-       /**
-        * @param $sock resource
-        * @param $bytes integer
-        * @return bool
-        */
-       public function consumeSndBuffer( $sock, $bytes ) {
-               $key = array_search( $sock, $this->clients );
-               if ( $key === false ) {
-                       return false;
-               }
-               $this->wBuffers[$key] = (string)substr( $this->wBuffers[$key], $bytes );
-               return true;
-       }
-}
-
-/**
- * LockServerDaemon helper class that keeps track of the locks
- */
-class LockHolder {
-       /** @var Array */
-       protected $shLocks = array(); // (key => session => 1)
-       /** @var Array */
-       protected $exLocks = array(); // (key => session)
-
-       /** @var Array */
-       protected $sessionIndexSh = array(); // (session => key => 1)
-       /** @var Array */
-       protected $sessionIndexEx = array(); // (session => key => 1)
-       protected $lockCount = 0; // integer
-
-       protected $maxLocks; // integer
-
-       /**
-        * @params $maxLocks integer Maximum number of locks to allow
-        */
-       public function __construct( $maxLocks ) {
-               $this->maxLocks = $maxLocks;
-       }
-
-       /**
-        * @param $session string
-        * @return bool
-        */
-       public function sessionHasLocks( $session ) {
-               return isset( $this->sessionIndexSh[$session] )
-                       || isset( $this->sessionIndexEx[$session] );
-       }
-
-       /**
-        * @param $session string
-        * @param $type string
-        * @param $keys Array
-        * @return string
-        */
-       public function lock( $session, $type, array $keys ) {
-               if ( ( $this->lockCount + count( $keys ) ) > $this->maxLocks ) {
-                       return 'TOO_MANY_LOCKS';
-               }
-               if ( $type === 'SH' ) {
-                       // Check if any keys are already write-locked...
-                       foreach ( $keys as $key ) {
-                               if ( isset( $this->exLocks[$key] ) && $this->exLocks[$key] !== $session ) {
-                                       return 'CANT_ACQUIRE';
-                               }
-                       }
-                       // Acquire the read-locks...
-                       foreach ( $keys as $key ) {
-                               $this->set_sh_lock( $key, $session );
-                       }
-                       return 'ACQUIRED';
-               } elseif ( $type === 'EX' ) {
-                       // Check if any keys are already read-locked or write-locked...
-                       foreach ( $keys as $key ) {
-                               if ( isset( $this->exLocks[$key] ) && $this->exLocks[$key] !== $session ) {
-                                       return 'CANT_ACQUIRE';
-                               }
-                               if ( isset( $this->shLocks[$key] ) ) {
-                                       foreach ( $this->shLocks[$key] as $otherSession => $x ) {
-                                               if ( $otherSession !== $session ) {
-                                                       return 'CANT_ACQUIRE';
-                                               }
-                                       }
-                               }
-                       }
-                       // Acquire the write-locks...
-                       foreach ( $keys as $key ) {
-                               $this->set_ex_lock( $key, $session );
-                       }
-                       return 'ACQUIRED';
-               }
-               return 'INTERNAL_ERROR';
-       }
-
-       /**
-        * @param $session string
-        * @param $type string
-        * @param $keys Array
-        * @return string
-        */
-       public function unlock( $session, $type, array $keys ) {
-               if ( $type === 'SH' ) {
-                       foreach ( $keys as $key ) {
-                               $this->unset_sh_lock( $key, $session );
-                       }
-                       return 'RELEASED';
-               } elseif ( $type === 'EX' ) {
-                       foreach ( $keys as $key ) {
-                               $this->unset_ex_lock( $key, $session );
-                       }
-                       return 'RELEASED';
-               }
-               return 'INTERNAL_ERROR';
-       }
-
-       /**
-        * @param $session string
-        * @return string
-        */
-       public function release( $session ) {
-               if ( isset( $this->sessionIndexSh[$session] ) ) {
-                       foreach ( $this->sessionIndexSh[$session] as $key => $x ) {
-                               $this->unset_sh_lock( $key, $session );
-                       }
-               }
-               if ( isset( $this->sessionIndexEx[$session] ) ) {
-                       foreach ( $this->sessionIndexEx[$session] as $key => $x ) {
-                               $this->unset_ex_lock( $key, $session );
-                       }
-               }
-               return 'RELEASED_ALL';
-       }
-
-       /**
-        * @param $key string
-        * @param $session string
-        * @return void
-        */
-       protected function set_sh_lock( $key, $session ) {
-               if ( !isset( $this->shLocks[$key][$session] ) ) {
-                       $this->shLocks[$key][$session] = 1;
-                       $this->sessionIndexSh[$session][$key] = 1;
-                       ++$this->lockCount; // we are adding a lock
-               }
-       }
-
-       /**
-        * @param $key string
-        * @param $session string
-        * @return void
-        */
-       protected function set_ex_lock( $key, $session ) {
-               if ( !isset( $this->exLocks[$key][$session] ) ) {
-                       $this->exLocks[$key] = $session;
-                       $this->sessionIndexEx[$session][$key] = 1;
-                       ++$this->lockCount; // we are adding a lock
-               }
-       }
-
-       /**
-        * @param $key string
-        * @param $session string
-        * @return void
-        */
-       protected function unset_sh_lock( $key, $session ) {
-               if ( isset( $this->shLocks[$key][$session] ) ) {
-                       unset( $this->shLocks[$key][$session] );
-                       if ( !count( $this->shLocks[$key] ) ) {
-                               unset( $this->shLocks[$key] );
-                       }
-                       unset( $this->sessionIndexSh[$session][$key] );
-                       if ( !count( $this->sessionIndexSh[$session] ) ) {
-                               unset( $this->sessionIndexSh[$session] );
-                       }
-                       --$this->lockCount;
-               }
-       }
-
-       /**
-        * @param $key string
-        * @param $session string
-        * @return void
-        */
-       protected function unset_ex_lock( $key, $session ) {
-               if ( isset( $this->exLocks[$key] ) && $this->exLocks[$key] === $session ) {
-                       unset( $this->exLocks[$key] );
-                       unset( $this->sessionIndexEx[$session][$key] );
-                       if ( !count( $this->sessionIndexEx[$session] ) ) {
-                               unset( $this->sessionIndexEx[$session] );
-                       }
-                       --$this->lockCount;
-               }
-       }
-}
index b9eb809..2a9bb4f 100644 (file)
@@ -144,6 +144,7 @@ class RebuildRecentchanges extends Maintenance {
                                                'rc_last_oldid' => $lastOldId,
                                                'rc_new' => $new,
                                                'rc_type' => $new,
+                                               'rc_source' => $new === 1 ? RecentChange::SRC_NEW : RecentChange::SRC_EDIT,
                                                'rc_old_len' => $lastSize,
                                                'rc_new_len' => $size,
                                        ), array(
@@ -196,6 +197,7 @@ class RebuildRecentchanges extends Maintenance {
                                'rc_this_oldid' => 0,
                                'rc_last_oldid' => 0,
                                'rc_type'       => RC_LOG,
+                               'rc_source'     => $dbw->addQuotes( RecentChange::SRC_LOG ),
                                'rc_cur_id'     => $dbw->cascadingDeletes() ? 'page_id' : 'COALESCE(page_id, 0)',
                                'rc_log_type'   => 'log_type',
                                'rc_log_action' => 'log_action',
index beed720..85364ee 100644 (file)
@@ -57,25 +57,27 @@ class UpdateMediaWiki extends Maintenance {
        }
 
        function compatChecks() {
-               $test = new PhpXmlBugTester();
-               if ( !$test->ok ) {
+               // Avoid syntax error in PHP4
+               $minimumPcreVersion = constant( 'Installer::MINIMUM_PCRE_VERSION' );
+
+               list( $pcreVersion ) = explode( ' ', PCRE_VERSION, 2 );
+               if ( version_compare( $pcreVersion, $minimumPcreVersion, '<' ) ) {
                        $this->error(
-                               "Your system has a combination of PHP and libxml2 versions which is buggy\n" .
-                               "and can cause hidden data corruption in MediaWiki and other web apps.\n" .
-                               "Upgrade to PHP 5.2.9 or later and libxml2 2.7.3 or later!\n" .
-                               "ABORTING (see http://bugs.php.net/bug.php?id=45996).\n",
+                               "PCRE $minimumPcreVersion or later is required.\n" .
+                               "Your PHP binary is linked with PCRE $pcreVersion.\n\n" .
+                               "More information:\n" .
+                               "https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE\n\n" .
+                               "ABORTING.\n",
                                true );
                }
 
-               $test = new PhpRefCallBugTester;
-               $test->execute();
+               $test = new PhpXmlBugTester();
                if ( !$test->ok ) {
-                       $ver = phpversion();
                        $this->error(
-                               "PHP $ver is not compatible with MediaWiki due to a bug involving\n" .
-                               "reference parameters to __call. Upgrade to PHP 5.3.2 or higher, or \n" .
-                               "downgrade to PHP 5.3.0 to fix this.\n" .
-                               "ABORTING (see http://bugs.php.net/bug.php?id=50394 for details)\n",
+                               "Your system has a combination of PHP and libxml2 versions that is buggy\n" .
+                               "and can cause hidden data corruption in MediaWiki and other web apps.\n" .
+                               "Upgrade to libxml2 2.7.3 or later.\n" .
+                               "ABORTING (see https://bugs.php.net/bug.php?id=45996).\n",
                                true );
                }
        }
index 4de5c2f..0d9608f 100644 (file)
@@ -1,9 +1,17 @@
+MEDIAWIKI_LOAD_URL ?= http://localhost/w/load.php
+
 kss: nodecheck
 # FIXME: Use more up-to-date Ruby version
-       @node_modules/.bin/kss-node mediawiki.ui mediawiki.ui/docs -l mediawiki.ui/vector.less -t styleguide-template
+
+# Generates CSS of mediawiki.ui and mediawiki.ui.button using ResourceLoader, then applies it to the
+# KSS style guide
+       $(eval KSS_RL_TMP := $(shell mktemp /tmp/tmp.XXXXXXXXXX))
+       @curl -sG "${MEDIAWIKI_LOAD_URL}?modules=mediawiki.ui|mediawiki.ui.button&only=styles" > $(KSS_RL_TMP)
+       @node_modules/.bin/kss-node mediawiki.ui mediawiki.ui/docs --css $(KSS_RL_TMP) -t styleguide-template
        @echo Opening the generated style guide...
        @command -v xdg-open >/dev/null 2>&1 || { open ${PWD}/mediawiki.ui/docs/index.html; exit 1; }
        @xdg-open ${PWD}/mediawiki.ui/docs/index.html
+       @rm $(KSS_RL_TMP)
 
 nodecheck:
        @scripts/nodecheck.sh
index 01d4a3f..cd8e9bd 100644 (file)
@@ -1080,8 +1080,11 @@ return array(
        'mediawiki.special.changeslist' => array(
                'styles' => 'resources/mediawiki.special/mediawiki.special.changeslist.css',
        ),
-       'mediawiki.special.changeslist.js' => array(
-               'scripts' => 'resources/mediawiki.special/mediawiki.special.changeslist.js',
+       'mediawiki.special.changeslist.legend' => array(
+               'styles' => 'resources/mediawiki.special/mediawiki.special.changeslist.legend.css',
+       ),
+       'mediawiki.special.changeslist.legend.js' => array(
+               'scripts' => 'resources/mediawiki.special/mediawiki.special.changeslist.legend.js',
                'dependencies' => array(
                        'jquery.makeCollapsible',
                        'jquery.cookie',
@@ -1107,6 +1110,9 @@ return array(
                'messages' => array(
                        'prefs-tabs-navigation-hint',
                ),
+               'dependencies' => array(
+                       'mediawiki.language',
+               ),
        ),
        'mediawiki.special.recentchanges' => array(
                'scripts' => 'resources/mediawiki.special/mediawiki.special.recentchanges.js',
index 6ca21b5..324833c 100644 (file)
@@ -3,31 +3,41 @@
  * Simple local storage wrapper to save data on the browser side, supporting
  * all major browsers - IE6+, Firefox2+, Safari4+, Chrome4+ and Opera 10.5+
  *
- * Copyright (c) 2010 - 2012 Andris Reinman, andris.reinman@gmail.com
+ * Author: Andris Reinman, andris.reinman@gmail.com
  * Project homepage: www.jstorage.info
  *
- * Licensed under MIT-style license:
+ * Licensed under Unlicense:
  *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
+ * This is free and unencumbered software released into the public domain.
+ * 
+ * Anyone is free to copy, modify, publish, use, compile, sell, or
+ * distribute this software, either in source code form or as a compiled
+ * binary, for any purpose, commercial or non-commercial, and by any
+ * means.
+ * 
+ * In jurisdictions that recognize copyright laws, the author or authors
+ * of this software dedicate any and all copyright interest in the
+ * software to the public domain. We make this dedication for the benefit
+ * of the public at large and to the detriment of our heirs and
+ * successors. We intend this dedication to be an overt act of
+ * relinquishment in perpetuity of all present and future rights to this
+ * software under copyright law.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ * 
+ * For more information, please refer to <http://unlicense.org/>
  */
 
  (function(){
     var
         /* jStorage version */
-        JSTORAGE_VERSION = "0.3.0",
+        JSTORAGE_VERSION = "0.4.8",
 
         /* detect a dollar object or create one if not found */
         $ = window.jQuery || window.$ || (window.$ = {}),
         };
 
     // Break if no JSON support was found
-    if(!JSON.parse || !JSON.stringify){
+    if(!("parse" in JSON) || !("stringify" in JSON)){
         throw new Error("No JSON support found, include //cdnjs.cloudflare.com/ajax/libs/json2/20110223/json2.js to page");
     }
 
     var
         /* This is the object, that holds the cached values */
-        _storage = {},
+        _storage = {__jstorage_meta:{CRC32:{}}},
 
-        /* Actual browser storage (localStorage or globalStorage['domain']) */
+        /* Actual browser storage (localStorage or globalStorage["domain"]) */
         _storage_service = {jStorage:"{}"},
 
         /* DOM element for older IE versions, holds userData behavior */
         _pubsub_observers = {},
 
         /* skip published items older than current timestamp */
-        _pubsub_last = +new Date(), 
+        _pubsub_last = +new Date(),
 
         /* Next check for TTL */
         _ttl_timeout,
 
-        /* crc32 table */
-        _crc32Table = "00000000 77073096 EE0E612C 990951BA 076DC419 706AF48F E963A535 9E6495A3 "+
-             "0EDB8832 79DCB8A4 E0D5E91E 97D2D988 09B64C2B 7EB17CBD E7B82D07 90BF1D91 1DB71064 "+
-             "6AB020F2 F3B97148 84BE41DE 1ADAD47D 6DDDE4EB F4D4B551 83D385C7 136C9856 646BA8C0 "+
-             "FD62F97A 8A65C9EC 14015C4F 63066CD9 FA0F3D63 8D080DF5 3B6E20C8 4C69105E D56041E4 "+
-             "A2677172 3C03E4D1 4B04D447 D20D85FD A50AB56B 35B5A8FA 42B2986C DBBBC9D6 ACBCF940 "+
-             "32D86CE3 45DF5C75 DCD60DCF ABD13D59 26D930AC 51DE003A C8D75180 BFD06116 21B4F4B5 "+
-             "56B3C423 CFBA9599 B8BDA50F 2802B89E 5F058808 C60CD9B2 B10BE924 2F6F7C87 58684C11 "+
-             "C1611DAB B6662D3D 76DC4190 01DB7106 98D220BC EFD5102A 71B18589 06B6B51F 9FBFE4A5 "+
-             "E8B8D433 7807C9A2 0F00F934 9609A88E E10E9818 7F6A0DBB 086D3D2D 91646C97 E6635C01 "+
-             "6B6B51F4 1C6C6162 856530D8 F262004E 6C0695ED 1B01A57B 8208F4C1 F50FC457 65B0D9C6 "+
-             "12B7E950 8BBEB8EA FCB9887C 62DD1DDF 15DA2D49 8CD37CF3 FBD44C65 4DB26158 3AB551CE "+
-             "A3BC0074 D4BB30E2 4ADFA541 3DD895D7 A4D1C46D D3D6F4FB 4369E96A 346ED9FC AD678846 "+
-             "DA60B8D0 44042D73 33031DE5 AA0A4C5F DD0D7CC9 5005713C 270241AA BE0B1010 C90C2086 "+
-             "5768B525 206F85B3 B966D409 CE61E49F 5EDEF90E 29D9C998 B0D09822 C7D7A8B4 59B33D17 "+
-             "2EB40D81 B7BD5C3B C0BA6CAD EDB88320 9ABFB3B6 03B6E20C 74B1D29A EAD54739 9DD277AF "+
-             "04DB2615 73DC1683 E3630B12 94643B84 0D6D6A3E 7A6A5AA8 E40ECF0B 9309FF9D 0A00AE27 "+
-             "7D079EB1 F00F9344 8708A3D2 1E01F268 6906C2FE F762575D 806567CB 196C3671 6E6B06E7 "+
-             "FED41B76 89D32BE0 10DA7A5A 67DD4ACC F9B9DF6F 8EBEEFF9 17B7BE43 60B08ED5 D6D6A3E8 "+
-             "A1D1937E 38D8C2C4 4FDFF252 D1BB67F1 A6BC5767 3FB506DD 48B2364B D80D2BDA AF0A1B4C "+
-             "36034AF6 41047A60 DF60EFC3 A867DF55 316E8EEF 4669BE79 CB61B38C BC66831A 256FD2A0 "+
-             "5268E236 CC0C7795 BB0B4703 220216B9 5505262F C5BA3BBE B2BD0B28 2BB45A92 5CB36A04 "+
-             "C2D7FFA7 B5D0CF31 2CD99E8B 5BDEAE1D 9B64C2B0 EC63F226 756AA39C 026D930A 9C0906A9 "+
-             "EB0E363F 72076785 05005713 95BF4A82 E2B87A14 7BB12BAE 0CB61B38 92D28E9B E5D5BE0D "+
-             "7CDCEFB7 0BDBDF21 86D3D2D4 F1D4E242 68DDB3F8 1FDA836E 81BE16CD F6B9265B 6FB077E1 "+
-             "18B74777 88085AE6 FF0F6A70 66063BCA 11010B5C 8F659EFF F862AE69 616BFFD3 166CCF45 "+
-             "A00AE278 D70DD2EE 4E048354 3903B3C2 A7672661 D06016F7 4969474D 3E6E77DB AED16A4A "+
-             "D9D65ADC 40DF0B66 37D83BF0 A9BCAE53 DEBB9EC5 47B2CF7F 30B5FFE9 BDBDF21C CABAC28A "+
-             "53B39330 24B4A3A6 BAD03605 CDD70693 54DE5729 23D967BF B3667A2E C4614AB8 5D681B02 "+
-             "2A6F2B94 B40BBE37 C30C8EA1 5A05DF1B 2D02EF8D",
-
         /**
          * XML encoding and decoding as XML nodes can't be JSON'ized
          * XML nodes are encoded and decoded if the node is the value to be saved
             decode: function(xmlString){
                 var dom_parser = ("DOMParser" in window && (new DOMParser()).parseFromString) ||
                         (window.ActiveXObject && function(_xmlString) {
-                    var xml_doc = new ActiveXObject('Microsoft.XMLDOM');
-                    xml_doc.async = 'false';
+                    var xml_doc = new ActiveXObject("Microsoft.XMLDOM");
+                    xml_doc.async = "false";
                     xml_doc.loadXML(_xmlString);
                     return xml_doc;
                 }),
                 if(!dom_parser){
                     return false;
                 }
-                resultXML = dom_parser.call("DOMParser" in window && (new DOMParser()) || window, xmlString, 'text/xml');
+                resultXML = dom_parser.call("DOMParser" in window && (new DOMParser()) || window, xmlString, "text/xml");
                 return this.isXML(resultXML)?resultXML:false;
             }
-        },
-
-        _localStoragePolyfillSetKey = function(){};
+        };
 
 
     ////////////////////////// PRIVATE METHODS ////////////////////////
         var localStorageReallyWorks = false;
         if("localStorage" in window){
             try {
-                window.localStorage.setItem('_tmptest', 'tmpval');
+                window.localStorage.setItem("_tmptest", "tmpval");
                 localStorageReallyWorks = true;
-                window.localStorage.removeItem('_tmptest');
+                window.localStorage.removeItem("_tmptest");
             } catch(BogusQuotaExceededErrorOnIos5) {
                 // Thanks be to iOS5 Private Browsing mode which throws
                 // QUOTA_EXCEEDED_ERRROR DOM Exception 22.
         else if("globalStorage" in window){
             try {
                 if(window.globalStorage) {
-                    _storage_service = window.globalStorage[window.location.hostname];
+                    if(window.location.hostname == "localhost"){
+                        _storage_service = window.globalStorage["localhost.localdomain"];
+                    }
+                    else{
+                        _storage_service = window.globalStorage[window.location.hostname];
+                    }
                     _backend = "globalStorage";
                     _observer_update = _storage_service.jStorage_update;
                 }
         }
         /* Check if browser supports userData behavior */
         else {
-            _storage_elm = document.createElement('link');
+            _storage_elm = document.createElement("link");
             if(_storage_elm.addBehavior){
 
                 /* Use a DOM element to act as userData storage */
-                _storage_elm.style.behavior = 'url(#default#userData)';
+                _storage_elm.style.behavior = "url(#default#userData)";
 
                 /* userData element needs to be inserted into the DOM! */
-                document.getElementsByTagName('head')[0].appendChild(_storage_elm);
+                document.getElementsByTagName("head")[0].appendChild(_storage_elm);
 
                 try{
                     _storage_elm.load("jStorage");
         // remove dead keys
         _handleTTL();
 
-        // create localStorage and sessionStorage polyfills if needed
-        _createPolyfillStorage("local");
-        _createPolyfillStorage("session");
-
         // start listening for changes
         _setupObserver();
 
         }
     }
 
-    /**
-     * Create a polyfill for localStorage (type="local") or sessionStorage (type="session")
-     *
-     * @param {String} type Either "local" or "session"
-     * @param {Boolean} forceCreate If set to true, recreate the polyfill (needed with flush)
-     */
-    function _createPolyfillStorage(type, forceCreate){
-        var _skipSave = false,
-            _length = 0,
-            i, 
-            storage,
-            storage_source = {};
-
-            var rand = Math.random();
-
-        if(!forceCreate && typeof window[type+"Storage"] != "undefined"){
-            return;
-        }
-
-        // Use globalStorage for localStorage if available
-        if(type == "local" && window.globalStorage){
-            localStorage = window.globalStorage[window.location.hostname];
-            return;
-        }
-
-        // only IE6/7 from this point on 
-        if(_backend != "userDataBehavior"){
-            return;
-        }
-
-        // Remove existing storage element if available
-        if(forceCreate && window[type+"Storage"] && window[type+"Storage"].parentNode){
-            window[type+"Storage"].parentNode.removeChild(window[type+"Storage"]);
-        }
-
-        storage = document.createElement("button");
-        document.getElementsByTagName('head')[0].appendChild(storage);
-
-        if(type == "local"){
-            storage_source = _storage;
-        }else if(type == "session"){
-            _sessionStoragePolyfillUpdate();
-        }
-
-        for(i in storage_source){
-
-            if(storage_source.hasOwnProperty(i) && i != "__jstorage_meta" && i != "length" && typeof storage_source[i] != "undefined"){
-                if(!(i in storage)){
-                    _length++;
-                }
-                storage[i] = storage_source[i];
-            }
-        }
-        
-        // Polyfill API
-
-        /**
-         * Indicates how many keys are stored in the storage
-         */
-        storage.length = _length;
-
-        /**
-         * Returns the key of the nth stored value
-         * 
-         * @param {Number} n Index position
-         * @return {String} Key name of the nth stored value
-         */
-        storage.key = function(n){
-            var count = 0, i;
-            _sessionStoragePolyfillUpdate();
-            for(i in storage_source){
-                if(storage_source.hasOwnProperty(i) && i != "__jstorage_meta" && i!="length" && typeof storage_source[i] != "undefined"){
-                    if(count == n){
-                        return i;
-                    }
-                    count++;
-                }
-            }
-        }
-
-        /**
-         * Returns the current value associated with the given key
-         *
-         * @param {String} key key name
-         * @return {Mixed} Stored value
-         */
-        storage.getItem = function(key){
-            _sessionStoragePolyfillUpdate();
-            if(type == "session"){
-                return storage_source[key];
-            }
-            return $.jStorage.get(key);
-        }
-
-        /**
-         * Sets or updates value for a give key
-         *
-         * @param {String} key Key name to be updated
-         * @param {String} value String value to be stored 
-         */
-        storage.setItem = function(key, value){
-            if(typeof value == "undefined"){
-                return;
-            }
-            storage[key] = (value || "").toString();
-        }
-
-        /**
-         * Removes key from the storage
-         *
-         * @param {String} key Key name to be removed
-         */
-        storage.removeItem = function(key){
-            if(type == "local"){
-                return $.jStorage.deleteKey(key);
-            }
-
-            storage[key] = undefined;
-            
-            _skipSave = true;
-            if(key in storage){
-                storage.removeAttribute(key);
-            }
-            _skipSave = false;
-        }
-
-        /**
-         * Clear storage
-         */
-        storage.clear = function(){
-            if(type == "session"){
-                window.name = "";
-                _createPolyfillStorage("session", true);
-                return;
-            }
-            $.jStorage.flush();
-        }
-
-        if(type == "local"){
-
-            _localStoragePolyfillSetKey = function(key, value){
-                if(key == "length"){
-                    return;
-                }
-                _skipSave = true;
-                if(typeof value == "undefined"){
-                    if(key in storage){
-                        _length--;
-                        storage.removeAttribute(key);
-                    }
-                }else{
-                    if(!(key in storage)){
-                        _length++;
-                    }
-                    storage[key] = (value || "").toString();
-                }
-                storage.length = _length;
-                _skipSave = false;
-            }
-        }
-
-        function _sessionStoragePolyfillUpdate(){
-                if(type != "session"){
-                    return;
-                }
-                try{
-                    storage_source = JSON.parse(window.name || "{}");
-                }catch(E){
-                    storage_source = {};
-                }
-            }
-
-        function _sessionStoragePolyfillSave(){
-            if(type != "session"){
-                return;
-            }
-            window.name = JSON.stringify(storage_source);
-        };
-
-        storage.attachEvent("onpropertychange", function(e){
-            if(e.propertyName == "length"){
-                return;
-            }
-
-            if(_skipSave || e.propertyName == "length"){
-                return;
-            }
-
-            if(type == "local"){
-                if(!(e.propertyName in storage_source) && typeof storage[e.propertyName] != "undefined"){
-                    _length ++;
-                }
-            }else if(type == "session"){
-                _sessionStoragePolyfillUpdate();
-                if(typeof storage[e.propertyName] != "undefined" && !(e.propertyName in storage_source)){
-                    storage_source[e.propertyName] = storage[e.propertyName];
-                    _length++;
-                }else if(typeof storage[e.propertyName] == "undefined" && e.propertyName in storage_source){
-                    delete storage_source[e.propertyName];
-                    _length--;
-                }else{
-                    storage_source[e.propertyName] = storage[e.propertyName];
-                }
-
-                _sessionStoragePolyfillSave();
-                storage.length = _length;
-                return;
-            }
-
-            $.jStorage.set(e.propertyName, storage[e.propertyName]);
-            storage.length = _length;
-        });
-
-        window[type+"Storage"] = storage;
-    }
-
     /**
      * Reload data from storage when needed
      */
                     removed.push(key);
                     continue;
                 }
-                if(oldCrc32List[key] != newCrc32List[key]){
+                if(oldCrc32List[key] != newCrc32List[key] && String(oldCrc32List[key]).substr(0,2) == "2."){
                     updated.push(key);
                 }
             }
                     _observers[keys[i]][j](keys[i], action);
                 }
             }
+            if(_observers["*"]){
+                for(var j=0, jlen = _observers["*"].length; j<jlen; j++){
+                    _observers["*"][j](keys[i], action);
+                }
+            }
         }
     }
 
         var updateTime = (+new Date()).toString();
 
         if(_backend == "localStorage" || _backend == "globalStorage"){
-            _storage_service.jStorage_update = updateTime;
+            try {
+                _storage_service.jStorage_update = updateTime;
+            } catch (E8) {
+                // safari private mode has been enabled after the jStorage initialization
+                _backend = false;
+            }
         }else if(_backend == "userDataBehavior"){
             _storage_elm.setAttribute("jStorage_update", updateTime);
             _storage_elm.save("jStorage");
      * @param {String} key Key name
      */
     function _checkKey(key){
-        if(!key || (typeof key != "string" && typeof key != "number")){
-            throw new TypeError('Key name must be string or numeric');
+        if(typeof key != "string" && typeof key != "number"){
+            throw new TypeError("Key name must be string or numeric");
         }
         if(key == "__jstorage_meta"){
-            throw new TypeError('Reserved key name');
+            throw new TypeError("Reserved key name");
         }
         return true;
     }
      * Checks if there's any events on hold to be fired to listeners
      */
     function _handlePubSub(){
+        var i, len;
         if(!_storage.__jstorage_meta.PubSub){
             return;
         }
         var pubelm,
             _pubsubCurrent = _pubsub_last;
 
-        for(var i=len=_storage.__jstorage_meta.PubSub.length-1; i>=0; i--){
+        for(i=len=_storage.__jstorage_meta.PubSub.length-1; i>=0; i--){
             pubelm = _storage.__jstorage_meta.PubSub[i];
             if(pubelm[0] > _pubsub_last){
                 _pubsubCurrent = pubelm[0];
         if(_pubsub_observers[channel]){
             for(var i=0, len = _pubsub_observers[channel].length; i<len; i++){
                 // send immutable data that can't be modified by listeners
-                _pubsub_observers[channel][i](channel, JSON.parse(JSON.stringify(payload)));
+                try{
+                    _pubsub_observers[channel][i](channel, JSON.parse(JSON.stringify(payload)));
+                }catch(E){};
             }
         }
     }
         if(!_storage.__jstorage_meta.PubSub){
             _storage.__jstorage_meta.PubSub = [];
         }
-        
+
         _storage.__jstorage_meta.PubSub.unshift([+new Date, channel, payload]);
 
         _save();
         _publishChange();
     }
 
+
     /**
-     * CRC32 calculation based on http://noteslog.com/post/crc32-for-javascript/
+     * JS Implementation of MurmurHash2
+     *
+     *  SOURCE: https://github.com/garycourt/murmurhash-js (MIT licensed)
      *
-     * @param {String} str String to be hashed
-     * @param {Number} [crc] Last crc value in case of streams
+     * @author <a href="mailto:gary.court@gmail.com">Gary Court</a>
+     * @see http://github.com/garycourt/murmurhash-js
+     * @author <a href="mailto:aappleby@gmail.com">Austin Appleby</a>
+     * @see http://sites.google.com/site/murmurhash/
+     *
+     * @param {string} str ASCII only
+     * @param {number} seed Positive integer only
+     * @return {number} 32-bit positive integer hash
      */
-    function _crc32(str, crc){
-        crc = crc || 0;
-
-        var n = 0, //a number between 0 and 255
-            x = 0; //an hex number
-        crc = crc ^ (-1);
-        for(var i = 0, len = str.length; i < len; i++){
-            n = (crc ^ str.charCodeAt(i)) & 0xFF;
-            x = "0x" + _crc32Table.substr(n * 9, 8);
-            crc = (crc >>> 8)^x;
+
+    function murmurhash2_32_gc(str, seed) {
+        var
+            l = str.length,
+            h = seed ^ l,
+            i = 0,
+            k;
+
+        while (l >= 4) {
+            k =
+                ((str.charCodeAt(i) & 0xff)) |
+                ((str.charCodeAt(++i) & 0xff) << 8) |
+                ((str.charCodeAt(++i) & 0xff) << 16) |
+                ((str.charCodeAt(++i) & 0xff) << 24);
+
+            k = (((k & 0xffff) * 0x5bd1e995) + ((((k >>> 16) * 0x5bd1e995) & 0xffff) << 16));
+            k ^= k >>> 24;
+            k = (((k & 0xffff) * 0x5bd1e995) + ((((k >>> 16) * 0x5bd1e995) & 0xffff) << 16));
+
+            h = (((h & 0xffff) * 0x5bd1e995) + ((((h >>> 16) * 0x5bd1e995) & 0xffff) << 16)) ^ k;
+
+            l -= 4;
+            ++i;
+        }
+
+        switch (l) {
+            case 3: h ^= (str.charCodeAt(i + 2) & 0xff) << 16;
+            case 2: h ^= (str.charCodeAt(i + 1) & 0xff) << 8;
+            case 1: h ^= (str.charCodeAt(i) & 0xff);
+                h = (((h & 0xffff) * 0x5bd1e995) + ((((h >>> 16) * 0x5bd1e995) & 0xffff) << 16));
         }
-        return crc^(-1);
+
+        h ^= h >>> 13;
+        h = (((h & 0xffff) * 0x5bd1e995) + ((((h >>> 16) * 0x5bd1e995) & 0xffff) << 16));
+        h ^= h >>> 15;
+
+        return h >>> 0;
     }
 
     ////////////////////////// PUBLIC INTERFACE /////////////////////////
 
             _storage[key] = value;
 
-            _storage.__jstorage_meta.CRC32[key] = _crc32(JSON.stringify(value));
+            _storage.__jstorage_meta.CRC32[key] = "2." + murmurhash2_32_gc(JSON.stringify(value), 0x9747b28c);
 
             this.setTTL(key, options.TTL || 0); // also handles saving and _publishChange
 
-            _localStoragePolyfillSetKey(key, value);
-
             _fireObservers(key, "updated");
             return value;
         },
         get: function(key, def){
             _checkKey(key);
             if(key in _storage){
-                if(_storage[key] && typeof _storage[key] == "object" &&
-                        _storage[key]._is_xml &&
-                            _storage[key]._is_xml){
+                if(_storage[key] && typeof _storage[key] == "object" && _storage[key]._is_xml) {
                     return _XMLService.decode(_storage[key].xml);
                 }else{
                     return _storage[key];
                 }
             }
-            return typeof(def) == 'undefined' ? null : def;
+            return typeof(def) == "undefined" ? null : def;
         },
 
         /**
                 }
 
                 delete _storage.__jstorage_meta.CRC32[key];
-                _localStoragePolyfillSetKey(key, undefined);
 
                 _save();
                 _publishChange();
          */
         flush: function(){
             _storage = {__jstorage_meta:{CRC32:{}}};
-            _createPolyfillStorage("local", true);
             _save();
             _publishChange();
             _fireObservers(null, "flushed");
 
         /**
          * Returns an index of all used keys as an array
-         * ['key1', 'key2',..'keyN']
+         * ["key1", "key2",.."keyN"]
          *
          * @return {Array} Used keys
         */
         subscribe: function(channel, callback){
             channel = (channel || "").toString();
             if(!channel){
-                throw new TypeError('Channel not defined');
+                throw new TypeError("Channel not defined");
             }
             if(!_pubsub_observers[channel]){
                 _pubsub_observers[channel] = [];
         publish: function(channel, payload){
             channel = (channel || "").toString();
             if(!channel){
-                throw new TypeError('Channel not defined');
+                throw new TypeError("Channel not defined");
             }
 
             _publish(channel, payload);
          */
         reInit: function(){
             _reloadData();
-        }
+        },
+
+        /**
+         * Removes reference from global objects and saves it as jStorage
+         *
+         * @param {Boolean} option if needed to save object as simple "jStorage" in windows context
+         */
+         noConflict: function( saveInGlobal ) {
+            delete window.$.jStorage
+
+            if ( saveInGlobal ) {
+                window.jStorage = this;
+            }
+
+            return this;
+         }
     };
 
     // Initialize jStorage
index 38938ab..55ea7c9 100644 (file)
@@ -1,6 +1,10 @@
 /* See also jquery.makeCollapsible.js */
 .mw-collapsible-toggle {
        float: right;
+       -moz-user-select: none;
+       -webkit-user-select: none;
+       -ms-user-select: none;
+       user-select: none;
 }
 
 /* collapse links in captions should be inline */
index 04f045a..500a47a 100644 (file)
@@ -21,10 +21,10 @@ jQuery( function ( $ ) {
                $lis
                .removeClass( 'selected' )
                .each( function () {
-                       var     $li = $(this),
+                       var     $li = $( this ),
                                $inputs = $li.find( 'input[type="radio"]' ),
-                               $oldidRadio = $inputs.filter( '[name="oldid"]' ).eq(0),
-                               $diffRadio = $inputs.filter( '[name="diff"]' ).eq(0);
+                               $oldidRadio = $inputs.filter( '[name="oldid"]' ).eq( 0 ),
+                               $diffRadio = $inputs.filter( '[name="diff"]' ).eq( 0 );
 
                        if ( !$oldidRadio.length || !$diffRadio.length ) {
                                return true;
@@ -60,7 +60,7 @@ jQuery( function ( $ ) {
                                        $oldidRadio.css( 'visibility', 'hidden' );
                                }
                        }
-               });
+               } );
 
                return true;
        }
@@ -77,7 +77,7 @@ jQuery( function ( $ ) {
        // Ideally we'd use e.target instead of $historySubmitter, but e.target points
        // to the form element for submit actions, so.
        $historyCompareForm.find( '.historysubmit' ).click( function () {
-               $historySubmitter = $(this);
+               $historySubmitter = $( this );
        } );
 
        // On submit we clone the form element, remove unneeded fields in the clone
@@ -92,7 +92,7 @@ jQuery( function ( $ ) {
                if ( $historySubmitter ) {
                        $copyForm = $historyCompareForm.clone();
                        $copyRadios = $copyForm.find( '#pagehistory > li' ).find( 'input[name="diff"], input[name="oldid"]' );
-                       $copyAction = $copyForm.find( '> [name="action"]');
+                       $copyAction = $copyForm.find( '> [name="action"]' );
 
                        // Remove action=historysubmit and ids[..]=..
                        if ( $historySubmitter.hasClass( 'mw-history-compareselectedversions-button' ) ) {
@@ -110,8 +110,8 @@ jQuery( function ( $ ) {
                        // Also remove potentially conflicting id attributes that we don't need anyway
                        $copyForm
                                .css( 'display', 'none' )
-                               .find('[id]')
-                                       .removeAttr('id')
+                               .find( '[id]' )
+                                       .removeAttr( 'id' )
                                .end()
                                .insertAfter( $historyCompareForm )
                                .submit();
index 9b27e24..d23a937 100644 (file)
@@ -26,7 +26,7 @@
                $link = $( '<a>', {
                        text: showText,
                        href: '#'
-               }).click(function () {
+               } ).click( function () {
                        if ( $table.hasClass( 'collapsed' ) ) {
                                $( this ).text( hideText );
                        } else {
@@ -34,7 +34,7 @@
                        }
                        $table.toggleClass( 'expanded collapsed' );
                        return false;
-               });
+               } );
 
                $col.append( $link );
                $row.append( $col );
index 98a9c54..d61c1c6 100644 (file)
@@ -34,7 +34,7 @@
                                                } );
                                        }
                                        d.resolve( exists );
-                               })
+                               } )
                                .fail( d.reject );
 
                        return d.promise( { abort: apiPromise.abort } );
@@ -61,7 +61,7 @@
                        apiPromise = this.get( {
                                        list: 'allpages',
                                        apprefix: prefix,
-                                       apnamespace: mw.config.get('wgNamespaceIds').category
+                                       apnamespace: mw.config.get( 'wgNamespaceIds' ).category
                                } )
                                .done( function ( data ) {
                                        var texts = [];
@@ -71,7 +71,7 @@
                                                } );
                                        }
                                        d.resolve( texts );
-                               })
+                               } )
                                .fail( d.reject );
 
                        return d.promise( { abort: apiPromise.abort } );
index b2c9c08..69c36cc 100644 (file)
@@ -1,4 +1,4 @@
-/**
+/*!
  * Lower Sorbian (Dolnoserbski) language functions
  */
 
index 61c6c10..2410091 100644 (file)
@@ -1,6 +1,6 @@
-/**
- *  Finnish (Suomi) language functions
- *  @author Santhosh Thottingal
+/*!
+ * Finnish (Suomi) language functions
+ * @author Santhosh Thottingal
  */
 
 mediaWiki.language.convertGrammar = function ( word, form ) {
index 77dca75..2d6b733 100644 (file)
@@ -1,4 +1,4 @@
-/**
+/*!
  * Upper Sorbian (Hornjoserbsce) language functions
  */
 
index 23b0c12..d72a1c0 100644 (file)
@@ -1,6 +1,6 @@
-/**
- *  Hungarian language functions
- *  @author Santhosh Thottingal
+/*!
+ * Hungarian language functions
+ * @author Santhosh Thottingal
  */
 
 mediaWiki.language.convertGrammar = function ( word, form ) {
index 2711024..7fc171d 100644 (file)
@@ -1,4 +1,4 @@
-/**
+/*!
  * Latin (lingua Latina) language functions
  * @author Santhosh Thottingal
  */
index 682b390..4b50834 100644 (file)
@@ -1,9 +1,8 @@
-/**
+/*!
  * Ossetian (Ирон) language functions
  * @author Santhosh Thottingal
  */
 
-
 mediaWiki.language.convertGrammar = function ( word, form ) {
        var grammarForms = mediaWiki.language.getData( 'os', 'grammarForms' ),
                // Ending for allative case
index 5e56b66..9b63382 100644 (file)
@@ -1,4 +1,4 @@
-/**
+/*!
  * Ukrainian (Українська) language functions
  */
 
index c3023cd..f6fb8f1 100644 (file)
@@ -1,15 +1,20 @@
-/**
- *  CLDR related utility methods.
- */
 ( function ( mw ) {
        'use strict';
 
-       var cldr = {
+       /**
+        * Namespace for CLDR-related utility methods.
+        *
+        * @class
+        * @singleton
+        */
+       mw.cldr = {
                /**
-                * For the number, get the plural for index
-                * In case none of the rules passed, we return pluralRules.length
-                * That means it is the "other" form.
-                * @param number
+                * Get the plural form index for the number.
+                *
+                * In case none of the rules passed, we return `pluralRules.length` -
+                * that means it is the "other" form.
+                *
+                * @param {number} number
                 * @param {Array} pluralRules
                 * @return {number} plural form index
                 */
@@ -24,6 +29,4 @@
                }
        };
 
-       mw.cldr = cldr;
-
 }( mediaWiki ) );
index 937b89b..fd77025 100644 (file)
@@ -1,38 +1,57 @@
-/**
- * Base language object with methods for storing and getting
- * language data.
- */
 ( function ( mw ) {
-
-       var language = {
+       /**
+        * Base language object with methods related to language support, attempting to mirror some of the
+        * functionality of the Language class in MediaWiki:
+        *
+        *   - storing and retrieving language data
+        *   - transforming message syntax (`{{PLURAL:}}`, `{{GRAMMAR:}}`, `{{GENDER:}}`)
+        *   - formatting numbers
+        *
+        * @class
+        * @singleton
+        */
+       mw.language = {
                /**
-                * @var data {Object} Language related data (keyed by language,
-                * contains instances of mw.Map).
-                * @example Set data
-                * <code>
+                * Language-related data (keyed by language, contains instances of mw.Map). Loaded dynamically
+                * (see ResourceLoaderLanguageDataModule in PHP docs, aka mediawiki.language.data module).
+                *
+                * To set data:
+                *
                 *     // Override, extend or create the language data object of 'nl'
                 *     mw.language.setData( 'nl', 'myKey', 'My value' );
                 *
                 *     // Set multiple values at once
-                *     mw.language.setData( 'nl', { 'foo': 'X', 'bar': 'Y' } );
-                * </code>
-                * @example Get GrammarForms data for language 'nl':
-                * <code>
+                *     mw.language.setData( 'nl', { foo: 'X', bar: 'Y' } );
+                *
+                * To get GrammarForms data for language 'nl':
+                *
                 *     var grammarForms = mw.language.getData( 'nl', 'grammarForms' );
-                * </code>
+                *
+                * Possible data keys:
+                *
+                *  - `digitTransformTable`
+                *  - `separatorTransformTable`
+                *  - `grammarForms`
+                *  - `pluralRules`
+                *  - `digitGroupingPattern`
+                *
+                * @property
                 */
                data: {},
 
                /**
-                * Convenience method for retreiving language data by language code and data key,
-                * covering for the potential inexistance of a data object for this langiage.
-                * @param langCode {String}
-                * @param dataKey {String}
-                * @return {mixed} Value stored in the mw.Map (or undefined if there is no map for
-                  the specified langCode).
+                * Convenience method for retrieving language data.
+                *
+                * Structured by language code and data key, covering for the potential inexistence of a
+                * data object for this language.
+                *
+                * @param {string} langCode
+                * @param {string} dataKey
+                * @return {Mixed} Value stored in the mw.Map (or `undefined` if there is no map for the specified
+                *  langCode).
                 */
                getData: function ( langCode, dataKey ) {
-                       var langData = language.data;
+                       var langData = mw.language.data;
                        if ( langData && langData[langCode] instanceof mw.Map ) {
                                return langData[langCode].get( dataKey );
                        }
                },
 
                /**
-                * Convenience method for setting language data by language code and data key.
+                * Convenience method for setting language data.
+                *
                 * Creates the data mw.Map if there isn't one for the specified language already.
                 *
-                * @param langCode {String}
-                * @param dataKey {String|Object} Key or object of key/values.
-                * @param value {mixed} Value for dataKey, ignored if dataKey is an object.
+                * @param {string} langCode
+                * @param {string|Object} dataKey Key or object of key/values.
+                * @param {Mixed} value Value for dataKey, ignored if dataKey is an object.
                 */
                setData: function ( langCode, dataKey, value ) {
-                       var langData = language.data;
+                       var langData = mw.language.data;
                        if ( !( langData[langCode] instanceof mw.Map ) ) {
                                langData[langCode] = new mw.Map();
                        }
@@ -56,6 +76,4 @@
                }
        };
 
-       mw.language = language;
-
 }( mediaWiki ) );
index 3927f00..87018f6 100644 (file)
@@ -1,22 +1,21 @@
-/**
- * Localized Language support attempts to mirror some of the functionality of
- * Language.php in MediaWiki.
- * This adds methods for transforming message text.
+/*
+ * Methods for transforming message syntax.
  */
 ( function ( mw, $ ) {
 
-var language = {
+/**
+ * @class mw.language
+ */
+$.extend( mw.language, {
 
        /**
         * Process the PLURAL template substitution
         *
-        * @param {object} template Template object
-        * @format template
-        *  {
-        *      'title': [title of template],
-        *      'parameters': [template parameters]
-        *  }
-        * @example {{Template:title|params}}
+        * @private
+        * @param {Object} template Template object
+        * @param {string} template.title
+        * @param {Array} template.parameters
+        * @return {string}
         */
        procPLURAL: function ( template ) {
                if ( template.title && template.parameters && mw.language.convertPlural ) {
@@ -39,9 +38,9 @@ var language = {
        /**
         * Plural form transformations, needed for some languages.
         *
-        * @param count integer Non-localized quantifier
-        * @param forms array List of plural forms
-        * @return string Correct form for quantifier in this language
+        * @param {number} count Non-localized quantifier
+        * @param {Array} forms List of plural forms
+        * @return {string} Correct form for quantifier in this language
         */
        convertPlural: function ( count, forms ) {
                var pluralRules,
@@ -90,9 +89,10 @@ var language = {
        /**
         * Pads an array to a specific length by copying the last one element.
         *
-        * @param forms array Number of forms given to convertPlural
-        * @param count integer Number of forms required
-        * @return array Padded array of forms
+        * @private
+        * @param {Array} forms Number of forms given to convertPlural
+        * @param {number} count Number of forms required
+        * @return {Array} Padded array of forms
         */
        preConvertPlural: function ( forms, count ) {
                while ( forms.length < count ) {
@@ -103,14 +103,14 @@ var language = {
 
        /**
         * Provides an alternative text depending on specified gender.
-        * Usage {{gender:[gender|user object]|masculine|feminine|neutral}}.
+        *
+        * Usage in message text: `{{gender:[gender|user object]|masculine|feminine|neutral}}`.
         * If second or third parameter are not specified, masculine is used.
         *
         * These details may be overriden per language.
         *
-        * @param gender string male, female, or anything else for neutral.
-        * @param forms array List of gender forms
-        *
+        * @param {string} gender 'male', 'female', or anything else for neutral.
+        * @param {Array} forms List of gender forms
         * @return string
         */
        gender: function ( gender, forms ) {
@@ -129,13 +129,14 @@ var language = {
 
        /**
         * Grammatical transformations, needed for inflected languages.
-        * Invoked by putting {{grammar:form|word}} in a message.
-        * The rules can be defined in $wgGrammarForms global or grammar
-        * forms can be computed dynamically by overriding this method per language
+        * Invoked by putting `{{grammar:form|word}}` in a message.
+        *
+        * The rules can be defined in $wgGrammarForms global or computed
+        * dynamically by overriding this method per language.
         *
-        * @param word {String}
-        * @param form {String}
-        * @return {String}
+        * @param {string} word
+        * @param {string} form
+        * @return {string}
         */
        convertGrammar: function ( word, form ) {
                var grammarForms = mw.language.getData( mw.config.get( 'wgUserLanguage' ), 'grammarForms' );
@@ -145,8 +146,6 @@ var language = {
                return word;
        }
 
-};
-
-$.extend( mw.language, language );
+} );
 
 }( mediaWiki, jQuery ) );
index 3d4b7ee..5a1a5cb 100644 (file)
@@ -1,4 +1,4 @@
-/**
+/*
  * Transfer of month names from messages into mw.language.
  *
  * Loading this module also ensures the availability of appropriate messages via mw.msg.
@@ -31,6 +31,7 @@
         * Information about month names in current UI language.
         *
         * Object keys:
+        *
         * - `names`: array of month names (in nominative case in languages which have the distinction),
         *   zero-indexed
         * - `genitive`: array of month names in genitive case, zero-indexed
@@ -39,6 +40,7 @@
         *   for appropriate messages which can be passed to mw.msg.
         *
         * @property
+        * @member mw.language
         */
        mw.language.months = {
                keys: {
index fada6ce..4282a3d 100644 (file)
@@ -1,23 +1,28 @@
 /*
- * Number related utilities for mediawiki.language
+ * Number-related utilities for mediawiki.language.
  */
 ( function ( mw, $ ) {
+       /**
+        * @class mw.language
+        */
 
        /**
         * Pad a string to guarantee that it is at least `size` length by
         * filling with the character `ch` at either the start or end of the
         * string. Pads at the start, by default.
-        * example:
-        * Fill the string to length 10 with '+' characters on the right. Yields 'blah++++++'.
-        *  pad('blah', 10, '+', true);
         *
+        * Example: Fill the string to length 10 with '+' characters on the right.
+        *
+        *     pad('blah', 10, '+', true); // => 'blah++++++'
+        *
+        * @private
         * @param {string} text The string to pad
-        * @param {Number} size To provide padding
-        * @param {string} ch Character to pad, defaults to '0'
-        * @param {Boolean} end Adds padding at the end if true, otherwise pads at start
+        * @param {number} size The length to pad to
+        * @param {string} [ch='0'] Character to pad with
+        * @param {boolean} [end=false] Adds padding at the end if true, otherwise pads at start
         * @return {string}
         */
-       function pad ( text, size, ch, end ) {
+       function pad( text, size, ch, end ) {
                if ( !ch ) {
                        ch = '0';
                }
        }
 
        /**
-        * Efficiently replicate a string n times.
+        * Efficiently replicate a string `n` times.
         *
+        * @private
         * @param {string} str The string to replicate
-        * @param {Number} num Number of times to replicate the string
+        * @param {number} num Number of times to replicate the string
         * @return {string}
         */
-       function replicate ( str, num ) {
+       function replicate( str, num ) {
                if ( num <= 0 || !str ) {
                        return '';
                }
         * Adapted from dojo/number library with thanks
         * http://dojotoolkit.org/reference-guide/1.8/dojo/number.html
         *
-        * @param {Number} value the number to be formatted, ignores sign
+        * @private
+        * @param {number} value the number to be formatted, ignores sign
         * @param {string} pattern the number portion of a pattern (e.g. `#,##0.00`)
-        * @param {string} options.decimalThe decimal separator
-        * @param {string} options.group The group separator
-        *
+        * @param {Object} [options] If provided, both option keys must be present:
+        * @param {string} options.decimal The decimal separator. Defaults to: `'.'`.
+        * @param {string} options.group The group separator. Defaults to: `','`.
         * @return {string}
         */
        function commafyNumber( value, pattern, options ) {
        $.extend( mw.language, {
 
                /**
-                * Converts a number using digitTransformTable.
+                * Converts a number using #getDigitTransformTable.
                 *
-                * @param {Number} num Value to be converted
-                * @param {boolean} integer Convert the return value to an integer
-                * @return {Number|string} Formatted number
+                * @param {number} num Value to be converted
+                * @param {boolean} [integer=false] Whether to convert the return value to an integer
+                * @return {number|string} Formatted number
                 */
                convertNumber: function ( num, integer ) {
                        var i, tmp, transformTable, numberString, convertedNumber, pattern;
                        return integer ? parseInt( convertedNumber, 10 ) : convertedNumber;
                },
 
+               /**
+                * Get the  digit transform table for current UI language.
+                * @return {Object|Array}
+                */
                getDigitTransformTable: function () {
                        return mw.language.getData( mw.config.get( 'wgUserLanguage' ),
                                'digitTransformTable' ) || [];
                },
 
+               /**
+                * Get the  separator transform table for current UI language.
+                * @return {Object|Array}
+                */
                getSeparatorTransformTable: function () {
                        return mw.language.getData( mw.config.get( 'wgUserLanguage' ),
                                'separatorTransformTable' ) || [];
                },
 
                /**
-                * Apply pattern to format value as a string using as per
-                * unicode.org TR35 - http://www.unicode.org/reports/tr35/#Number_Format_Patterns.
+                * Apply pattern to format value as a string.
+                *
+                * Using patterns from [Unicode TR35](http://www.unicode.org/reports/tr35/#Number_Format_Patterns).
                 *
-                * @param {Number} value
+                * @param {number} value
                 * @param {string} pattern Pattern string as described by Unicode TR35
-                * @throws Error
-                * @returns {String}
+                * @throws {Error} If unable to find a number expression in `pattern`.
+                * @return {string}
                 */
                commafy: function ( value, pattern ) {
                        var numberPattern,
index c55c25c..5d2c271 100644 (file)
        background-image: url(@url);
 }
 
+.vertical-gradient ( @startColor: gray, @endColor: white, @startPos: 0, @endPos: 100% ) {
+       background-color: @endColor;
+       background-image: -moz-linear-gradient( top, @startColor @startPos, @endColor @endPos ); // Firefox 3.6+
+       background-image: -webkit-gradient( linear, left top, left bottom, color-stop( @startPos, @startColor ), color-stop( @endPos, @endColor ) ); // Safari 4+, Chrome 2+
+       background-image: -webkit-linear-gradient( top, @startColor @startPos, @endColor @endPos ); // Safari 5.1+, Chrome 10+
+       background-image: linear-gradient( @startColor @startPos, @endColor @endPos ); // Standard
+}
+
 /* Note gzip compression means that it is okay to embed twice */
 .background-image-svg(@svg, @fallback) {
        background-image: url(@fallback);
index 147a869..64efbb9 100644 (file)
@@ -29,7 +29,7 @@
                // Now on to justification.
                // We may still get ragged edges if someone resizes their window. Could bind to
                // that event, otoh do we really want to constantly be resizing galleries?
-               $( galleries ).each( function() {
+               $( galleries ).each( function () {
                        var lastTop,
                                $img,
                                imgWidth,
@@ -37,9 +37,9 @@
                                rows = [],
                                $gallery = $( this );
 
-                       $gallery.children( 'li' ).each( function() {
+                       $gallery.children( 'li' ).each( function () {
                                // Math.floor to be paranoid if things are off by 0.00000000001
-                               var top = Math.floor( $(this ).position().top ),
+                               var top = Math.floor( $( this ).position().top ),
                                        $this = $( this );
 
                                if ( top !== lastTop ) {
@@ -74,9 +74,9 @@
                                        captionWidth: $this.children().children( 'div.gallerytextwrapper' ).width(),
                                        height: imgHeight
                                };
-                       });
+                       } );
 
-                       (function () {
+                       ( function () {
                                var maxWidth,
                                        combinedAspect,
                                        combinedPadding,
                                                        $outerDiv.width( newWidth + padding );
                                                        $innerDiv.width( newWidth + padding );
                                                        $imageDiv.width( newWidth );
-                                                       $caption.width( curRow[j].captionWidth + (newWidth - curRow[j].imgWidth ) );
+                                                       $caption.width( curRow[j].captionWidth + ( newWidth - curRow[j].imgWidth ) );
                                                }
 
                                                hookInfo = {
index 3c93de0..8a4d526 100644 (file)
@@ -3,7 +3,7 @@
  * without a page reload. Currently, the only image formats that can be multi-page images are
  * PDF and DjVu files
  */
-( function (mw, $) {
+( function ( mw, $ ) {
 
        // Initialize ajax request variable
        var xhr;
@@ -71,7 +71,7 @@
                } );
        }
 
-       $( document ).ready( function() {
+       $( document ).ready( function () {
                // The presence of table.multipageimage signifies that this file is a multi-page image
                if ( mw.config.get( 'wgNamespaceNumber' ) === 6 && $( 'table.multipageimage' ).length !== 0 ) {
                        ajaxifyPageNavigation();
@@ -86,7 +86,7 @@
                                        if ( state ) {
                                                loadPage( state.url, true );
                                        }
-                               });
+                               } );
                        }
                }
        } );
index b1af745..5e4af7b 100644 (file)
@@ -5,32 +5,3 @@
 .mw-changeslist-line-watched .mw-title {
        font-weight: bold;
 }
-
-.mw-changeslist-legend {
-       float: right;
-       margin-left: 1em;
-       margin-bottom: 0.5em;
-       clear: right;
-       font-size: 85%;
-       line-height: 1.2em;
-       padding: 0.5em;
-       border: 1px solid #ddd;
-}
-
-.mw-changeslist-legend dl {
-       /* Parent element defines sufficient padding */
-       margin-bottom: 0;
-}
-
-.mw-changeslist-legend dt {
-       float: left;
-}
-
-.mw-changeslist-legend dd {
-       margin-left: 1.5em;
-       line-height: 1.3em;
-}
-
-.mw-changeslist-legend dd.mw-changeslist-legend-plusminus {
-       margin-left: 3.5em;
-}
diff --git a/resources/mediawiki.special/mediawiki.special.changeslist.js b/resources/mediawiki.special/mediawiki.special.changeslist.js
deleted file mode 100644 (file)
index df606f5..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-/* Remember the collapse state of the legend on recent changes and watchlist pages. */
-jQuery( document ).ready( function ( $ ) {
-       var
-               cookieName = 'changeslist-state',
-               cookieOptions = {
-                       expires: 30,
-                       path: '/'
-               },
-               isCollapsed = $.cookie( cookieName ) === 'collapsed';
-
-       $( '.mw-changeslist-legend' )
-               .makeCollapsible( {
-                       collapsed: isCollapsed
-               } )
-               .on( 'beforeExpand.mw-collapsible', function () {
-                       $.cookie( cookieName, 'expanded', cookieOptions );
-               } )
-               .on( 'beforeCollapse.mw-collapsible', function () {
-                       $.cookie( cookieName, 'collapsed', cookieOptions );
-               } );
-} );
diff --git a/resources/mediawiki.special/mediawiki.special.changeslist.legend.css b/resources/mediawiki.special/mediawiki.special.changeslist.legend.css
new file mode 100644 (file)
index 0000000..54d09b4
--- /dev/null
@@ -0,0 +1,29 @@
+/**
+ * Styling for changes list legend
+ */
+
+.mw-changeslist-legend {
+       float: right;
+       margin-left: 1em;
+       margin-bottom: 0.5em;
+       clear: right;
+       font-size: 85%;
+       line-height: 1.2em;
+       padding: 0.5em;
+       border: 1px solid #ddd;
+}
+
+.mw-changeslist-legend dl {
+       /* Parent element defines sufficient padding */
+       margin-bottom: 0;
+}
+
+.mw-changeslist-legend dt {
+       float: left;
+       margin-right: 0.5em;
+}
+
+.mw-changeslist-legend dd {
+       margin-left: 1.5em;
+       line-height: 1.3em;
+}
diff --git a/resources/mediawiki.special/mediawiki.special.changeslist.legend.js b/resources/mediawiki.special/mediawiki.special.changeslist.legend.js
new file mode 100644 (file)
index 0000000..0259155
--- /dev/null
@@ -0,0 +1,25 @@
+/**
+ * Script for changes list legend
+ */
+
+/* Remember the collapse state of the legend on recent changes and watchlist pages. */
+jQuery( document ).ready( function ( $ ) {
+       var
+               cookieName = 'changeslist-state',
+               cookieOptions = {
+                       expires: 30,
+                       path: '/'
+               },
+               isCollapsed = $.cookie( cookieName ) === 'collapsed';
+
+       $( '.mw-changeslist-legend' )
+               .makeCollapsible( {
+                       collapsed: isCollapsed
+               } )
+               .on( 'beforeExpand.mw-collapsible', function () {
+                       $.cookie( cookieName, 'expanded', cookieOptions );
+               } )
+               .on( 'beforeCollapse.mw-collapsible', function () {
+                       $.cookie( cookieName, 'collapsed', cookieOptions );
+               } );
+} );
index a560ca9..2c7421b 100644 (file)
@@ -25,7 +25,7 @@
                        // Bind onchange event handler and append to form
                        $html.append(
                                $( select ).change( function () {
-                                       window.location = QUnit.url( { useskin: $(this).val() } );
+                                       window.location = QUnit.url( { useskin: $( this ).val() } );
                                } )
                        );
 
index 3302ec6..3842064 100644 (file)
@@ -11,7 +11,7 @@ jQuery( function ( $ ) {
        };
 
        $( '#prefsubmit' ).attr( 'id', 'prefcontrol' );
-       $preftoc = $('<ul id="preftoc"></ul>')
+       $preftoc = $( '<ul id="preftoc"></ul>' )
                .attr( 'role', 'tablist' );
        $preferences = $( '#preferences' )
                .addClass( 'jsprefs' )
@@ -34,7 +34,7 @@ jQuery( function ( $ ) {
        $( '<div>' ).addClass( 'mw-navigation-hint' )
                .text( mediaWiki.msg( 'prefs-tabs-navigation-hint' ) )
                .attr( 'tabIndex', 0 )
-               .on( 'focus blur', function( e ) {
+               .on( 'focus blur', function ( e ) {
                        if ( e.type === 'blur' || e.type === 'focusout' ) {
                                $( this ).css( 'height', '0' );
                        } else {
@@ -81,7 +81,7 @@ jQuery( function ( $ ) {
 
        // Populate the prefToc
        $legends.each( function ( i, legend ) {
-               var $legend = $(legend),
+               var $legend = $( legend ),
                        ident, $li, $a;
                if ( i === 0 ) {
                        $legend.parent().show();
@@ -106,7 +106,7 @@ jQuery( function ( $ ) {
        } );
 
        // Enable keyboard users to use left and right keys to switch tabs
-       $preftoc.on( 'keydown', function( event ) {
+       $preftoc.on( 'keydown', function ( event ) {
                var keyLeft = 37,
                        keyRight = 39,
                        $el;
@@ -139,14 +139,14 @@ jQuery( function ( $ ) {
        if ( 'onhashchange' in window &&
                ( document.documentMode === undefined || document.documentMode >= 8 )
        ) {
-               $(window).on( 'hashchange' , function () {
+               $( window ).on( 'hashchange' , function () {
                        var hash = window.location.hash;
                        if ( hash.match( /^#mw-prefsection-[\w\-]+/ ) ) {
                                switchPrefTab( hash.replace( '#mw-prefsection-', '' ) );
                        } else if ( hash === '' ) {
                                switchPrefTab( 'personal', 'noHash' );
                        }
-               });
+               } );
        // In older browsers we'll bind a click handler as fallback.
        // We must not have onhashchange *and* the click handlers, other wise
        // the click handler calls switchPrefTab() which sets the hash value,
@@ -155,7 +155,7 @@ jQuery( function ( $ ) {
                $preftoc.on( 'click', 'li a', function ( e ) {
                        switchPrefTab( $( this ).attr( 'href' ).replace( '#mw-prefsection-', '' ) );
                        e.preventDefault();
-               });
+               } );
        }
 
        /**
@@ -229,7 +229,7 @@ jQuery( function ( $ ) {
                while ( localTime >= 1440 ) {
                        localTime -= 1440;
                }
-               $localtimeHolder.text( minutesToHours( localTime ) );
+               $localtimeHolder.text( mediaWiki.language.convertNumber( minutesToHours( localTime ) ) );
        }
 
        if ( $tzSelect.length && $tzTextbox.length ) {
index 035252b..b847f7d 100644 (file)
                }
 
                // Create check all/none button
-               $checkboxes = $('#powersearch input[id^=mw-search-ns]');
-               $('#mw-search-togglebox').append(
-                       $('<label>')
-                               .text(mw.msg('powersearch-togglelabel'))
+               $checkboxes = $( '#powersearch input[id^=mw-search-ns]' );
+               $( '#mw-search-togglebox' ).append(
+                       $( '<label>' )
+                               .text( mw.msg( 'powersearch-togglelabel' ) )
                ).append(
-                       $('<input type="button" />')
+                       $( '<input type="button" />' )
                                .attr( 'id', 'mw-search-toggleall' )
-                               .prop( 'value', mw.msg('powersearch-toggleall' ) )
+                               .prop( 'value', mw.msg( 'powersearch-toggleall' ) )
                                .click( function () {
-                                       $checkboxes.prop('checked', true);
+                                       $checkboxes.prop( 'checked', true );
                                } )
                ).append(
-                       $('<input type="button" />')
+                       $( '<input type="button" />' )
                                .attr( 'id', 'mw-search-togglenone' )
-                               .prop( 'value', mw.msg('powersearch-togglenone' ) )
-                               .click( function() {
+                               .prop( 'value', mw.msg( 'powersearch-togglenone' ) )
+                               .click( function () {
                                        $checkboxes.prop( 'checked', false );
                                } )
                );
                // Change the header search links to what user entered
                $headerLinks = $( '.search-types a' );
                $( '#searchText, #powerSearchText' ).change( function () {
-                       var searchterm = $(this).val();
+                       var searchterm = $( this ).val();
                        $headerLinks.each( function () {
-                               var parts = $(this).attr('href').split( 'search=' ),
+                               var parts = $( this ).attr( 'href' ).split( 'search=' ),
                                        lastpart = '',
                                        prefix = 'search=';
-                               if ( parts.length > 1 && parts[1].indexOf('&') >= 0 ) {
-                                       lastpart = parts[1].substring( parts[1].indexOf('&') );
+                               if ( parts.length > 1 && parts[1].indexOf( '&' ) >= 0 ) {
+                                       lastpart = parts[1].substring( parts[1].indexOf( '&' ) );
                                } else {
                                        prefix = '&search=';
                                }
                                this.href = parts[0] + prefix + encodeURIComponent( searchterm ) + lastpart;
-                       });
-               }).trigger( 'change' );
+                       } );
+               } ).trigger( 'change' );
 
        } );
 
index 3f40c54..4ee3de3 100644 (file)
@@ -57,7 +57,7 @@
                        thumb.find( '.filename' ).text( file.name ).end()
                                .find( '.fileinfo' ).text( prettySize( file.size ) ).end();
 
-                       $canvas = $('<canvas width="' + previewSize + '" height="' + previewSize + '" ></canvas>');
+                       $canvas = $( '<canvas width="' + previewSize + '" height="' + previewSize + '" ></canvas>' );
                        ctx = $canvas[0].getContext( '2d' );
                        $( '#mw-htmlform-source' ).parent().prepend( thumb );
 
@@ -93,8 +93,8 @@
                                                width = img.width / img.height * previewSize;
                                        }
                                        // Determine the offset required to center the image
-                                       dx = (180 - width) / 2;
-                                       dy = (180 - height) / 2;
+                                       dx = ( 180 - width ) / 2;
+                                       dy = ( 180 - height ) / 2;
                                        switch ( rotation ) {
                                                // If a rotation is applied, the direction of the axis
                                                // changes as well. You can derive the values below by
                                        ctx.clearRect( 0, 0, 180, 180 );
                                        ctx.rotate( rotation / 180 * Math.PI );
                                        ctx.drawImage( img, x, y, width, height );
-                                       thumb.find('.mw-small-spinner').replaceWith($canvas);
+                                       thumb.find( '.mw-small-spinner' ).replaceWith( $canvas );
 
                                        // Image size
                                        info = mw.msg( 'widthheight', logicalWidth, logicalHeight ) +
                        if ( callbackBinary && 'readAsBinaryString' in reader ) {
                                // To fetch JPEG metadata we need a binary string; start there.
                                // todo:
-                               reader.onload = function() {
+                               reader.onload = function () {
                                        callbackBinary( reader.result );
 
                                        // Now run back through the regular code path.
                                // readAsArrayBuffer replaces readAsBinaryString
                                // However, our JPEG metadata library wants a string.
                                // So, this is going to be an ugly conversion.
-                               reader.onload = function() {
+                               reader.onload = function () {
                                        var i,
                                                buffer = new Uint8Array( reader.result ),
                                                string = '';
                }
 
                for ( i = $rows.length; i; i-- ) {
-                       $row = $rows.eq(i - 1);
+                       $row = $rows.eq( i - 1 );
                        $row
                                .find( 'input[name="wpSourceType"]' )
                                .change( createHandler( $row ) );
index 51770fd..32c3f1e 100644 (file)
 
                /**
                 * Example to declare existing titles:
-                *     Title.exist.set(['User:John_Doe', ...]);
+                *     Title.exist.set( ['User:John_Doe', ...] );
                 * Eample to declare titles nonexistent:
-                *     Title.exist.set(['File:Foo_bar.jpg', ...], false);
+                *     Title.exist.set( ['File:Foo_bar.jpg', ...], false );
                 *
                 * @static
                 * @property exist.set
index 98d7e82..a750106 100644 (file)
@@ -1,16 +1,13 @@
 /**
- * Library for simple URI parsing and manipulation.  Requires jQuery.
+ * Library for simple URI parsing and manipulation. Dependencies: mw, jQuery.
  *
- * Do not expect full RFC 3986 compliance. Intended to be minimal, but featureful.
- * The use cases we have in mind are constructing 'next page' or 'previous page' URLs,
- * detecting whether we need to use cross-domain proxies for an API, constructing
- * simple URL-based API calls, etc.
+ * Intended to be minimal, but featureful; do not expect full RFC 3986 compliance. The use cases we
+ * have in mind are constructing 'next page' or 'previous page' URLs, detecting whether we need to
+ * use cross-domain proxies for an API, constructing simple URL-based API calls, etc. Parsing here
+ * is regex-based, so may not work on all URIs, but is good enough for most.
  *
- * Intended to compress very well if you use a JS-parsing minifier.
- *
- * Dependencies: mw, jQuery
- *
- * Example:
+ * You can modify the properties directly, then use the #toString method to extract the full URI
+ * string again. Example:
  *
  *     var uri = new mw.Uri( 'http://example.com/mysite/mypage.php?quux=2' );
  *
  *         // anchor with id 'id2' now links to http://foo.example.com/mysite/mypage.php?bar=3&quux=2&pif=paf
  *     }
  *
- * Parsing here is regex based, so may not work on all URIs, but is good enough for most.
- *
  * Given a URI like
- * 'http://usr:pwd@www.example.com:81/dir/dir.2/index.htm?q1=0&&test1&test2=&test3=value+%28escaped%29&r=1&r=2#top':
- * The returned object will have the following properties:
+ * `http://usr:pwd@www.example.com:81/dir/dir.2/index.htm?q1=0&&test1&test2=&test3=value+%28escaped%29&r=1&r=2#top`
+ * the returned object will have the following properties:
  *
- *    protocol  'http'
- *    user      'usr'
- *    password  'pwd'
- *    host      'www.example.com'
- *    port      '81'
- *    path      '/dir/dir.2/index.htm'
- *    query     {
- *                  q1: 0,
- *                  test1: null,
- *                  test2: '',
- *                  test3: 'value (escaped)'
- *                  r: [1, 2]
- *              }
- *    fragment  'top'
+ *     protocol  'http'
+ *     user      'usr'
+ *     password  'pwd'
+ *     host      'www.example.com'
+ *     port      '81'
+ *     path      '/dir/dir.2/index.htm'
+ *     query     {
+ *                   q1: '0',
+ *                   test1: null,
+ *                   test2: '',
+ *                   test3: 'value (escaped)'
+ *                   r: ['1', '2']
+ *               }
+ *     fragment  'top'
  *
- * n.b. 'password' is not technically allowed for HTTP URIs, but it is possible with other
- * sorts of URIs.
- * You can modify the properties directly. Then use the toString() method to extract the
- * full URI string again.
+ * (N.b., 'password' is technically not allowed for HTTP URIs, but it is possible with other kinds
+ * of URIs.)
  *
- * Parsing based on parseUri 1.2.2 (c) Steven Levithan <stevenlevithan.com> MIT License
+ * Parsing based on parseUri 1.2.2 (c) Steven Levithan <stevenlevithan.com>, MIT License.
  * http://stevenlevithan.com/demo/parseuri/js/
  *
+ * @class mw.Uri
  */
 
 ( function ( mw, $ ) {
-
        /**
-        * Function that's useful when constructing the URI string -- we frequently encounter the pattern of
-        * having to add something to the URI as we go, but only if it's present, and to include a character before or after if so.
-        * @param {string|undefined} pre To prepend.
-        * @param {string} val To include.
-        * @param {string} post To append.
-        * @param {boolean} raw If true, val will not be encoded.
-        * @return {string} Result.
+        * Function that's useful when constructing the URI string -- we frequently encounter the pattern
+        * of having to add something to the URI as we go, but only if it's present, and to include a
+        * character before or after if so.
+        *
+        * @private
+        * @static
+        * @param {string|undefined} pre To prepend
+        * @param {string} val To include
+        * @param {string} post To append
+        * @param {boolean} raw If true, val will not be encoded
+        * @return {string} Result
         */
        function cat( pre, val, post, raw ) {
                if ( val === undefined || val === null || val === '' ) {
                return pre + ( raw ? val : mw.Uri.encode( val ) ) + post;
        }
 
-       // Regular expressions to parse many common URIs.
+       /**
+        * Regular expressions to parse many common URIs.
+        *
+        * @private
+        * @static
+        * @property {Object} parser
+        */
        var parser = {
                strict: /^(?:([^:\/?#]+):)?(?:\/\/(?:(?:([^:@\/?#]*)(?::([^:@\/?#]*))?)?@)?([^:\/?#]*)(?::(\d*))?)?((?:[^?#\/]*\/)*[^?#]*)(?:\?([^#]*))?(?:#(.*))?/,
                loose:  /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?(?:(?:([^:@\/?#]*)(?::([^:@\/?#]*))?)?@)?([^:\/?#]*)(?::(\d*))?((?:\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?[^?#\/]*)(?:\?([^#]*))?(?:#(.*))?/
        },
 
-       // The order here matches the order of captured matches in the above parser regexes.
+       /**
+        * The order here matches the order of captured matches in the `parser` property regexes.
+        *
+        * @private
+        * @static
+        * @property {Array} properties
+        */
        properties = [
-               'protocol',  // http
-               'user',      // usr
-               'password',  // pwd
-               'host',      // www.example.com
-               'port',      // 81
-               'path',      // /dir/dir.2/index.htm
-               'query',     // q1=0&&test1&test2=value (will become { q1: '0', test1: '', test2: 'value' } )
-               'fragment'   // top
+               'protocol',
+               'user',
+               'password',
+               'host',
+               'port',
+               'path',
+               'query',
+               'fragment'
        ];
 
+       /**
+        * @property {string} protocol For example `http` (always present)
+        */
+       /**
+        * @property {string|undefined} user For example `usr`
+        */
+       /**
+        * @property {string|undefined} password For example `pwd`
+        */
+       /**
+        * @property {string} host For example `www.example.com` (always present)
+        */
+       /**
+        * @property {string|undefined} port For example `81`
+        */
+       /**
+        * @property {string} path For example `/dir/dir.2/index.htm` (always present)
+        */
+       /**
+        * @property {Object} query For example `{ a: '0', b: '', c: 'value' }` (always present)
+        */
+       /**
+        * @property {string|undefined} fragment For example `top`
+        */
 
        /**
-        * We use a factory to inject a document location, for relative URLs, including protocol-relative URLs.
-        * so the library is still testable & purely functional.
+        * A factory method to create a variation of mw.Uri with a different default location (for
+        * relative URLs, including protocol-relative URLs). Used so the library is still testable &
+        * purely functional.
+        *
+        * @method
+        * @member mw
         */
        mw.UriRelative = function ( documentLocation ) {
                var defaultUri;
 
                /**
-                * Constructs URI object. Throws error if arguments are illegal/impossible, or otherwise don't parse.
+                * @class mw.Uri
                 * @constructor
-                * @param {Object|string} uri URI string, or an Object with appropriate properties (especially another URI object to clone).
-                * Object must have non-blank 'protocol', 'host', and 'path' properties.
-                *  This parameter is optional. If omitted (or set to undefined, null or empty string), then an object will be created
-                *  for the default uri of this constructor (e.g. document.location for mw.Uri in MediaWiki core).
-                * @param {Object|boolean} Object with options, or (backwards compatibility) a boolean for strictMode
-                *  - {boolean} strictMode Trigger strict mode parsing of the url. Default: false
-                *  - {boolean} overrideKeys Wether to let duplicate query parameters override eachother (true) or automagically
-                *     convert to an array (false, default).
+                *
+                * Construct a new URI object. Throws error if arguments are illegal/impossible, or
+                * otherwise don't parse.
+                *
+                * @param {Object|string} [uri] URI string, or an Object with appropriate properties (especially
+                *  another URI object to clone). Object must have non-blank `protocol`, `host`, and `path`
+                *  properties. If omitted (or set to `undefined`, `null` or empty string), then an object
+                *  will be created for the default `uri` of this constructor (`document.location` for
+                *  mw.Uri, other values for other instances -- see mw.UriRelative for details).
+                * @param {Object|boolean} [options] Object with options, or (backwards compatibility) a boolean
+                *  for strictMode
+                * @param {boolean} [options.strictMode=false] Trigger strict mode parsing of the url.
+                * @param {boolean} [options.overrideKeys=false] Whether to let duplicate query parameters
+                *  override each other (`true`) or automagically convert them to an array (`false`).
                 */
                function Uri( uri, options ) {
                        options = typeof options === 'object' ? options : { strictMode: !!options };
                }
 
                /**
-                * Standard encodeURIComponent, with extra stuff to make all browsers work similarly and more compliant with RFC 3986
-                * Similar to rawurlencode from PHP and our JS library mw.util.rawurlencode, but we also replace space with a +
-                * @param {string} s String to encode.
-                * @return {string} Encoded string for URI.
+                * Encode a value for inclusion in a url.
+                *
+                * Standard encodeURIComponent, with extra stuff to make all browsers work similarly and more
+                * compliant with RFC 3986. Similar to rawurlencode from PHP and our JS library
+                * mw.util.rawurlencode, except this also replaces spaces with `+`.
+                *
+                * @static
+                * @param {string} s String to encode
+                * @return {string} Encoded string for URI
                 */
                Uri.encode = function ( s ) {
                        return encodeURIComponent( s )
-                               .replace( /!/g, '%21').replace( /'/g, '%27').replace( /\(/g, '%28')
-                               .replace( /\)/g, '%29').replace( /\*/g, '%2A')
+                               .replace( /!/g, '%21' ).replace( /'/g, '%27' ).replace( /\(/g, '%28' )
+                               .replace( /\)/g, '%29' ).replace( /\*/g, '%2A' )
                                .replace( /%20/g, '+' );
                };
 
                /**
-                * Standard decodeURIComponent, with '+' to space.
-                * @param {string} s String encoded for URI.
-                * @return {string} Decoded string.
+                * Decode a url encoded value.
+                *
+                * Reversed #encode. Standard decodeURIComponent, with addition of replacing
+                * `+` with a space.
+                *
+                * @static
+                * @param {string} s String to decode
+                * @return {string} Decoded string
                 */
                Uri.decode = function ( s ) {
                        return decodeURIComponent( s.replace( /\+/g, '%20' ) );
 
                        /**
                         * Parse a string and set our properties accordingly.
-                        * @param {string} str URI
-                        * @param {Object} options
-                        * @return {boolean} Success.
+                        *
+                        * @private
+                        * @param {string} str URI, see constructor.
+                        * @param {Object} options See constructor.
                         */
                        parse: function ( str, options ) {
-                               var q,
-                                       uri = this,
-                                       matches = parser[ options.strictMode ? 'strict' : 'loose' ].exec( str );
+                               var q, matches,
+                                       uri = this;
+
+                               // Apply parser regex and set all properties based on the result
+                               matches = parser[ options.strictMode ? 'strict' : 'loose' ].exec( str );
                                $.each( properties, function ( i, property ) {
                                        uri[ property ] = matches[ i + 1 ];
                                } );
                                                }
                                        } );
                                }
-                               this.query = q;
+                               uri.query = q;
                        },
 
                        /**
-                        * Returns user and password portion of a URI.
+                        * Get user and password section of a URI.
+                        *
                         * @return {string}
                         */
                        getUserInfo: function () {
                        },
 
                        /**
-                        * Gets host and port portion of a URI.
+                        * Get host and port section of a URI.
+                        *
                         * @return {string}
                         */
                        getHostPort: function () {
                        },
 
                        /**
-                        * Returns the userInfo and host and port portion of the URI.
-                        * In most real-world URLs, this is simply the hostname, but it is more general.
+                        * Get the userInfo, host and port section of the URI.
+                        *
+                        * In most real-world URLs this is simply the hostname, but the definition of 'authority' section is more general.
+                        *
                         * @return {string}
                         */
                        getAuthority: function () {
                        },
 
                        /**
-                        * Returns the query arguments of the URL, encoded into a string
-                        * Does not preserve the order of arguments passed into the URI. Does handle escaping.
+                        * Get the query arguments of the URL, encoded into a string.
+                        *
+                        * Does not preserve the original order of arguments passed in the URI. Does handle escaping.
+                        *
                         * @return {string}
                         */
                        getQueryString: function () {
                        },
 
                        /**
-                        * Returns everything after the authority section of the URI
+                        * Get everything after the authority section of the URI.
+                        *
                         * @return {string}
                         */
                        getRelativePath: function () {
                        },
 
                        /**
-                        * Gets the entire URI string. May not be precisely the same as input due to order of query arguments.
-                        * @return {string} The URI string.
+                        * Get the entire URI string.
+                        *
+                        * May not be precisely the same as input due to order of query arguments.
+                        *
+                        * @return {string} The URI string
                         */
                        toString: function () {
                                return this.protocol + '://' + this.getAuthority() + this.getRelativePath();
 
                        /**
                         * Clone this URI
-                        * @return {Object} new URI object with same properties
+                        *
+                        * @return {Object} New URI object with same properties
                         */
                        clone: function () {
                                return new Uri( this );
                        },
 
                        /**
-                        * Extend the query -- supply query parameters to override or add to ours
-                        * @param {Object} query parameters in key-val form to override or add
-                        * @return {Object} this URI object
+                        * Extend the query section of the URI with new parameters.
+                        *
+                        * @param {Object} parameters Query parameters to add to ours (or to override ours with) as an
+                        *  object
+                        * @return {Object} This URI object
                         */
                        extend: function ( parameters ) {
                                $.extend( this.query, parameters );
                return Uri;
        };
 
-       // if we are running in a browser, inject the current document location, for relative URLs
+       // If we are running in a browser, inject the current document location (for relative URLs).
        if ( document && document.location && document.location.href ) {
                mw.Uri = mw.UriRelative( document.location.href );
        }
index 986917a..04cfbb0 100644 (file)
@@ -54,7 +54,7 @@
                 */
                switchPane: function ( e ) {
                        var currentPaneId = debug.$container.data( 'currentPane' ),
-                               requestedPaneId = $(this).prop( 'id' ).substr( 9 ),
+                               requestedPaneId = $( this ).prop( 'id' ).substr( 9 ),
                                $currentPane = $( '#mw-debug-pane-' + currentPaneId ),
                                $requestedPane = $( '#mw-debug-pane-' + requestedPaneId ),
                                hovDone = false;
@@ -69,8 +69,8 @@
                        // Skip hash fragment handling. Prevents screen from jumping.
                        e.preventDefault();
 
-                       $( this ).addClass( 'current ');
-                       $( '.mw-debug-panelink' ).not( this ).removeClass( 'current ');
+                       $( this ).addClass( 'current ' );
+                       $( '.mw-debug-panelink' ).not( this ).removeClass( 'current ' );
 
                        // Hide the current pane
                        if ( requestedPaneId === currentPaneId ) {
                         * @return {jQuery}
                         */
                        function bitDiv( id ) {
-                               return $( '<div>' ).prop({
+                               return $( '<div>' ).prop( {
                                        id: 'mw-debug-' + id,
                                        className: 'mw-debug-bit'
-                               })
+                               } )
                                .appendTo( $bits );
                        }
 
                         */
                        function paneLabel( id, text ) {
                                return $( '<a>' )
-                                       .prop({
+                                       .prop( {
                                                className: 'mw-debug-panelabel',
                                                href: '#mw-debug-pane-' + id
-                                       })
+                                       } )
                                        .text( text );
                        }
 
                                if ( count ) {
                                        text = text + ' (' + count + ')';
                                }
-                               return $( '<div>' ).prop({
+                               return $( '<div>' ).prop( {
                                        id: 'mw-debug-' + id,
                                        className: 'mw-debug-bit mw-debug-panelink'
-                               })
+                               } )
                                .append( paneLabel( id, text ) )
                                .appendTo( $bits );
                        }
                                }
 
                                $( '<div>' )
-                                       .prop({
+                                       .prop( {
                                                className: 'mw-debug-pane',
                                                id: 'mw-debug-pane-' + id
-                                       })
+                                       } )
                                        .append( panes[id] )
                                        .appendTo( $container );
                        }
index de06859..7315677 100644 (file)
@@ -11,9 +11,9 @@
         */
        $.fn.goIn = function ( instantToggle ) {
                if ( instantToggle === true ) {
-                       return $(this).show();
+                       return $( this ).show();
                }
-               return $(this).stop( true, true ).fadeIn();
+               return $( this ).stop( true, true ).fadeIn();
        };
 
        /**
@@ -24,9 +24,9 @@
         */
        $.fn.goOut = function ( instantToggle ) {
                if ( instantToggle === true ) {
-                       return $(this).hide();
+                       return $( this ).hide();
                }
-               return $(this).stop( true, true ).fadeOut();
+               return $( this ).stop( true, true ).fadeOut();
        };
 
        /**
@@ -35,8 +35,8 @@
         * @param {Function} callback Takes one parameter, which is {true} when the
         *  event is called immediately, and {jQuery.Event} when triggered from an event.
         */
-       $.fn.liveAndTestAtStart = function ( callback ){
-               $(this)
+       $.fn.liveAndTestAtStart = function ( callback ) {
+               $( this )
                        .live( 'change', callback )
                        .each( function () {
                                callback.call( this, true );
                // Animate the SelectOrOther fields, to only show the text field when
                // 'other' is selected.
                $( '.mw-htmlform-select-or-other' ).liveAndTestAtStart( function ( instant ) {
-                       var $other = $( '#' + $(this).attr( 'id' ) + '-other' );
+                       var $other = $( '#' + $( this ).attr( 'id' ) + '-other' );
                        $other = $other.add( $other.siblings( 'br' ) );
-                       if ( $(this).val() === 'other' ) {
+                       if ( $( this ).val() === 'other' ) {
                                $other.goIn( instant );
                        } else {
                                $other.goOut( instant );
                        }
-               });
+               } );
 
        } );
 
@@ -72,7 +72,7 @@
                        'class': 'htmlform-chzn-select mw-input ' + oldClass
                } );
                $oldContainer.find( 'input' ).each( function () {
-                       var $oldInput = $(this),
+                       var $oldInput = $( this ),
                        checked = $oldInput.prop( 'checked' ),
                        $option = $( '<option>' );
                        $option.prop( 'value', $oldInput.prop( 'value' ) );
index 70b9be9..3322ad9 100644 (file)
 
                /**
                 * N.B. replacements are variadic arguments or an array in second parameter. In other words:
-                *    somefunction(a, b, c, d)
+                *    somefunction( a, b, c, d )
                 * is equivalent to
-                *    somefunction(a, [b, c, d])
+                *    somefunction( a, [b, c, d] )
                 *
                 * @param {string} key Message key.
                 * @param {Array|mixed} replacements Optional variable replacements (variadically or an array).
                var failableParserFn = getFailableParserFn( options );
                /**
                 * N.B. replacements are variadic arguments or an array in second parameter. In other words:
-                *    somefunction(a, b, c, d)
+                *    somefunction( a, b, c, d )
                 * is equivalent to
-                *    somefunction(a, [b, c, d])
+                *    somefunction( a, [b, c, d] )
                 *
                 * We append to 'this', which in a jQuery plugin context will be the selected elements.
                 * @param {string} key Message key.
                        // This may be because, to save code, memoization was removed
 
                        regularLiteral = makeRegexParser( /^[^{}\[\]$<\\]/ );
-                       regularLiteralWithoutBar = makeRegexParser(/^[^{}\[\]$\\|]/);
-                       regularLiteralWithoutSpace = makeRegexParser(/^[^{}\[\]$\s]/);
+                       regularLiteralWithoutBar = makeRegexParser( /^[^{}\[\]$\\|]/ );
+                       regularLiteralWithoutSpace = makeRegexParser( /^[^{}\[\]$\s]/ );
                        regularLiteralWithSquareBrackets = makeRegexParser( /^[^{}$\\]/ );
 
                        backslash = makeStringParser( '\\' );
                        // Used to define "literals" without spaces, in space-delimited situations
                        function literalWithoutSpace() {
                                var result = nOrMore( 1, escapedOrLiteralWithoutSpace )();
-                               return result === null ? null : result.join('');
+                               return result === null ? null : result.join( '' );
                        }
                        // Used to define "literals" within template parameters. The pipe character is the parameter delimeter, so by default
                        // it is not a literal in the parameter
                        function literalWithoutBar() {
                                var result = nOrMore( 1, escapedOrLiteralWithoutBar )();
-                               return result === null ? null : result.join('');
+                               return result === null ? null : result.join( '' );
                        }
 
                        // Used for wikilink page names.  Like literalWithoutBar, but
                        // without allowing escapes.
                        function unescapedLiteralWithoutBar() {
                                var result = nOrMore( 1, regularLiteralWithoutBar )();
-                               return result === null ? null : result.join('');
+                               return result === null ? null : result.join( '' );
                        }
 
                        function literal() {
                                var result = nOrMore( 1, escapedOrRegularLiteral )();
-                               return result === null ? null : result.join('');
+                               return result === null ? null : result.join( '' );
                        }
 
                        function curlyBraceTransformExpressionLiteral() {
                                var result = nOrMore( 1, regularLiteralWithSquareBrackets )();
-                               return result === null ? null : result.join('');
+                               return result === null ? null : result.join( '' );
                        }
 
                        asciiAlphabetLiteral = makeRegexParser( /[A-Za-z]+/ );
                                        whitespace,
                                        asciiAlphabetLiteral,
                                        htmlAttributeEquals,
-                                       choice( [
+                                       choice( [
                                                doubleQuotedHtmlAttributeValue,
                                                singleQuotedHtmlAttributeValue
                                        ] )
                                endTagName = parsedCloseTagResult[1];
                                wrappedAttributes = parsedOpenTagResult[2];
                                attributes = wrappedAttributes.slice( 1 );
-                               if ( isAllowedHtml( startTagName, endTagName, attributes) ) {
+                               if ( isAllowedHtml( startTagName, endTagName, attributes ) ) {
                                        result = [ 'HTMLELEMENT', startTagName, wrappedAttributes ].concat( parsedHtmlContents );
                                } else {
                                        // HTML is not allowed, so contents will remain how
                                ] );
                                return result === null ? null : [ result[0], result[2] ];
                        }
-                       colon = makeStringParser(':');
+                       colon = makeStringParser( ':' );
                        templateContents = choice( [
                                function () {
                                        var res = sequence( [
                                        return [ res[0] ].concat( res[1] );
                                }
                        ] );
-                       openTemplate = makeStringParser('{{');
-                       closeTemplate = makeStringParser('}}');
+                       openTemplate = makeStringParser( '{{' );
+                       closeTemplate = makeStringParser( '}}' );
                        nonWhitespaceExpression = choice( [
                                template,
                                wikilink,
                 * Transform parsed structure into external link
                 * If the href is a jQuery object, treat it as "enclosing" the link text.
                 *              ... function, treat it as the click handler
-                *              ... string, treat it as a URI
+                *              ... string, treat it as a URI
                 * TODO: throw an error if nodes.length > 2 ?
                 * @param {Array} of two elements, {jQuery|Function|String} and {String}
                 * @return {jQuery}
                extlinkparam: function ( nodes, replacements ) {
                        var replacement,
                                index = parseInt( nodes[0], 10 );
-                       if ( index < replacements.length) {
+                       if ( index < replacements.length ) {
                                replacement = replacements[index];
                        } else {
                                replacement = '$' + ( index + 1 );
                plural: function ( nodes ) {
                        var forms, count;
                        count = parseFloat( this.language.convertNumber( nodes[0], true ) );
-                       forms = nodes.slice(1);
+                       forms = nodes.slice( 1 );
                        return forms.length ? this.language.convertPlural( count, forms ) : '';
                },
 
                // Caching is somewhat problematic, because we do need different message functions for different maps, so
                // we'd have to cache the parser as a member of this.map, which sounds a bit ugly.
                // Do not use mw.jqueryMsg unless required
-               if ( this.format === 'plain' || !/\{\{|[\[<>]/.test(this.map.get( this.key ) ) ) {
+               if ( this.format === 'plain' || !/\{\{|[\[<>]/.test( this.map.get( this.key ) ) ) {
                        // Fall back to mw.msg's simple parser
                        return oldParser.apply( this );
                }
index 5623575..e3aae9e 100644 (file)
@@ -1,6 +1,8 @@
 /**
  * Base library for MediaWiki.
  *
+ * Exposed as globally as `mediaWiki` with `mw` as shortcut.
+ *
  * @class mw
  * @alternateClassName mediaWiki
  * @singleton
@@ -180,6 +182,51 @@ var mw = ( function ( $, undefined ) {
         *
         * Format defaults to 'text'.
         *
+        *     @example
+        *
+        *     var obj, str;
+        *     mw.messages.set( {
+        *         'hello': 'Hello world',
+        *         'hello-user': 'Hello, $1!',
+        *         'welcome-user': 'Welcome back to $2, $1! Last visit by $1: $3'
+        *     } );
+        *
+        *     obj = new mw.Message( mw.messages, 'hello' );
+        *     mw.log( obj.text() );
+        *     // Hello world
+        *
+        *     obj = new mw.Message( mw.messages, 'hello-user', [ 'John Doe' ] );
+        *     mw.log( obj.text() );
+        *     // Hello, John Doe!
+        *
+        *     obj = new mw.Message( mw.messages, 'welcome-user', [ 'John Doe', 'Wikipedia', '2 hours ago' ] );
+        *     mw.log( obj.text() );
+        *     // Welcome back to Wikipedia, John Doe! Last visit by John Doe: 2 hours ago
+        *
+        *     // Using mw.message shortcut
+        *     obj = mw.message( 'hello-user', 'John Doe' );
+        *     mw.log( obj.text() );
+        *     // Hello, John Doe!
+        *
+        *     // Using mw.msg shortcut
+        *     str = mw.msg( 'hello-user', 'John Doe' );
+        *     mw.log( str );
+        *     // Hello, John Doe!
+        *
+        *     // Different formats
+        *     obj = new mw.Message( mw.messages, 'hello-user', [ 'John "Wiki" <3 Doe' ] );
+        *
+        *     obj.format = 'text';
+        *     str = obj.toString();
+        *     // Same as:
+        *     str = obj.text();
+        *
+        *     mw.log( str );
+        *     // Hello, John "Wiki" <3 Doe!
+        *
+        *     mw.log( obj.escaped() );
+        *     // Hello, John &quot;Wiki&quot; &lt;3 Doe!
+        *
         * @class mw.Message
         *
         * @constructor
@@ -414,14 +461,14 @@ var mw = ( function ( $, undefined ) {
                 * Map of configuration values
                 *
                 * Check out [the complete list of configuration values](https://www.mediawiki.org/wiki/Manual:Interface/JavaScript#mw.config)
-                * on MediaWiki.org.
+                * on mediawiki.org.
                 *
-                * If `$wgLegacyJavaScriptGlobals` is true, this Map will put its values in the
-                * global window object.
+                * If `$wgLegacyJavaScriptGlobals` is true, this Map will add its values to the
+                * global `window` object.
                 *
                 * @property {mw.Map} config
                 */
-               // Dummy placeholder. Re-assigned in ResourceLoaderStartupModule with an instance of `mw.Map`.
+               // Dummy placeholder. Re-assigned in ResourceLoaderStartupModule to an instance of `mw.Map`.
                config: null,
 
                /**
@@ -438,7 +485,7 @@ var mw = ( function ( $, undefined ) {
                 * This was reserved for future use but never ended up being used.
                 *
                 * @deprecated since 1.22: Let deprecated identifiers keep their original name
-                * and use mw.log#deprecate to create an access container for tracking.
+                *  and use mw.log#deprecate to create an access container for tracking.
                 * @property
                 */
                legacy: {},
@@ -454,8 +501,9 @@ var mw = ( function ( $, undefined ) {
                /**
                 * Get a message object.
                 *
-                * Similar to wfMessage() in MediaWiki PHP.
+                * Shorcut for `new mw.Message( mw.messages, key, parameters )`.
                 *
+                * @see mw.Message
                 * @param {string} key Key of message to get
                 * @param {Mixed...} parameters Parameters for the $N replacements in messages.
                 * @return {mw.Message}
@@ -467,9 +515,9 @@ var mw = ( function ( $, undefined ) {
                },
 
                /**
-                * Get a message string using 'text' format.
+                * Get a message string using the (default) 'text' format.
                 *
-                * Similar to wfMsg() in MediaWiki PHP.
+                * Shortcut for `mw.message( key, parameters... ).text()`.
                 *
                 * @see mw.Message
                 * @param {string} key Key of message to get
@@ -1445,9 +1493,14 @@ var mw = ( function ( $, undefined ) {
                                /**
                                 * Register a source.
                                 *
-                                * @param {string} id Short lowercase a-Z string representing a source, only used internally.
-                                * @param {Object} props Object containing only the loadScript property which is a url to
-                                *  the load.php location of the source.
+                                * The #work method will use this information to split up requests by source.
+                                *
+                                *     mw.loader.addSource( 'mediawikiwiki', { loadScript: '//www.mediawiki.org/w/load.php' } );
+                                *
+                                * @param {string} id Short string representing a source wiki, used internally for
+                                *  registered modules to indicate where they should be loaded from (usually lowercase a-z).
+                                * @param {Object} props
+                                * @param {string} props.loadScript Url to the load.php entry point of the source wiki.
                                 * @return {boolean}
                                 */
                                addSource: function ( id, props ) {
@@ -1584,6 +1637,12 @@ var mw = ( function ( $, undefined ) {
                                /**
                                 * Execute a function as soon as one or more required modules are ready.
                                 *
+                                * Example of inline dependency on OOjs:
+                                *
+                                *     mw.loader.using( 'oojs', function () {
+                                *         OO.compare( [ 1 ], [ 1 ] );
+                                *     } );
+                                *
                                 * @param {string|Array} dependencies Module name or array of modules names the callback
                                 *  dependends on to be ready before executing
                                 * @param {Function} [ready] callback to execute when all dependencies are ready
@@ -1731,6 +1790,8 @@ var mw = ( function ( $, undefined ) {
                                 * Get the version of a module.
                                 *
                                 * @param {string} module Name of module to get version for
+                                * @return {string|null} The version, or null if the module (or its version) is not
+                                *  in the registry.
                                 */
                                getVersion: function ( module ) {
                                        if ( registry[module] !== undefined && registry[module].version !== undefined ) {
@@ -1760,7 +1821,7 @@ var mw = ( function ( $, undefined ) {
                                },
 
                                /**
-                                * Get names of all registered modules.
+                                * Get the names of all registered modules.
                                 *
                                 * @return {Array}
                                 */
@@ -1815,38 +1876,6 @@ var mw = ( function ( $, undefined ) {
                                        // Cache hit stats
                                        stats: { hits: 0, misses: 0, expired: 0 },
 
-                                       // Experiment data
-                                       experiment: ( function () {
-                                               var start = ( new Date() ).getTime(), id = 0, seed = 0;
-
-                                               try {
-                                                       id = JSON.parse( localStorage.getItem( 'moduleStorageExperiment2' ) );
-                                                       if ( typeof id !== 'number' ) {
-                                                               id = Math.floor( Math.random() * Math.random() * 1e16 );
-                                                               localStorage.setItem( 'moduleStorageExperiment2', id );
-                                                       }
-                                                       seed = id % 2000;
-                                               } catch ( e ) {}
-
-                                               return {
-                                                       // Unique identifier for this browser. This allows us to group all
-                                                       // datapoints generated by a particular browser, which in turn allows us
-                                                       // to see how the initial load compares to subsequent page loads.
-                                                       id: id,
-
-                                                       // Group assignment may be 0 (not in experiment), 1 (control group), or 2
-                                                       // (experimental group). Browsers that don't implement all the prerequisite APIs
-                                                       // (JSON and Web Storage) are ineligible. Eligible browsers have a 0.1% chance
-                                                       // of being included in the experiment, in which case they are equally likely to
-                                                       // be assigned to either the experimental or control group.
-                                                       group: seed === 1 ? 1 : ( seed === 2 ? 2 : 0 ),
-
-                                                       // Assess module storage performance by measuring the time between this
-                                                       // reference point and the window load event.
-                                                       start: start
-                                               };
-                                       }() ),
-
                                        /**
                                         * Construct a JSON-serializable object representing the content of the store.
                                         * @return {Object} Module store contents.
@@ -1907,8 +1936,7 @@ var mw = ( function ( $, undefined ) {
                                                        return;
                                                }
 
-                                               if ( ( !mw.config.get( 'wgResourceLoaderStorageEnabled' ) && mw.loader.store.experiment.group !== 2 )
-                                                       || mw.config.get( 'debug' ) ) {
+                                               if ( !mw.config.get( 'wgResourceLoaderStorageEnabled' ) || mw.config.get( 'debug' ) ) {
                                                        // Disabled by configuration, or because debug mode is set
                                                        mw.loader.store.enabled = false;
                                                        return;
@@ -2040,6 +2068,8 @@ var mw = ( function ( $, undefined ) {
                                         * pages are loaded with different module sets, the possibility exists that
                                         * modules saved by one page will be clobbered by another. But the impact would
                                         * be minor and the problem would be corrected by subsequent page views.
+                                        *
+                                        * @method
                                         */
                                        update: ( function () {
                                                var timer;
@@ -2107,6 +2137,10 @@ var mw = ( function ( $, undefined ) {
                        return {
                                /**
                                 * Escape a string for HTML. Converts special characters to HTML entities.
+                                *
+                                *     mw.html.escape( '< > \' & "' );
+                                *     // Returns &lt; &gt; &#039; &amp; &quot;
+                                *
                                 * @param {string} s The string to escape
                                 */
                                escape: function ( s ) {
index 8fd8496..0713541 100644 (file)
@@ -18,6 +18,8 @@
                map = {
                        // SimpleSearch is broken in Opera < 9.6
                        opera: [['>=', 9.6]],
+                       // Older Konquerors are unable to position the suggestions correctly (bug 50805)
+                       konqueror: [['>=', '4.11']],
                        docomo: false,
                        blackberry: false,
                        ipod: false,
index 86f06b8..820cd0a 100644 (file)
                        } )();
 
                        // Table of contents toggle
-                       mw.hook( 'wikipage.content' ).add( function () {
+                       mw.hook( 'wikipage.content' ).add( function ( $content ) {
                                var $tocTitle, $tocToggleLink, hideTocCookie;
-                               $tocTitle = $( '#toctitle' );
-                               $tocToggleLink = $( '#togglelink' );
+                               $tocTitle = $content.find( '#toctitle' );
+                               $tocToggleLink = $content.find( '#togglelink' );
                                // Only add it if there is a TOC and there is no toggle added already
-                               if ( $( '#toc' ).length && $tocTitle.length && !$tocToggleLink.length ) {
+                               if ( $content.find( '#toc' ).length && $tocTitle.length && !$tocToggleLink.length ) {
                                        hideTocCookie = $.cookie( 'mw_hidetoc' );
                                        $tocToggleLink = $( '<a href="#" class="internal" id="togglelink"></a>' )
                                                .text( mw.msg( 'hidetoc' ) )
                                                .click( function ( e ) {
                                                        e.preventDefault();
-                                                       util.toggleToc( $(this) );
+                                                       util.toggleToc( $( this ) );
                                                } );
                                        $tocTitle.append(
                                                $tocToggleLink
                 * This function returns the styleSheet object for convience (due to cross-browsers
                 * difference as to where it is located).
                 *
-                *     var sheet = mw.util.addCSS('.foobar { display: none; }');
-                *     $(foo).click(function () {
+                *     var sheet = mw.util.addCSS( '.foobar { display: none; }' );
+                *     $( foo ).click( function () {
                 *         // Toggle the sheet on and off
                 *         sheet.disabled = !sheet.disabled;
-                *     });
+                *     } );
                 *
                 * @param {string} text CSS to be appended
                 * @return {CSSStyleSheet} Use .ownerNode to get to the `<style>` element.
                        // the ABNF:
                        //      1 * ( atext / "." ) "@" ldh-str 1*( "." ldh-str )
                        // With:
-                       // - atext      : defined in RFC 5322 section 3.2.3
+                       // - atext   : defined in RFC 5322 section 3.2.3
                        // - ldh-str : defined in RFC 1034 section 3.5
                        //
                        // (see STD 68 / RFC 5234 http://tools.ietf.org/html/std68)
                                // RegExp is case insensitive
                                'i'
                        );
-                       return (null !== mailtxt.match( html5EmailRegexp ) );
+                       return ( null !== mailtxt.match( html5EmailRegexp ) );
                },
 
                /**
diff --git a/serialized/.gitignore b/serialized/.gitignore
new file mode 100644 (file)
index 0000000..d9d58dd
--- /dev/null
@@ -0,0 +1,4 @@
+/UnicodeData.txt
+/allkeys.txt
+/ucd.all.grouped.xml
+/ucd.all.grouped.zip
index 062155b..c7e7506 100644 (file)
@@ -1,7 +1,7 @@
-
-SPECIAL_TARGETS=Utf8Case.ser
+SPECIAL_TARGETS=Utf8Case.ser normalize-ar.ser normalize-ml.ser first-letters-root.ser
 ALL_TARGETS=$(SPECIAL_TARGETS)
 DIST_TARGETS=$(SPECIAL_TARGETS)
+UNICODE_VERSION=6.0.0
 
 .PHONY: all dist clean
 
@@ -13,6 +13,26 @@ dist: $(DIST_TARGETS)
 clean:
        rm -f $(ALL_TARGETS)
 
-Utf8Case.ser : ../includes/normal/Utf8Case.php
-       php serialize.php -o $@ $<
+Utf8Case.ser: UnicodeData.txt
+       php ../maintenance/language/generateUtf8Case.php
+
+normalize-ar.ser: UnicodeData.txt
+       php ../maintenance/language/generateNormalizerDataAr.php
+
+normalize-ml.ser:
+       php ../maintenance/language/generateNormalizerDataMl.php
+
+first-letters-root.ser: allkeys.txt ucd.all.grouped.xml
+       php ../maintenance/language/generateCollationData.php
+
+UnicodeData.txt:
+       wget http://www.unicode.org/Public/$(UNICODE_VERSION)/ucd/UnicodeData.txt
+
+allkeys.txt:
+       wget http://www.unicode.org/Public/UCA/$(UNICODE_VERSION)/allkeys.txt
+
+ucd.all.grouped.xml: ucd.all.grouped.zip
+       unzip ucd.all.grouped.zip ucd.all.grouped.xml
 
+ucd.all.grouped.zip:
+       wget http://www.unicode.org/Public/$(UNICODE_VERSION)/ucdxml/ucd.all.grouped.zip
diff --git a/serialized/serialize.php b/serialized/serialize.php
deleted file mode 100644 (file)
index 766c1a5..0000000
+++ /dev/null
@@ -1,95 +0,0 @@
-<?php
-/**
- * Serialize variables found in input file and store the result in the
- * specified file.
- *
- * 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
- */
-
-if ( !defined( 'MEDIAWIKI' ) ) {
-       $wgNoDBParam = true;
-       $optionsWithArgs = array( 'o' );
-       require_once __DIR__ .'/../maintenance/commandLine.inc';
-
-       $stderr = fopen( 'php://stderr', 'w' );
-       if ( !isset( $args[0] ) ) {
-               fwrite( $stderr, "No input file specified\n" );
-               exit( 1 );
-       }
-       if ( wfIsWindows() ) {
-               $files = array();
-               foreach ( $args as $arg ) {
-                       $files = array_merge( $files, glob( $arg ) );
-               }
-               if ( !$files ) {
-                       fwrite( $stderr, "No files found\n" );
-               }
-       } else {
-               $files = $args;
-       }
-
-       if ( isset( $options['o'] ) ) {
-               $out = fopen( $options['o'], 'wb' );
-               if ( !$out ) {
-                       fwrite( $stderr, "Unable to open file \"{$options['o']}\" for output\n" );
-                       exit( 1 );
-               }
-       } else {
-               $out = fopen( 'php://stdout', 'wb' );
-       }
-
-       $vars = array();
-       foreach ( $files as $inputFile ) {
-               $vars = array_merge( $vars, getVars( $inputFile ) );
-       }
-       fwrite( $out, serialize( $vars ) );
-       fclose( $out );
-       exit( 0 );
-}
-
-//----------------------------------------------------------------------------
-
-function getVars( $_gv_filename ) {
-       require $_gv_filename;
-       $vars = get_defined_vars();
-       unset( $vars['_gv_filename'] );
-
-       # Clean up line endings
-       if ( wfIsWindows() ) {
-               $vars = unixLineEndings( $vars );
-       }
-       return $vars;
-}
-
-function unixLineEndings( $var ) {
-       static $recursionLevel = 0;
-       if ( $recursionLevel > 50 ) {
-               global $stderr;
-               fwrite( $stderr, "Error: Recursion limit exceeded. Possible circular reference in array variable.\n" );
-               exit( 2 );
-       }
-
-       if ( is_array( $var ) ) {
-               ++$recursionLevel;
-               $var = array_map( 'unixLineEndings', $var );
-               --$recursionLevel;
-       } elseif ( is_string( $var ) ) {
-               $var = str_replace( "\r\n", "\n", $var );
-       }
-       return $var;
-}
diff --git a/skins/.gitignore b/skins/.gitignore
new file mode 100644 (file)
index 0000000..967fd9f
--- /dev/null
@@ -0,0 +1,17 @@
+*/
+!cologneblue/
+!cologneblue/*
+!common/
+!common/*
+!modern/
+!modern/*
+!monobook/
+!monobook/*
+!vector/
+!vector/*
+
+*.php
+!CologneBlue.php
+!Modern.php
+!MonoBook.php
+!Vector.php
index 00b920a..0dcfe46 100644 (file)
@@ -68,7 +68,7 @@ class SkinVector extends SkinTemplate {
                parent::setupSkinUserCss( $out );
 
                $styles = array( 'skins.common.interface', 'skins.vector.styles' );
-               wfRunHooks( 'SkinVectorStyleModules', array( &$this, &$styles ) );
+               wfRunHooks( 'SkinVectorStyleModules', array( $this, &$styles ) );
                $out->addModuleStyles( $styles );
        }
 
diff --git a/skins/vector/collapsibleNav.less b/skins/vector/collapsibleNav.less
deleted file mode 100644 (file)
index e6f5c9a..0000000
+++ /dev/null
@@ -1,91 +0,0 @@
-/**
- * LESS Stylesheet for collapsible nav
- */
-@import "mediawiki.mixins.less";
-
-#mw-panel.collapsible-nav {
-       .portal {
-               background-position: left top;
-               background-repeat: no-repeat;
-               .background-image('images/portal-break.png');
-               padding: 0.25em 0 !important;
-               margin: -11px 9px 10px 11px;
-
-               h3 {
-                       font-size: @menu-main-heading-font-size;
-                       color: @collapsible-nav-heading-color;
-                       font-weight: normal;
-                       background-position: left center;
-                       background-repeat: no-repeat;
-                       .background-image-svg('images/arrow-expanded.svg', 'images/arrow-expanded.png');
-                       padding: @collapsible-nav-heading-padding;
-                       margin-bottom: 0;
-
-                       &:hover {
-                               cursor: pointer;
-                               text-decoration: none;
-                       }
-
-                       a {
-                               color: @collapsible-nav-heading-color;
-                               text-decoration: none;
-                       }
-               }
-
-               .body {
-                       margin: @collapsible-nav-body-margin;
-                       background-image: none !important;
-                       padding-top: 0;
-                       display: none;
-
-                       ul {
-                               li {
-                                       padding: 0.25em 0;
-                               }
-                       }
-               }
-
-
-               /* First */
-               &.first {
-                       background-image: none;
-                       margin-top: 0;
-                       h3 {
-                               display: none;
-                       }
-               }
-
-               /* Persistent */
-               &.persistent {
-                       .body {
-                               display: block;
-                               margin-left: 0.5em;
-                       }
-
-                       h3 {
-                               background-image: none !important;
-                               padding-left: 0.7em;
-                               cursor: default;
-                       }
-               }
-
-               /* Collapsed */
-               &.collapsed {
-                       h3 {
-                               color: @collapsible-nav-heading-collapsed-color;
-                               background-position: left center;
-                               background-repeat: no-repeat;
-                               .background-image-svg('images/arrow-collapsed-ltr.svg', 'images/arrow-collapsed-ltr.png');
-                               margin-bottom: 0;
-
-                               &:hover {
-                                       text-decoration: underline;
-                               }
-
-                               a {
-                                       color: @collapsible-nav-heading-collapsed-color;
-                               }
-                       }
-               }
-       }
-}
diff --git a/skins/vector/components/collapsibleNav.less b/skins/vector/components/collapsibleNav.less
new file mode 100644 (file)
index 0000000..e6f5c9a
--- /dev/null
@@ -0,0 +1,91 @@
+/**
+ * LESS Stylesheet for collapsible nav
+ */
+@import "mediawiki.mixins.less";
+
+#mw-panel.collapsible-nav {
+       .portal {
+               background-position: left top;
+               background-repeat: no-repeat;
+               .background-image('images/portal-break.png');
+               padding: 0.25em 0 !important;
+               margin: -11px 9px 10px 11px;
+
+               h3 {
+                       font-size: @menu-main-heading-font-size;
+                       color: @collapsible-nav-heading-color;
+                       font-weight: normal;
+                       background-position: left center;
+                       background-repeat: no-repeat;
+                       .background-image-svg('images/arrow-expanded.svg', 'images/arrow-expanded.png');
+                       padding: @collapsible-nav-heading-padding;
+                       margin-bottom: 0;
+
+                       &:hover {
+                               cursor: pointer;
+                               text-decoration: none;
+                       }
+
+                       a {
+                               color: @collapsible-nav-heading-color;
+                               text-decoration: none;
+                       }
+               }
+
+               .body {
+                       margin: @collapsible-nav-body-margin;
+                       background-image: none !important;
+                       padding-top: 0;
+                       display: none;
+
+                       ul {
+                               li {
+                                       padding: 0.25em 0;
+                               }
+                       }
+               }
+
+
+               /* First */
+               &.first {
+                       background-image: none;
+                       margin-top: 0;
+                       h3 {
+                               display: none;
+                       }
+               }
+
+               /* Persistent */
+               &.persistent {
+                       .body {
+                               display: block;
+                               margin-left: 0.5em;
+                       }
+
+                       h3 {
+                               background-image: none !important;
+                               padding-left: 0.7em;
+                               cursor: default;
+                       }
+               }
+
+               /* Collapsed */
+               &.collapsed {
+                       h3 {
+                               color: @collapsible-nav-heading-collapsed-color;
+                               background-position: left center;
+                               background-repeat: no-repeat;
+                               .background-image-svg('images/arrow-collapsed-ltr.svg', 'images/arrow-collapsed-ltr.png');
+                               margin-bottom: 0;
+
+                               &:hover {
+                                       text-decoration: underline;
+                               }
+
+                               a {
+                                       color: @collapsible-nav-heading-collapsed-color;
+                               }
+                       }
+               }
+       }
+}
diff --git a/skins/vector/components/common.less b/skins/vector/components/common.less
new file mode 100644 (file)
index 0000000..cb89a7b
--- /dev/null
@@ -0,0 +1,118 @@
+/*
+ * Any rules which should not be flipped automatically in right-to-left situations should be
+ * prepended with @noflip in a comment block.
+ *
+ * This stylesheet employs a few CSS trick to accomplish compatibility with a wide range of web
+ * browsers. The most common trick is to use some styles in IE6 only. This is accomplished by using
+ * a rule that makes things work in IE6, and then following it with a rule that begins with
+ * "html > body" or use a child selector ">", which is ignored by IE6 because it does not support
+ * the child selector. You can spot this by looking for the "OVERRIDDEN BY COMPLIANT BROWSERS" and
+ * "IGNORED BY IE6" comments.
+ */
+@import "mediawiki.mixins";
+
+/* Framework */
+html {
+       font-size: @html-font-size;
+}
+html,
+body {
+       height: 100%;
+       margin: 0;
+       padding: 0;
+       font-family: @content-font-family;
+}
+body {
+       background-color: @menu-background-color;
+       font-size: @body-font-size;
+}
+
+/* Content */
+div#content {
+       line-height: @content-line-height;
+       margin-left: 10em;
+       padding: @content-padding;
+       /* Border on top, left, and bottom side */
+       border: 1px solid @content-border-color;
+       border-right-width: 0;
+       /* Merge the border with tabs' one (in their background image) */
+       margin-top: -1px;
+       background-color: @body-background-color;
+       color: @content-font-color;
+       direction: ltr;
+}
+
+/* Hide empty portlets */
+div.emptyPortlet {
+               display: none;
+}
+
+ul {
+       list-style-type: disc;
+       .list-style-image('images/bullet-icon.png');
+}
+
+pre, .mw-code {
+       line-height: 1.3em;
+}
+
+/* Site Notice (includes notices from CentralNotice extension) */
+#siteNotice {
+       font-size: 0.8em;
+}
+
+#firstHeading {
+       padding-top: 0;
+       margin-top: 0;
+       font-size: @content-heading-font-size;
+}
+
+.redirectText {
+       font-size: 140%;
+}
+
+.redirectMsg img {
+       vertical-align: text-bottom;
+}
+
+#bodyContent {
+       position: relative;
+       width: 100%;
+       line-height: 1.5em;
+       font-size: @content-font-size;
+}
+
+/* Tooltips are outside of the normal body code, so this helps make the size of the text sensible */
+// FIXME: Should be part of jquery.tipsy.css
+.tipsy {
+       font-size: 0.8em;
+}
+
+/* Animate between standard and high definition layouts */
+body.vector-animateLayout {
+       div#content,
+       div#footer,
+       #left-navigation {
+               .transition(margin-left 250ms, padding 250ms;);
+       }
+
+       #p-logo {
+               .transition(left 250ms);
+       }
+
+       #mw-panel {
+               .transition(padding-right 250ms);
+       }
+
+       #p-search {
+               .transition(margin-right 250ms);
+       }
+
+       #p-personal {
+               .transition(right 250ms);
+       }
+
+       #mw-head-base {
+               .transition(margin-left 250ms);
+       }
+}
diff --git a/skins/vector/components/externalLinks.less b/skins/vector/components/externalLinks.less
new file mode 100644 (file)
index 0000000..3e26a22
--- /dev/null
@@ -0,0 +1,75 @@
+// FIXME: This size of this CSS is ridiculous. Please refactor (see bug 54604)
+@import "mediawiki.mixins.less";
+
+div#content a.external {
+       background-position: center right;
+       background-repeat: no-repeat;
+       .background-image-svg('images/external-link-ltr-icon.svg', 'images/external-link-ltr-icon.png');
+       padding-right: 13px;
+}
+div#content a.external[href ^="https://"],
+.link-https {
+       background-position: center right;
+       background-repeat: no-repeat;
+       .background-image-svg('images/lock-icon.svg', 'images/lock-icon.png');
+       padding-right: 13px;
+}
+div#content a.external[href ^="mailto:"],
+.link-mailto {
+       background-position: center right;
+       background-repeat: no-repeat;
+       .background-image-svg('images/mail-icon.svg', 'images/mail-icon.png');
+       padding-right: 13px;
+}
+div#content a.external[href ^="news:"] {
+       background-position: center right;
+       background-repeat: no-repeat;
+       .background-image-svg('images/news-icon.svg', 'images/news-icon.png');
+       padding-right: 13px;
+}
+div#content a.external[href ^="ftp://"],
+.link-ftp {
+       background-position: center right;
+       background-repeat: no-repeat;
+       .background-image-svg('images/file-icon.svg', 'images/file-icon.png');
+       padding-right: 13px;
+}
+div#content a.external[href ^="irc://"],
+div#content a.external[href ^="ircs://"],
+.link-irc {
+       background-position: center right;
+       background-repeat: no-repeat;
+       .background-image-svg('images/talk-icon.svg', 'images/talk-icon.png');
+       padding-right: 13px;
+}
+div#content a.external[href $=".ogg"], div#content a.external[href $=".OGG"],
+div#content a.external[href $=".mid"], div#content a.external[href $=".MID"],
+div#content a.external[href $=".midi"], div#content a.external[href $=".MIDI"],
+div#content a.external[href $=".mp3"], div#content a.external[href $=".MP3"],
+div#content a.external[href $=".wav"], div#content a.external[href $=".WAV"],
+div#content a.external[href $=".wma"], div#content a.external[href $=".WMA"],
+.link-audio {
+       background-position: center right;
+       background-repeat: no-repeat;
+       .background-image-svg('images/audio-icon.svg', 'images/audio-icon.png');
+       padding-right: 13px;
+}
+div#content a.external[href $=".ogm"], div#content a.external[href $=".OGM"],
+div#content a.external[href $=".avi"], div#content a.external[href $=".AVI"],
+div#content a.external[href $=".mpeg"], div#content a.external[href $=".MPEG"],
+div#content a.external[href $=".mpg"], div#content a.external[href $=".MPG"],
+.link-video {
+       background-position: center right;
+       background-repeat: no-repeat;
+       .background-image-svg('images/video-icon.svg', 'images/video-icon.png');
+       padding-right: 13px;
+}
+div#content a.external[href $=".pdf"], div#content a.external[href $=".PDF"],
+div#content a.external[href *=".pdf#"], div#content a.external[href *=".PDF#"],
+div#content a.external[href *=".pdf?"], div#content a.external[href *=".PDF?"],
+.link-document {
+       background-position: center right;
+       background-repeat: no-repeat;
+       .background-image-svg('images/document-icon.svg', 'images/document-icon.png');
+       padding-right: 13px;
+}
diff --git a/skins/vector/components/footer.less b/skins/vector/components/footer.less
new file mode 100644 (file)
index 0000000..3d61b66
--- /dev/null
@@ -0,0 +1,57 @@
+/* Footer */
+div#footer {
+       margin-left: 10em;
+       margin-top: 0;
+       padding: 0.75em;
+       direction: ltr;
+
+       ul {
+               list-style-type: none;
+               list-style-image: none;
+               margin: 0;
+               padding: 0;
+
+               li {
+                       margin: 0;
+                       padding: 0;
+                       padding-top: 0.5em;
+                       padding-bottom: 0.5em;
+                       color: #333;
+                       font-size: 0.7em;
+               }
+       }
+
+       #footer-icons {
+               float: right;
+
+               li {
+                       float: left;
+                       margin-left: 0.5em;
+                       line-height: 2em;
+                       text-align: right;
+               }
+       }
+
+       #footer-info {
+               li {
+                       line-height: 1.4em;
+               }
+       }
+
+       #footer-places {
+               li {
+                       float: left;
+                       margin-right: 1em;
+                       line-height: 2em;
+               }
+       }
+}
+
+body.ltr {
+       div#footer {
+               #footer-places {
+                       /* @noflip */
+                       float: left;
+               }
+       }
+}
diff --git a/skins/vector/components/navigation.less b/skins/vector/components/navigation.less
new file mode 100644 (file)
index 0000000..e2942d7
--- /dev/null
@@ -0,0 +1,131 @@
+@import "mediawiki.mixins";
+@import "personalMenu";
+@import "collapsibleNav";
+@import "search";
+@import "tabs";
+
+/* Hide, but keep accessible for screen-readers */
+#mw-navigation h2 {
+       position: absolute;
+       top: -9999px;
+}
+
+/* Head */
+#mw-page-base {
+       height: 5em;
+       background-position: bottom left;
+       background-repeat: repeat-x;
+       .vertical-gradient(@body-background-color, @menu-background-color, 40%, 100%);
+}
+
+#mw-head-base {
+       margin-top: -5em;
+       margin-left: 10em;
+       height: 5em;
+}
+
+div#mw-head {
+       position: absolute;
+       top: 0;
+       right: 0;
+       width: 100%;
+
+       h3 {
+               margin: 0;
+               padding: 0;
+       }
+}
+
+/* Navigation Containers */
+#left-navigation {
+       float: left;
+       margin-left: 10em;
+       margin-top: 2.5em;
+       /* When right nav would overlap left nav, it's placed below it
+          (normal CSS floats behavior). This rule ensures that no empty space
+          is shown between them due to right nav's margin-top. Page layout
+          is still broken, but at least the nav overlaps only the page title
+          instead of half the content. */
+       margin-bottom: -2.5em;
+       /* IE 6 double-margin bug fix */
+       display: inline;
+}
+
+#right-navigation {
+       float: right;
+       margin-top: 2.5em;
+}
+
+/* Logo */
+#p-logo {
+       position: absolute;
+       top: -160px;
+       left: 0;
+       width: 10em;
+       height: 160px;
+
+       a {
+               display: block;
+               width: 10em;
+               height: 160px;
+               background-repeat: no-repeat;
+               background-position: center center;
+               text-decoration: none;
+       }
+}
+
+/* Panel */
+div#mw-panel {
+       font-size: @menu-main-font-size;
+       position: absolute;
+       top: 160px;
+       padding-top: 1em;
+       width: 10em;
+       left: 0;
+
+       div.portal {
+               padding-bottom: 1.5em;
+               direction: ltr;
+
+               h3 {
+                       font-weight: normal;
+                       color: #444;
+                       padding: @menu-main-heading-padding;
+                       cursor: default;
+                       border: none;
+                       font-size: @menu-main-heading-font-size;
+               }
+
+               div.body {
+                       padding-top: 0.5em;
+                       margin: @menu-main-body-margin;
+
+                       .background-image('images/portal-break.png');
+                       background-repeat: no-repeat;
+                       background-position: top left;
+
+                       ul {
+                               list-style-type: none;
+                               list-style-image: none;
+                               padding: @menu-main-body-padding;
+                               margin: 0;
+
+                               li {
+                                       line-height: 1.125em;
+                                       padding: 0;
+                                       padding-bottom: 0.5em;
+                                       margin: 0;
+                                       font-size: @menu-main-body-font-size;
+                                       word-wrap: break-word;
+
+                                       a {
+                                               color: @menu-main-body-link-color;
+                                               &:visited {
+                                                       color: @menu-main-body-link-visited-color;
+                                               }
+                                       }
+                               }
+                       }
+               }
+       }
+}
diff --git a/skins/vector/components/notifications.less b/skins/vector/components/notifications.less
new file mode 100644 (file)
index 0000000..cadb61c
--- /dev/null
@@ -0,0 +1,20 @@
+/* mediawiki.notification */
+.skin-vector {
+       .mw-notification-area {
+               font-size: 0.8em;
+       }
+
+       .mw-notification-area-layout {
+               top: 7em;
+       }
+
+       .mw-notification {
+               background-color: #fff;
+               background-color: rgba(255, 255, 255, 0.93);
+               padding: 0.75em 1.5em;
+               border: solid 1px @content-border-color;
+               border-radius: 0.75em;
+               -webkit-box-shadow: 0 2px 10px 0 rgba(0, 0, 0, 0.125);
+               box-shadow: 0 2px 10px 0 rgba(0, 0, 0, 0.125);
+       }
+}
diff --git a/skins/vector/components/personalMenu.less b/skins/vector/components/personalMenu.less
new file mode 100644 (file)
index 0000000..7256929
--- /dev/null
@@ -0,0 +1,41 @@
+/* Personal */
+#p-personal {
+       position: absolute;
+       top: 0.33em;
+       right: 0.75em;
+       /* Display on top of page tabs - bugs 37158, 48078 */
+       z-index: 100;
+
+       h3 {
+               display: none;
+       }
+
+       ul {
+               list-style-type: none;
+               list-style-image: none;
+               margin: 0;
+               padding-left: 10em; /* Keep from overlapping logo */
+       }
+
+       li {
+               line-height: 1.125em;
+               /* @noflip */
+               float: left;
+               margin-left: 0.75em;
+               margin-top: 0.5em;
+               font-size: @menu-personal-font-size;
+               white-space: nowrap;
+       }
+}
+
+/* Icon for Usernames */
+#pt-userpage,
+#pt-anonuserpage,
+#pt-login {
+       background-position: left top;
+       background-repeat: no-repeat;
+       /* SVG support using a transparent gradient to guarantee cross-browser
+        * compatibility (browsers able to understand gradient syntax support also SVG) */
+       .background-image-svg('images/user-icon.svg', 'images/user-icon.png');
+       padding-left: 15px !important;
+}
diff --git a/skins/vector/components/search.less b/skins/vector/components/search.less
new file mode 100644 (file)
index 0000000..5d716b6
--- /dev/null
@@ -0,0 +1,98 @@
+/* Search */
+#p-search {
+       /* @noflip */
+       float: left;
+       margin-right: 0.5em;
+       margin-left: 0.5em;
+
+       h3 {
+               display: none;
+       }
+
+       form,
+       input {
+               margin: 0;
+               margin-top: 0.4em;
+       }
+}
+
+div#simpleSearch {
+       display: block;
+       width: 14em;
+       height: 1.4em;
+       margin-top: 0.65em;
+       position: relative;
+       min-height: 1px; /* Gotta trigger hasLayout for IE7 */
+       border: solid 1px #aaa;
+       color: black;
+       background-color: white;
+       .background-image('images/search-fade.png');
+       background-position: top left;
+       background-repeat: repeat-x;
+
+       input {
+               color: black;
+               &:focus {
+                       outline: none;
+               }
+
+               &.placeholder {
+                       color: #999;
+               }
+
+               &:-ms-input-placeholder,
+               &:-moz-placeholder,
+               &::-webkit-input-placeholder {
+                       color: #999;
+               }
+
+               &#searchInput {
+                       position: absolute;
+                       top: 0;
+                       left: 0;
+                       width: 90%;
+                       margin: 0;
+                       padding: 0;
+                       padding-left: 0.2em;
+                       padding-top: 0.2em;
+                       padding-bottom: 0.2em;
+                       outline: none;
+                       border: none;
+                       /*
+                        * DON'T PANIC! Browsers that won't scale this properly are the same browsers that have JS issues that prevent
+                        * this from ever being shown anyways.
+                       */
+                       font-size: 13px;
+                       background-color: transparent;
+                       direction: ltr;
+               }
+       }
+
+       button#searchButton {
+               position: absolute;
+               width: 10%;
+               right: 0;
+               top: 0;
+               padding: 0;
+               padding-top: 0.3em;
+               padding-bottom: 0.2em;
+               padding-right: 0.4em;
+               margin: 0;
+               border: none;
+               cursor: pointer;
+               background-color: transparent;
+               background-image: none;
+
+               /* OVERRIDDEN BY COMPLIANT BROWSERS */
+               img {
+                       border: none;
+                       margin: 0;
+                       margin-top: -3px;
+                       padding: 0;
+               }
+               /* IGNORED BY IE6 */
+               > img {
+                       margin: 0;
+               }
+       }
+}
diff --git a/skins/vector/components/tabs.less b/skins/vector/components/tabs.less
new file mode 100644 (file)
index 0000000..43e77cd
--- /dev/null
@@ -0,0 +1,273 @@
+/*
+Styling for namespace tabs (page, discussion) and views (read, edit, view history, watch and other actions)
+*/
+
+/* Navigation Labels */
+div.vectorTabs h3,
+div.vectorMenu h3 span {
+       display: none;
+}
+
+/* Namespaces and Views */
+div.vectorTabs {
+       /* @noflip */
+       float: left;
+       height: 2.5em;
+       .background-image('images/tab-break.png');
+       background-position: bottom left;
+       background-repeat: no-repeat;
+       padding-left: 1px;
+
+       ul {
+               /* @noflip */
+               float: left;
+               height: 100%;
+               list-style-type: none;
+               list-style-image: none;
+               margin: 0;
+               padding: 0;
+               .background-image('images/tab-break.png');
+               background-position: right bottom;
+               background-repeat: no-repeat;
+
+               li {
+                       /* @noflip */
+                       float: left;
+                       line-height: 1.125em;
+                       /* For IE6, overridden later to display:block by modern browsers */
+                       display: inline-block;
+                       height: 100%;
+                       margin: 0;
+                       padding: 0;
+                       background-color: #f3f3f3;
+                       .background-image('images/tab-normal-fade.png');
+                       background-position: bottom left;
+                       background-repeat: repeat-x;
+                       white-space: nowrap;
+               }
+
+               /* IGNORED BY IE6 which doesn't support child selector */
+               > li {
+                       display: block;
+               }
+       }
+
+       li {
+               &.new {
+                       a,
+                       a:visited{
+                               color: #a55858;
+                       }
+               }
+
+               &.selected {
+                       .background-image('images/tab-current-fade.png');
+                       a,
+                       a:visited{
+                               color: #333;
+                               text-decoration: none;
+                       }
+               }
+
+               &.icon {
+                       a {
+                               background-position: bottom right;
+                               background-repeat: no-repeat;
+                       }
+               }
+
+               a {
+                       /* For IE6, overridden later to display:block by modern browsers */
+                       display: inline-block;
+                       height: 1.9em;
+                       padding-left: 0.5em;
+                       padding-right: 0.5em;
+                       color: @menu-link-color;
+                       cursor: pointer;
+                       font-size: 0.8em;
+               }
+
+               /* Ignored by IE6 which doesn't support child selector */
+               > a {
+                       display: block;
+               }
+       }
+
+       span {
+               display: inline-block;
+               .background-image('images/tab-break.png');
+               background-position: bottom right;
+               background-repeat: no-repeat;
+
+               a  {
+                       /* For IE6, overridden later to display:block by modern browsers */
+                       display: inline-block;
+                       padding-top: 1.25em;
+               }
+
+               /* Ignored by IE6 which doesn't support child selector */
+               > a {
+                       /* @noflip */
+                       float: left;
+                       display: block;
+               }
+       }
+}
+
+/* Variants and Actions */
+div.vectorMenu {
+       /* @noflip */
+       direction: ltr;
+       /* @noflip */
+       float: left;
+       /* SVG support using a transparent gradient to guarantee cross-browser
+        * compatibility (browsers able to understand gradient syntax support also SVG) */
+       .background-image-svg('images/arrow-down-icon.svg', 'images/arrow-down-icon.png');
+       /* @noflip */
+       background-position: 100% 60%;
+       background-repeat: no-repeat;
+       cursor: pointer;
+}
+
+div.vectorMenuFocus {
+       /* SVG support using a transparent gradient to guarantee cross-browser
+        * compatibility (browsers able to understand gradient syntax support also SVG) */
+       .background-image-svg('images/arrow-down-focus-icon.svg', 'images/arrow-down-focus-icon.png');
+       background-position: 100% 60%;
+}
+
+body.rtl div.vectorMenu {
+       /* @noflip */
+       direction: rtl;
+}
+
+/* OVERRIDDEN BY COMPLIANT BROWSERS */
+div#mw-head div.vectorMenu h3 {
+       /* @noflip */
+       float: left;
+       .background-image('images/tab-break.png');
+       background-repeat: no-repeat;
+       background-position: bottom left;
+       margin-left: -1px;
+}
+
+/* IGNORED BY IE6 */
+div#mw-head div.vectorMenu > h3 {
+       background-image: none;
+}
+
+div#mw-head div.vectorMenu h4,
+div.vectorMenu#p-variants #mw-vector-current-variant {
+       display: inline-block;
+       float: left;
+       font-size: 0.8em;
+       padding-left: 0.5em;
+       padding-top: 1.375em;
+       font-weight: normal;
+       border: none;
+}
+
+/* OVERRIDDEN BY COMPLIANT BROWSERS */
+div.vectorMenu h3 a {
+       display: inline-block;
+       width: 24px;
+       height: 1.9em;
+       text-decoration: none;
+       .background-image('images/tab-break.png');
+       background-repeat: no-repeat;
+       background-position: bottom right;
+}
+
+/* IGNORED BY IE6 */
+div.vectorMenu h3 > a {
+       display: block;
+}
+
+div.vectorMenu div.menu {
+       position: relative;
+       display: none;
+       clear: both;
+       text-align: left;
+}
+
+/* OVERRIDDEN BY COMPLIANT BROWSERS */
+body.rtl div.vectorMenu div.menu {
+       /* @noflip */
+       margin-left: 24px;
+}
+
+/* IGNORED BY IE6 */
+body.rtl div.vectorMenu > div.menu {
+       /* @noflip */
+       margin-left: auto;
+}
+
+/* IGNORED BY IE6 */
+/* Also fixes old versions of FireFox */
+body.rtl div.vectorMenu > div.menu,
+x:-moz-any-link {
+       /* @noflip */
+       margin-left: 23px;
+}
+
+/* Enable forcing showing of the menu for accessibility */
+div.vectorMenu:hover div.menu,
+div.vectorMenu div.menuForceShow {
+       display: block;
+}
+
+div.vectorMenu ul {
+       position: absolute;
+       background-color: white;
+       border: solid 1px silver;
+       border-top-width: 0;
+       list-style-type: none;
+       list-style-image: none;
+       padding: 0;
+       margin: 0;
+       margin-left: -1px;
+       text-align: left;
+}
+
+/* Fixes old versions of FireFox */
+div.vectorMenu ul,
+x:-moz-any-link {
+       min-width: 5em;
+}
+
+/* Returns things back to normal in modern versions of FireFox */
+div.vectorMenu ul,
+x:-moz-any-link,
+x:default {
+       min-width: 0;
+}
+
+div.vectorMenu li {
+       padding: 0;
+       margin: 0;
+       text-align: left;
+       line-height: 1em;
+}
+
+/* OVERRIDDEN BY COMPLIANT BROWSERS */
+div.vectorMenu li a {
+       display: inline-block;
+       padding: 0.5em;
+       white-space: nowrap;
+       color: @menu-link-color;
+       cursor: pointer;
+       font-size: 0.8em;
+}
+
+/* IGNORED BY IE6 */
+div.vectorMenu li > a {
+       display: block;
+}
+
+div.vectorMenu li.selected a,
+div.vectorMenu li.selected a:visited {
+       color: #333;
+       text-decoration: none;
+}
+
+@import 'watchstar.less';
diff --git a/skins/vector/components/watchstar.less b/skins/vector/components/watchstar.less
new file mode 100644 (file)
index 0000000..6f93215
--- /dev/null
@@ -0,0 +1,40 @@
+/* Watch/Unwatch Icon Styling */
+#ca-unwatch.icon a,
+#ca-watch.icon a {
+       margin: 0;
+       padding: 0;
+       outline: none;
+       display: block;
+       width: 26px;
+       /* This hides the text but shows the background image */
+       padding-top: 3.1em;
+       margin-top: 0;
+       /* Only applied in IE6 */
+       margin-top: -0.8em !ie;
+       height: 0;
+       overflow: hidden;
+       .background-image('images/watch-icons.png');
+}
+#ca-unwatch.icon a {
+       background-position: -43px 60%;
+}
+#ca-watch.icon a {
+       background-position: 5px 60%;
+}
+#ca-unwatch.icon a:hover,
+#ca-unwatch.icon a:focus {
+       background-position: -67px 60%;
+}
+#ca-watch.icon a:hover,
+#ca-watch.icon a:focus {
+       background-position: -19px 60%;
+}
+#ca-unwatch.icon a.loading,
+#ca-watch.icon a.loading {
+       .background-image('images/watch-icon-loading.gif');
+       background-position: 5px 60%;
+}
+#ca-unwatch.icon a span,
+#ca-watch.icon a span {
+       display: none;
+}
diff --git a/skins/vector/externalLinks.less b/skins/vector/externalLinks.less
deleted file mode 100644 (file)
index 3e26a22..0000000
+++ /dev/null
@@ -1,75 +0,0 @@
-// FIXME: This size of this CSS is ridiculous. Please refactor (see bug 54604)
-@import "mediawiki.mixins.less";
-
-div#content a.external {
-       background-position: center right;
-       background-repeat: no-repeat;
-       .background-image-svg('images/external-link-ltr-icon.svg', 'images/external-link-ltr-icon.png');
-       padding-right: 13px;
-}
-div#content a.external[href ^="https://"],
-.link-https {
-       background-position: center right;
-       background-repeat: no-repeat;
-       .background-image-svg('images/lock-icon.svg', 'images/lock-icon.png');
-       padding-right: 13px;
-}
-div#content a.external[href ^="mailto:"],
-.link-mailto {
-       background-position: center right;
-       background-repeat: no-repeat;
-       .background-image-svg('images/mail-icon.svg', 'images/mail-icon.png');
-       padding-right: 13px;
-}
-div#content a.external[href ^="news:"] {
-       background-position: center right;
-       background-repeat: no-repeat;
-       .background-image-svg('images/news-icon.svg', 'images/news-icon.png');
-       padding-right: 13px;
-}
-div#content a.external[href ^="ftp://"],
-.link-ftp {
-       background-position: center right;
-       background-repeat: no-repeat;
-       .background-image-svg('images/file-icon.svg', 'images/file-icon.png');
-       padding-right: 13px;
-}
-div#content a.external[href ^="irc://"],
-div#content a.external[href ^="ircs://"],
-.link-irc {
-       background-position: center right;
-       background-repeat: no-repeat;
-       .background-image-svg('images/talk-icon.svg', 'images/talk-icon.png');
-       padding-right: 13px;
-}
-div#content a.external[href $=".ogg"], div#content a.external[href $=".OGG"],
-div#content a.external[href $=".mid"], div#content a.external[href $=".MID"],
-div#content a.external[href $=".midi"], div#content a.external[href $=".MIDI"],
-div#content a.external[href $=".mp3"], div#content a.external[href $=".MP3"],
-div#content a.external[href $=".wav"], div#content a.external[href $=".WAV"],
-div#content a.external[href $=".wma"], div#content a.external[href $=".WMA"],
-.link-audio {
-       background-position: center right;
-       background-repeat: no-repeat;
-       .background-image-svg('images/audio-icon.svg', 'images/audio-icon.png');
-       padding-right: 13px;
-}
-div#content a.external[href $=".ogm"], div#content a.external[href $=".OGM"],
-div#content a.external[href $=".avi"], div#content a.external[href $=".AVI"],
-div#content a.external[href $=".mpeg"], div#content a.external[href $=".MPEG"],
-div#content a.external[href $=".mpg"], div#content a.external[href $=".MPG"],
-.link-video {
-       background-position: center right;
-       background-repeat: no-repeat;
-       .background-image-svg('images/video-icon.svg', 'images/video-icon.png');
-       padding-right: 13px;
-}
-div#content a.external[href $=".pdf"], div#content a.external[href $=".PDF"],
-div#content a.external[href *=".pdf#"], div#content a.external[href *=".PDF#"],
-div#content a.external[href *=".pdf?"], div#content a.external[href *=".PDF?"],
-.link-document {
-       background-position: center right;
-       background-repeat: no-repeat;
-       .background-image-svg('images/document-icon.svg', 'images/document-icon.png');
-       padding-right: 13px;
-}
diff --git a/skins/vector/images/page-fade.png b/skins/vector/images/page-fade.png
deleted file mode 100644 (file)
index b4a6034..0000000
Binary files a/skins/vector/images/page-fade.png and /dev/null differ
diff --git a/skins/vector/screen.less b/skins/vector/screen.less
deleted file mode 100644 (file)
index 4651b48..0000000
+++ /dev/null
@@ -1,693 +0,0 @@
-/*
- * Any rules which should not be flipped automatically in right-to-left situations should be
- * prepended with @noflip in a comment block.
- *
- * This stylesheet employs a few CSS trick to accomplish compatibility with a wide range of web
- * browsers. The most common trick is to use some styles in IE6 only. This is accomplished by using
- * a rule that makes things work in IE6, and then following it with a rule that begins with
- * "html > body" or use a child selector ">", which is ignored by IE6 because it does not support
- * the child selector. You can spot this by looking for the "OVERRIDDEN BY COMPLIANT BROWSERS" and
- * "IGNORED BY IE6" comments.
- */
-@import "mediawiki.mixins";
-
-/* Framework */
-html {
-       font-size: @html-font-size;
-}
-html,
-body {
-       height: 100%;
-       margin: 0;
-       padding: 0;
-       font-family: @content-font-family;
-}
-body {
-       background-color: #f6f6f6;
-       font-size: @body-font-size;
-}
-/* Content */
-div#content {
-       line-height: @content-line-height;
-       margin-left: 10em;
-       padding: @content-padding;
-       /* Border on top, left, and bottom side */
-       border: 1px solid #a7d7f9;
-       border-right-width: 0;
-       /* Merge the border with tabs' one (in their background image) */
-       margin-top: -1px;
-       background-color: white;
-       color: @content-font-color;
-       direction: ltr;
-}
-/* Hide, but keep accessible for screen-readers */
-#mw-navigation h2 {
-       position: absolute;
-       top: -9999px;
-}
-/* Head */
-#mw-page-base {
-       height: 5em;
-       background-color: white;
-       .background-image('images/page-fade.png');
-       background-position: bottom left;
-       background-repeat: repeat-x;
-}
-#mw-head-base {
-       margin-top: -5em;
-       margin-left: 10em;
-       height: 5em;
-}
-div#mw-head {
-       position: absolute;
-       top: 0;
-       right: 0;
-       width: 100%;
-}
-div#mw-head h3 {
-       margin: 0;
-       padding: 0;
-}
-/* Hide empty portlets */
-div.emptyPortlet {
-               display: none;
-}
-/* Personal */
-#p-personal {
-       position: absolute;
-       top: 0.33em;
-       right: 0.75em;
-       /* Display on top of page tabs - bugs 37158, 48078 */
-       z-index: 100;
-}
-#p-personal h3 {
-       display: none;
-}
-#p-personal ul {
-       list-style-type: none;
-       list-style-image: none;
-       margin: 0;
-       padding-left: 10em; /* Keep from overlapping logo */
-}
-#p-personal li {
-       line-height: 1.125em;
-       /* @noflip */
-       float: left;
-       margin-left: 0.75em;
-       margin-top: 0.5em;
-       font-size: @menu-personal-font-size;
-       white-space: nowrap;
-}
-/* Navigation Containers */
-#left-navigation {
-       float: left;
-       margin-left: 10em;
-       margin-top: 2.5em;
-       /* When right nav would overlap left nav, it's placed below it
-          (normal CSS floats behavior). This rule ensures that no empty space
-          is shown between them due to right nav's margin-top. Page layout
-          is still broken, but at least the nav overlaps only the page title
-          instead of half the content. */
-       margin-bottom: -2.5em;
-       /* IE 6 double-margin bug fix */
-       display: inline;
-}
-#right-navigation {
-       float: right;
-       margin-top: 2.5em;
-}
-/* Navigation Labels */
-div.vectorTabs h3,
-div.vectorMenu h3 span {
-       display: none;
-}
-/* Namespaces and Views */
-div.vectorTabs {
-       /* @noflip */
-       float: left;
-       height: 2.5em;
-}
-div.vectorTabs {
-       .background-image('images/tab-break.png');
-       background-position: bottom left;
-       background-repeat: no-repeat;
-       padding-left: 1px;
-}
-div.vectorTabs ul {
-       /* @noflip */
-       float: left;
-       height: 100%;
-       list-style-type: none;
-       list-style-image: none;
-       margin: 0;
-       padding: 0;
-}
-/* OVERRIDDEN BY COMPLIANT BROWSERS */
-div.vectorTabs ul li {
-       /* @noflip */
-       float: left;
-       line-height: 1.125em;
-       display: inline-block;
-       height: 100%;
-       margin: 0;
-       padding: 0;
-       background-color: #f3f3f3;
-       .background-image('images/tab-normal-fade.png');
-       background-position: bottom left;
-       background-repeat: repeat-x;
-       white-space: nowrap;
-}
-/* IGNORED BY IE6 */
-div.vectorTabs ul > li {
-       display: block;
-}
-div.vectorTabs li.selected {
-       .background-image('images/tab-current-fade.png');
-}
-/* OVERRIDDEN BY COMPLIANT BROWSERS */
-div.vectorTabs li a {
-       display: inline-block;
-       height: 1.9em;
-       padding-left: 0.5em;
-       padding-right: 0.5em;
-       color: @menu-link-color;
-       cursor: pointer;
-       font-size: 0.8em;
-}
-/* IGNORED BY IE6 */
-div.vectorTabs li > a {
-       display: block;
-}
-div.vectorTabs li.icon a {
-       background-position: bottom right;
-       background-repeat: no-repeat;
-}
-/* OVERRIDDEN BY COMPLIANT BROWSERS */
-div.vectorTabs span a {
-       display: inline-block;
-       padding-top: 1.25em;
-}
-/* IGNORED BY IE6 */
-div.vectorTabs span > a {
-       /* @noflip */
-       float: left;
-       display: block;
-}
-div.vectorTabs span {
-       display: inline-block;
-       .background-image('images/tab-break.png');
-       background-position: bottom right;
-       background-repeat: no-repeat;
-}
-div.vectorTabs li.selected a,
-div.vectorTabs li.selected a:visited{
-       color: #333;
-       text-decoration: none;
-}
-div.vectorTabs li.new a,
-div.vectorTabs li.new a:visited{
-       color: #a55858;
-}
-/* Variants and Actions */
-div.vectorMenu {
-       /* @noflip */
-       direction: ltr;
-       /* @noflip */
-       float: left;
-       /* SVG support using a transparent gradient to guarantee cross-browser
-        * compatibility (browsers able to understand gradient syntax support also SVG) */
-       .background-image-svg('images/arrow-down-icon.svg', 'images/arrow-down-icon.png');
-       /* @noflip */
-       background-position: 100% 60%;
-       background-repeat: no-repeat;
-       cursor: pointer;
-}
-div.vectorMenuFocus {
-       /* SVG support using a transparent gradient to guarantee cross-browser
-        * compatibility (browsers able to understand gradient syntax support also SVG) */
-       .background-image-svg('images/arrow-down-focus-icon.svg', 'images/arrow-down-focus-icon.png');
-       background-position: 100% 60%;
-}
-body.rtl div.vectorMenu {
-       /* @noflip */
-       direction: rtl;
-}
-/* OVERRIDDEN BY COMPLIANT BROWSERS */
-div#mw-head div.vectorMenu h3 {
-       /* @noflip */
-       float: left;
-       .background-image('images/tab-break.png');
-       background-repeat: no-repeat;
-       background-position: bottom left;
-       margin-left: -1px;
-}
-/* IGNORED BY IE6 */
-div#mw-head div.vectorMenu > h3 {
-       background-image: none;
-}
-div#mw-head div.vectorMenu h4,
-div.vectorMenu#p-variants #mw-vector-current-variant {
-       display: inline-block;
-       float: left;
-       font-size: 0.8em;
-       padding-left: 0.5em;
-       padding-top: 1.375em;
-       font-weight: normal;
-       border: none;
-}
-/* OVERRIDDEN BY COMPLIANT BROWSERS */
-div.vectorMenu h3 a {
-       display: inline-block;
-       width: 24px;
-       height: 1.9em;
-       text-decoration: none;
-       .background-image('images/tab-break.png');
-       background-repeat: no-repeat;
-       background-position: bottom right;
-}
-/* IGNORED BY IE6 */
-div.vectorMenu h3 > a {
-       display: block;
-}
-div.vectorMenu div.menu {
-       position: relative;
-       display: none;
-       clear: both;
-       text-align: left;
-}
-/* OVERRIDDEN BY COMPLIANT BROWSERS */
-body.rtl div.vectorMenu div.menu {
-       /* @noflip */
-       margin-left: 24px;
-}
-/* IGNORED BY IE6 */
-body.rtl div.vectorMenu > div.menu {
-       /* @noflip */
-       margin-left: auto;
-}
-/* IGNORED BY IE6 */
-/* Also fixes old versions of FireFox */
-body.rtl div.vectorMenu > div.menu,
-x:-moz-any-link {
-       /* @noflip */
-       margin-left: 23px;
-}
-/* Enable forcing showing of the menu for accessibility */
-div.vectorMenu:hover div.menu,
-div.vectorMenu div.menuForceShow {
-       display: block;
-}
-div.vectorMenu ul {
-       position: absolute;
-       background-color: white;
-       border: solid 1px silver;
-       border-top-width: 0;
-       list-style-type: none;
-       list-style-image: none;
-       padding: 0;
-       margin: 0;
-       margin-left: -1px;
-       text-align: left;
-}
-/* Fixes old versions of FireFox */
-div.vectorMenu ul,
-x:-moz-any-link {
-       min-width: 5em;
-}
-/* Returns things back to normal in modern versions of FireFox */
-div.vectorMenu ul,
-x:-moz-any-link,
-x:default {
-       min-width: 0;
-}
-div.vectorMenu li {
-       padding: 0;
-       margin: 0;
-       text-align: left;
-       line-height: 1em;
-}
-/* OVERRIDDEN BY COMPLIANT BROWSERS */
-div.vectorMenu li a {
-       display: inline-block;
-       padding: 0.5em;
-       white-space: nowrap;
-       color: @menu-link-color;
-       cursor: pointer;
-       font-size: 0.8em;
-}
-/* IGNORED BY IE6 */
-div.vectorMenu li > a {
-       display: block;
-}
-div.vectorMenu li.selected a,
-div.vectorMenu li.selected a:visited {
-       color: #333;
-       text-decoration: none;
-}
-/* Search */
-#p-search h3 {
-       display: none;
-}
-#p-search {
-       /* @noflip */
-       float: left;
-}
-#p-search {
-       margin-right: 0.5em;
-       margin-left: 0.5em;
-}
-#p-search form,
-#p-search input {
-       margin: 0;
-       margin-top: 0.4em;
-}
-div#simpleSearch {
-       display: block;
-       width: 14em;
-       height: 1.4em;
-       margin-top: 0.65em;
-       position: relative;
-       min-height: 1px; /* Gotta trigger hasLayout for IE7 */
-       border: solid 1px #aaa;
-       color: black;
-       background-color: white;
-       .background-image('images/search-fade.png');
-       background-position: top left;
-       background-repeat: repeat-x;
-}
-div#simpleSearch input:focus {
-       outline: none;
-}
-div#simpleSearch input {
-       color: black;
-}
-div#simpleSearch input.placeholder {
-       color: #999;
-}
-div#simpleSearch input::-webkit-input-placeholder {
-       color: #999;
-}
-div#simpleSearch input:-moz-placeholder {
-       color: #999;
-}
-div#simpleSearch input:-ms-input-placeholder {
-       color: #999;
-}
-div#simpleSearch input#searchInput {
-       position: absolute;
-       top: 0;
-       left: 0;
-       width: 90%;
-       margin: 0;
-       padding: 0;
-       padding-left: 0.2em;
-       padding-top: 0.2em;
-       padding-bottom: 0.2em;
-       outline: none;
-       border: none;
-       /*
-        * DON'T PANIC! Browsers that won't scale this properly are the same browsers that have JS issues that prevent
-        * this from ever being shown anyways.
-       */
-       font-size: 13px;
-       background-color: transparent;
-       direction: ltr;
-}
-div#simpleSearch button#searchButton {
-       position: absolute;
-       width: 10%;
-       right: 0;
-       top: 0;
-       padding: 0;
-       padding-top: 0.3em;
-       padding-bottom: 0.2em;
-       padding-right: 0.4em;
-       margin: 0;
-       border: none;
-       cursor: pointer;
-       background-color: transparent;
-       background-image: none;
-}
-/* OVERRIDDEN BY COMPLIANT BROWSERS */
-div#simpleSearch button#searchButton img {
-       border: none;
-       margin: 0;
-       margin-top: -3px;
-       padding: 0;
-}
-/* IGNORED BY IE6 */
-div#simpleSearch button#searchButton > img {
-       margin: 0;
-}
-/* Panel */
-div#mw-panel {
-       font-size: @menu-main-font-size;
-       position: absolute;
-       top: 160px;
-       padding-top: 1em;
-       width: 10em;
-       left: 0;
-}
-div#mw-panel div.portal {
-       padding-bottom: 1.5em;
-       direction: ltr;
-}
-div#mw-panel div.portal h3 {
-       font-weight: normal;
-       color: #444;
-       padding: @menu-main-heading-padding;
-       cursor: default;
-       border: none;
-       font-size: @menu-main-heading-font-size;
-}
-div#mw-panel div.portal div.body {
-       padding-top: 0.5em;
-       margin: @menu-main-body-margin;
-
-       .background-image('images/portal-break.png');
-       background-repeat: no-repeat;
-       background-position: top left;
-}
-div#mw-panel div.portal div.body ul {
-       list-style-type: none;
-       list-style-image: none;
-       padding: @menu-main-body-padding;
-       margin: 0;
-}
-div#mw-panel div.portal div.body ul li {
-       line-height: 1.125em;
-       padding: 0;
-       padding-bottom: 0.5em;
-       margin: 0;
-       font-size: @menu-main-body-font-size;
-       word-wrap: break-word;
-}
-div#mw-panel div.portal div.body ul li a {
-       color: @menu-main-body-link-color;
-       &:visited {
-               color: @menu-main-body-link-visited-color;
-       }
-}
-
-/* Footer */
-div#footer {
-       margin-left: 10em;
-       margin-top: 0;
-       padding: 0.75em;
-       direction: ltr;
-}
-div#footer ul {
-       list-style-type: none;
-       list-style-image: none;
-       margin: 0;
-       padding: 0;
-}
-div#footer ul li {
-       margin: 0;
-       padding: 0;
-       padding-top: 0.5em;
-       padding-bottom: 0.5em;
-       color: #333;
-       font-size: 0.7em;
-}
-div#footer #footer-icons {
-       float: right;
-}
-
-body.ltr div#footer #footer-places {
-       /* @noflip */
-       float: left;
-}
-div#footer #footer-info li {
-       line-height: 1.4em;
-}
-div#footer #footer-icons li {
-       float: left;
-       margin-left: 0.5em;
-       line-height: 2em;
-       text-align: right;
-}
-div#footer #footer-places li {
-       float: left;
-       margin-right: 1em;
-       line-height: 2em;
-}
-/* Logo */
-#p-logo {
-       position: absolute;
-       top: -160px;
-       left: 0;
-       width: 10em;
-       height: 160px;
-}
-#p-logo a {
-       display: block;
-       width: 10em;
-       height: 160px;
-       background-repeat: no-repeat;
-       background-position: center center;
-       text-decoration: none;
-}
-
-ul {
-       list-style-type: disc;
-       .list-style-image('images/bullet-icon.png');
-}
-
-pre, .mw-code {
-       line-height: 1.3em;
-}
-
-/* Site Notice (includes notices from CentralNotice extension) */
-#siteNotice {
-       font-size: 0.8em;
-}
-#firstHeading {
-       padding-top: 0;
-       margin-top: 0;
-       font-size: @content-heading-font-size;
-}
-
-/* Icon for Usernames */
-#pt-userpage,
-#pt-anonuserpage,
-#pt-login {
-       background-position: left top;
-       background-repeat: no-repeat;
-       /* SVG support using a transparent gradient to guarantee cross-browser
-        * compatibility (browsers able to understand gradient syntax support also SVG) */
-       .background-image-svg('images/user-icon.svg', 'images/user-icon.png');
-       padding-left: 15px !important;
-}
-
-.redirectText {
-       font-size: 140%;
-}
-
-.redirectMsg img {
-       vertical-align: text-bottom;
-}
-
-#bodyContent {
-       position: relative;
-       width: 100%;
-       line-height: 1.5em;
-       font-size: @content-font-size;
-}
-
-/* mediawiki.notification */
-.skin-vector .mw-notification-area {
-       font-size: 0.8em;
-}
-.skin-vector .mw-notification-area-layout {
-       top: 7em;
-}
-.skin-vector .mw-notification {
-       background-color: #fff;
-       background-color: rgba(255, 255, 255, 0.93);
-       padding: 0.75em 1.5em;
-       border: solid 1px #a7d7f9;
-       border-radius: 0.75em;
-       -webkit-box-shadow: 0 2px 10px 0 rgba(0, 0, 0, 0.125);
-       box-shadow: 0 2px 10px 0 rgba(0, 0, 0, 0.125);
-}
-
-/* Watch/Unwatch Icon Styling */
-#ca-unwatch.icon a,
-#ca-watch.icon a {
-       margin: 0;
-       padding: 0;
-       outline: none;
-       display: block;
-       width: 26px;
-       /* This hides the text but shows the background image */
-       padding-top: 3.1em;
-       margin-top: 0;
-       /* Only applied in IE6 */
-       margin-top: -0.8em !ie;
-       height: 0;
-       overflow: hidden;
-       .background-image('images/watch-icons.png');
-}
-#ca-unwatch.icon a {
-       background-position: -43px 60%;
-}
-#ca-watch.icon a {
-       background-position: 5px 60%;
-}
-#ca-unwatch.icon a:hover,
-#ca-unwatch.icon a:focus {
-       background-position: -67px 60%;
-}
-#ca-watch.icon a:hover,
-#ca-watch.icon a:focus {
-       background-position: -19px 60%;
-}
-#ca-unwatch.icon a.loading,
-#ca-watch.icon a.loading {
-       .background-image('images/watch-icon-loading.gif');
-       background-position: 5px 60%;
-}
-#ca-unwatch.icon a span,
-#ca-watch.icon a span {
-       display: none;
-}
-div.vectorTabs ul {
-       .background-image('images/tab-break.png');
-       background-position: right bottom;
-       background-repeat: no-repeat;
-}
-
-/* Tooltips are outside of the normal body code, so this helps make the size of the text sensible */
-.tipsy {
-       font-size: 0.8em;
-}
-
-/* Animate between standard and high definition layouts */
-body.vector-animateLayout {
-       div#content,
-       div#footer,
-       #left-navigation {
-               .transition(margin-left 250ms, padding 250ms;);
-       }
-
-       #p-logo {
-               .transition(left 250ms);
-       }
-
-       #mw-panel {
-               .transition(padding-right 250ms);
-       }
-
-       #p-search {
-               .transition(margin-right 250ms);
-       }
-
-       #p-personal {
-               .transition(right 250ms);
-       }
-
-       #mw-head-base {
-               .transition(margin-left 250ms);
-       }
-}
index bd45851..8d5423a 100644 (file)
@@ -1,9 +1,11 @@
 @import "variables.less";
 
 @media screen {
-       @import "screen.less";
-       @import "externalLinks.less";
-       @import "collapsibleNav.less";
+       @import "components/common.less";
+       @import "components/navigation.less";
+       @import "components/footer.less";
+       @import 'components/notifications.less';
+       @import "components/externalLinks.less";
 }
 
 @media screen and (min-width: 982px) {
index f818401..c2d0b92 100644 (file)
@@ -3,6 +3,8 @@
 @body-font-size: 1em;
 
 // Page content
+// FIXME: Use global variable since Echo and CentralNotice use this variable
+@content-border-color: #a7d7f9;
 @content-font-family: sans-serif;
 @content-font-color: black;
 @content-font-size: 0.8em;
 @content-padding: 1.25em 1.5em 1.5em 1.5em;
 @content-heading-font-size: 1.6em;
 @content-heading-font-family: sans-serif;
+@body-background-color: #fff;
+
+// Navigation
+@menu-background-color: #f6f6f6;
 
 // Common menu
 @menu-link-color: #0645ad;
index 58df552..ea4b0f6 100644 (file)
@@ -47,11 +47,6 @@ $wgAutoloadClasses += array(
        'RevisionStorageTest' => "$testDir/phpunit/includes/RevisionStorageTest.php",
        'WikiPageTest' => "$testDir/phpunit/includes/WikiPageTest.php",
 
-       //db
-       'ORMTableTest' => "$testDir/phpunit/includes/db/ORMTableTest.php",
-       'PageORMTableForTesting' => "$testDir/phpunit/includes/db/ORMTableTest.php",
-       'DatabaseTestHelper' => "$testDir/phpunit/includes/db/DatabaseTestHelper.php",
-
        # tests/phpunit/includes/api
        'ApiFormatTestBase' => "$testDir/phpunit/includes/api/format/ApiFormatTestBase.php",
        'ApiTestCase' => "$testDir/phpunit/includes/api/ApiTestCase.php",
@@ -71,21 +66,22 @@ $wgAutoloadClasses += array(
 
        # tests/phpunit/includes/db
        'ORMRowTest' => "$testDir/phpunit/includes/db/ORMRowTest.php",
+       'ORMTableTest' => "$testDir/phpunit/includes/db/ORMTableTest.php",
+       'PageORMTableForTesting' => "$testDir/phpunit/includes/db/ORMTableTest.php",
+       'DatabaseTestHelper' => "$testDir/phpunit/includes/db/DatabaseTestHelper.php",
 
-       # tests/phpunit/includes/parser
-       'NewParserTest' => "$testDir/phpunit/includes/parser/NewParserTest.php",
-       'MediaWikiParserTest' => "$testDir/phpunit/includes/parser/MediaWikiParserTest.php",
+       # tests/phpunit/languages
+       'LanguageClassesTestCase' => "$testDir/phpunit/languages/LanguageClassesTestCase.php",
 
        # tests/phpunit/includes/libs
        'GenericArrayObjectTest' => "$testDir/phpunit/includes/libs/GenericArrayObjectTest.php",
 
+       # tests/phpunit/maintenance
+       'DumpTestCase' => "$testDir/phpunit/maintenance/DumpTestCase.php",
+
        # tests/phpunit/media
        'FakeDimensionFile' => "$testDir/phpunit/includes/media/FakeDimensionFile.php",
 
-       # tests/phpunit/includes/site
-       'SiteTest' => "$testDir/phpunit/includes/site/SiteTest.php",
-       'TestSites' => "$testDir/phpunit/includes/site/TestSites.php",
-
        # tests/phpunit/mocks
        'MockFSFile' => "$testDir/phpunit/mocks/filebackend/MockFSFile.php",
        'MockFileBackend' => "$testDir/phpunit/mocks/filebackend/MockFileBackend.php",
@@ -93,13 +89,13 @@ $wgAutoloadClasses += array(
        'MockImageHandler' => "$testDir/phpunit/mocks/media/MockImageHandler.php",
        'MockSvgHandler' => "$testDir/phpunit/mocks/media/MockSvgHandler.php",
 
-       # tests/phpunit/languages
-       'LanguageClassesTestCase' => "$testDir/phpunit/languages/LanguageClassesTestCase.php",
-
-       # tests/phpunit/maintenance
-       'DumpTestCase' => "$testDir/phpunit/maintenance/DumpTestCase.php",
-
        # tests/parser
+       'NewParserTest' => "$testDir/phpunit/includes/parser/NewParserTest.php",
+       'MediaWikiParserTest' => "$testDir/phpunit/includes/parser/MediaWikiParserTest.php",
        'ParserTest' => "$testDir/parser/parserTest.inc",
        'ParserTestParserHook' => "$testDir/parser/parserTestsParserHook.php",
+
+       # tests/phpunit/includes/site
+       'SiteTest' => "$testDir/phpunit/includes/site/SiteTest.php",
+       'TestSites' => "$testDir/phpunit/includes/site/TestSites.php",
 );
index ce2c734..a868214 100644 (file)
@@ -12117,7 +12117,7 @@ MSIE CSS safety test: comment in expression
 !! end
 
 !! test
-CSS safety test: vertical tab
+CSS safety test (all browsers): vertical tab (bug 55332 / CVE-2013-4567)
 !! input
 <p style="font-size: 100px; background-image:url\b(https://www.google.com/images/srpr/logo6w.png)">A</p>
 !! result
@@ -12126,7 +12126,7 @@ CSS safety test: vertical tab
 !! end
 
 !! test
-MSIE CSS safety test: Fullwidth
+MSIE 6 CSS safety test: Fullwidth (bug 55332)
 !! input
 <p style="font-size: 100px; color: expression((title='XSSed'),'red')">A</p>
 <div style="top:EXPRESSION(alert())">B</div>
@@ -12137,7 +12137,7 @@ MSIE CSS safety test: Fullwidth
 !! end
 
 !! test
-MSIE CSS safety test: IPA extensions
+MSIE 6 CSS safety test: IPA extensions (bug 55332)
 !! input
 <div style="background-image:uʀʟ(javascript:alert())">A</div>
 <p style="font-size: 100px; color: expʀessɪoɴ((title='XSSed'),'red')">B</p>
@@ -12148,7 +12148,7 @@ MSIE CSS safety test: IPA extensions
 !! end
 
 !! test
-MSIE CSS safety test: sup/sub script
+MSIE 6 CSS safety test: sup/sub script (bug 55332)
 !! input
 <div style="background-image:url⁽javascript:alert())">A</div>
 <div style="background-image:url₍javascript:alert())">B</div>
@@ -12161,7 +12161,18 @@ MSIE CSS safety test: sup/sub script
 !! end
 
 !! test
-MSIE CSS safety test: Repetition markers
+Opera -o-link CSS
+!! input
+<div
+title="&#100;&#97;&#116;&#97;&#58;&#116;&#101;&#120;&#116;&#47;&#104;&#116;&#109;&#108;&#44;&#60;&#105;&#109;&#103;&#32;&#115;&#114;&#99;&#61;&#49;&#32;&#111;&#110;&#101;&#114;&#114;&#111;&#114;&#61;&#97;&#108;&#101;&#114;&#116;&#40;&#49;&#41;&#62;"
+style="-o-link:attr(title);-o-link-source:current">X</div>
+!! result
+<div title="data:text/html,&lt;img src=1 onerror=alert(1)&gt;" style="/* insecure input */">X</div>
+
+!! end
+
+!! test
+MSIE 6 CSS safety test: Repetition markers (bug 55332)
 !! input
 <p style="font-size: 100px; color: expres〱ion((title='XSSed'),'red')">A</p>
 <p style="font-size: 100px; color: expresゝion((title='XSSed'),'red')">B</p>
@@ -16687,6 +16698,19 @@ language=be-tarask
 </p>
 !! end
 
+!! test
+Wrong option for formatNum (bug 56199)
+!! input
+{{formatnum:1,234.56|Random}}
+{{formatnum:1,234.56|EVERYTHING}}
+{{formatnum:1234.56|any argument that has the string 'NOSEP'}}
+!! result
+<p>1,234.56
+1,234.56
+1,234.56
+</p>
+!! end
+
 !! test
 Strip marker in grammar
 !! options
index 9ebca3f..95b5047 100644 (file)
@@ -966,4 +966,44 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
 
                $this->assertInstanceOf( $expected, $pokemons, $message );
        }
+
+       /**
+        * Asserts that the given string is a valid HTML snippet.
+        * Wraps the given string in the required top level tags and
+        * then calls assertValidHtmlDocument().
+        * The snippet is expected to be HTML 5.
+        *
+        * @note: Will mark the test as skipped if the "tidy" module is not installed.
+        * @note: This ignores $wgUseTidy, so we can check for valid HTML even (and especially)
+        *        when automatic tidying is disabled.
+        *
+        * @param string $html An HTML snippet (treated as the contents of the body tag).
+        */
+       protected function assertValidHtmlSnippet( $html ) {
+               $html = '<!DOCTYPE html><html><head><title>test</title></head><body>' . $html . '</body></html>';
+               $this->assertValidHtmlDocument( $html );
+       }
+
+       /**
+        * Asserts that the given string is valid HTML document.
+        *
+        * @note: Will mark the test as skipped if the "tidy" module is not installed.
+        * @note: This ignores $wgUseTidy, so we can check for valid HTML even (and especially)
+        *        when automatic tidying is disabled.
+        *
+        * @param string $html A complete HTML document
+        */
+       protected function assertValidHtmlDocument( $html ) {
+               // Note: we only validate if the tidy PHP extension is available.
+               // In case wgTidyInternal is false, MWTidy would fall back to the command line version
+               // of tidy. In that case however, we can not reliably detect whether a failing validation
+               // is due to malformed HTML, or caused by tidy not being installed as a command line tool.
+               // That would cause all HTML assertions to fail on a system that has no tidy installed.
+               if ( !$GLOBALS['wgTidyInternal'] ) {
+                       $this->markTestSkipped( 'Tidy extension not installed' );
+               }
+
+               $ok = MWTidy::checkErrors( $html, $errors );
+               $this->assertTrue( $ok, 'HTML validation errors: ' . $errors );
+       }
 }
diff --git a/tests/phpunit/data/autoloader/TestAutoloadedAliasedClassNew.php b/tests/phpunit/data/autoloader/TestAutoloadedAliasedClassNew.php
deleted file mode 100644 (file)
index 5ce8483..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?php
-
-class TestAutoloadedAliasedClassNew {
-}
diff --git a/tests/phpunit/includes/ArrayUtilsTest.php b/tests/phpunit/includes/ArrayUtilsTest.php
new file mode 100644 (file)
index 0000000..3e5ebb7
--- /dev/null
@@ -0,0 +1,311 @@
+<?php
+/**
+ * Test class for ArrayUtils class
+ *
+ * @group Database
+ */
+
+class ArrayUtilsTest extends MediaWikiTestCase {
+       private $search;
+
+       /**
+        * @covers ArrayUtils::findLowerBound
+        * @dataProvider provideFindLowerBound
+        */
+       function testFindLowerBound(
+               $valueCallback, $valueCount, $comparisonCallback, $target, $expected
+       ) {
+               $this->assertSame(
+                       ArrayUtils::findLowerBound(
+                               $valueCallback, $valueCount, $comparisonCallback, $target
+                       ), $expected
+               );
+       }
+
+       function provideFindLowerBound() {
+               $self = $this;
+               $indexValueCallback = function( $size ) use ( $self ) {
+                       return function( $val ) use ( $self, $size ) {
+                               $self->assertTrue( $val >= 0 );
+                               $self->assertTrue( $val < $size );
+                               return $val;
+                       };
+               };
+               $comparisonCallback = function( $a, $b ) {
+                       return $a - $b;
+               };
+
+               return array(
+                       array(
+                               $indexValueCallback( 0 ),
+                               0,
+                               $comparisonCallback,
+                               1,
+                               false,
+                       ),
+                       array(
+                               $indexValueCallback( 1 ),
+                               1,
+                               $comparisonCallback,
+                               -1,
+                               false,
+                       ),
+                       array(
+                               $indexValueCallback( 1 ),
+                               1,
+                               $comparisonCallback,
+                               0,
+                               0,
+                       ),
+                       array(
+                               $indexValueCallback( 1 ),
+                               1,
+                               $comparisonCallback,
+                               1,
+                               0,
+                       ),
+                       array(
+                               $indexValueCallback( 2 ),
+                               2,
+                               $comparisonCallback,
+                               -1,
+                               false,
+                       ),
+                       array(
+                               $indexValueCallback( 2 ),
+                               2,
+                               $comparisonCallback,
+                               0,
+                               0,
+                       ),
+                       array(
+                               $indexValueCallback( 2 ),
+                               2,
+                               $comparisonCallback,
+                               0.5,
+                               0,
+                       ),
+                       array(
+                               $indexValueCallback( 2 ),
+                               2,
+                               $comparisonCallback,
+                               1,
+                               1,
+                       ),
+                       array(
+                               $indexValueCallback( 2 ),
+                               2,
+                               $comparisonCallback,
+                               1.5,
+                               1,
+                       ),
+                       array(
+                               $indexValueCallback( 3 ),
+                               3,
+                               $comparisonCallback,
+                               1,
+                               1,
+                       ),
+                       array(
+                               $indexValueCallback( 3 ),
+                               3,
+                               $comparisonCallback,
+                               1.5,
+                               1,
+                       ),
+                       array(
+                               $indexValueCallback( 3 ),
+                               3,
+                               $comparisonCallback,
+                               2,
+                               2,
+                       ),
+                       array(
+                               $indexValueCallback( 3 ),
+                               3,
+                               $comparisonCallback,
+                               3,
+                               2,
+                       ),
+               );
+       }
+
+       /**
+        * @covers ArrayUtils::arrayDiffAssocRecursive
+        * @dataProvider provideArrayDiffAssocRecursive
+        */
+       function testArrayDiffAssocRecursive( $expected ) {
+               $args = func_get_args();
+               array_shift( $args );
+               $this->assertEquals( call_user_func_array(
+                       'ArrayUtils::arrayDiffAssocRecursive', $args
+               ), $expected );
+       }
+
+       function provideArrayDiffAssocRecursive() {
+               return array(
+                       array(
+                               array(),
+                               array(),
+                               array(),
+                       ),
+                       array(
+                               array(),
+                               array(),
+                               array(),
+                               array(),
+                       ),
+                       array(
+                               array( 1 ),
+                               array( 1 ),
+                               array(),
+                       ),
+                       array(
+                               array( 1 ),
+                               array( 1 ),
+                               array(),
+                               array(),
+                       ),
+                       array(
+                               array(),
+                               array(),
+                               array( 1 ),
+                       ),
+                       array(
+                               array(),
+                               array(),
+                               array( 1 ),
+                               array( 2 ),
+                       ),
+                       array(
+                               array( '' => 1 ),
+                               array( '' => 1 ),
+                               array(),
+                       ),
+                       array(
+                               array(),
+                               array(),
+                               array( '' => 1 ),
+                       ),
+                       array(
+                               array( 1 ),
+                               array( 1 ),
+                               array( 2 ),
+                       ),
+                       array(
+                               array(),
+                               array( 1 ),
+                               array( 2 ),
+                               array( 1 ),
+                       ),
+                       array(
+                               array(),
+                               array( 1 ),
+                               array( 1, 2 ),
+                       ),
+                       array(
+                               array( 1 => 1 ),
+                               array( 1 => 1 ),
+                               array( 1 ),
+                       ),
+                       array(
+                               array(),
+                               array( 1 => 1 ),
+                               array( 1 ),
+                               array( 1 => 1),
+                       ),
+                       array(
+                               array(),
+                               array( 1 => 1 ),
+                               array( 1, 1, 1 ),
+                       ),
+                       array(
+                               array(),
+                               array( array() ),
+                               array(),
+                       ),
+                       array(
+                               array(),
+                               array( array( array() ) ),
+                               array(),
+                       ),
+                       array(
+                               array( 1, array( 1 ) ),
+                               array( 1, array( 1 ) ),
+                               array(),
+                       ),
+                       array(
+                               array( 1 ),
+                               array( 1, array( 1 ) ),
+                               array( 2, array( 1 ) ),
+                       ),
+                       array(
+                               array(),
+                               array( 1, array( 1 ) ),
+                               array( 2, array( 1 ) ),
+                               array( 1, array( 2 ) ),
+                       ),
+                       array(
+                               array( 1 ),
+                               array( 1, array() ),
+                               array( 2 ),
+                       ),
+                       array(
+                               array(),
+                               array( 1, array() ),
+                               array( 2 ),
+                               array( 1 ),
+                       ),
+                       array(
+                               array( 1, array( 1 => 2 ) ),
+                               array( 1, array( 1, 2 ) ),
+                               array( 2, array( 1 ) ),
+                       ),
+                       array(
+                               array( 1 ),
+                               array( 1, array( 1, 2 ) ),
+                               array( 2, array( 1 ) ),
+                               array( 2, array( 1 => 2 ) ),
+                       ),
+                       array(
+                               array( 1 => array( 1, 2 ) ),
+                               array( 1, array( 1, 2 ) ),
+                               array( 1, array( 2 ) ),
+                       ),
+                       array(
+                               array( 1 => array( array( 2, 3 ), 2 ) ),
+                               array( 1, array( array( 2, 3 ), 2 ) ),
+                               array( 1, array( 2 ) ),
+                       ),
+                       array(
+                               array( 1 => array( array( 2 ), 2 ) ),
+                               array( 1, array( array( 2, 3 ), 2 ) ),
+                               array( 1, array( array( 1 => 3 ) ) ),
+                       ),
+                       array(
+                               array( 1 => array( 1 => 2 ) ),
+                               array( 1, array( array( 2, 3 ), 2 ) ),
+                               array( 1, array( array( 1 => 3, 0 => 2 ) ) ),
+                       ),
+                       array(
+                               array( 1 => array( 1 => 2 ) ),
+                               array( 1, array( array( 2, 3 ), 2 ) ),
+                               array( 1, array( array( 1 => 3 ) ) ),
+                               array( 1 => array( array( 2 ) ) ),
+                       ),
+                       array(
+                               array(),
+                               array( 1, array( array( 2, 3 ), 2 ) ),
+                               array( 1 => array( 1 => 2, 0 => array( 1 => 3, 0 => 2 ) ), 0 => 1 ),
+                       ),
+                       array(
+                               array(),
+                               array( 1, array( array( 2, 3 ), 2 ) ),
+                               array( 1 => array( 1 => 2 ) ),
+                               array( 1 => array( array( 1 => 3 ) ) ),
+                               array( 1 => array( array( 2 ) ) ),
+                               array( 1 ),
+                       ),
+               );
+       }
+}
index f0049fe..480d7d2 100644 (file)
@@ -91,28 +91,6 @@ class BlockTest extends MediaWikiLangTestCase {
                $this->assertLessThan( 2, $delta, "If no timestamp is specified, the block is recorded as time()" );
        }
 
-       /**
-        * This is the method previously used to load block info in CheckUser etc
-        * passing an empty value (empty string, null, etc) as the ip parameter bypasses IP lookup checks.
-        *
-        * This stopped working with r84475 and friends: regression being fixed for bug 29116.
-        *
-        * @dataProvider provideBug29116Data
-        * @covers Block::load
-        */
-       public function testBug29116LoadWithEmptyIp( $vagueTarget ) {
-               $this->hideDeprecated( 'Block::load' );
-
-               $uid = User::idFromName( 'UTBlockee' );
-               $this->assertTrue( ( $uid > 0 ), 'Must be able to look up the target user during tests' );
-
-               $block = new Block();
-               $ok = $block->load( $vagueTarget, $uid );
-               $this->assertTrue( $ok, "Block->load() with empty IP and user ID '$uid' should return a block" );
-
-               $this->assertTrue( $this->block->equals( $block ), "Block->load() returns the same block as the one that was made when given empty ip param " . var_export( $vagueTarget, true ) );
-       }
-
        /**
         * CheckUser since being changed to use Block::newFromTarget started failing
         * because the new function didn't accept empty strings like Block::load()
index c6a7169..213e610 100644 (file)
@@ -10,9 +10,7 @@
 class CollationTest extends MediaWikiLangTestCase {
        protected function setUp() {
                parent::setUp();
-               if ( !extension_loaded( 'intl' ) ) {
-                       $this->markTestSkipped( 'These tests require intl extension' );
-               }
+               $this->checkPHPExtension( 'intl' );
        }
 
        /**
index 0b04c6e..e28a92c 100644 (file)
@@ -5,19 +5,12 @@ class DiffHistoryBlobTest extends MediaWikiTestCase {
        protected function setUp() {
                parent::setUp();
 
-               if ( !extension_loaded( 'xdiff' ) ) {
-                       $this->markTestSkipped( 'The xdiff extension is not available' );
+               $this->checkPHPExtension( 'hash' );
+               $this->checkPHPExtension( 'xdiff' );
 
-                       return;
-               }
                if ( !function_exists( 'xdiff_string_rabdiff' ) ) {
                        $this->markTestSkipped( 'The version of xdiff extension is lower than 1.5.0' );
 
-                       return;
-               }
-               if ( !extension_loaded( 'hash' ) ) {
-                       $this->markTestSkipped( 'The hash extension is not available' );
-
                        return;
                }
        }
index 7ef0b60..99a6efd 100644 (file)
@@ -16,6 +16,8 @@ class HtmlFormatterTest extends MediaWikiTestCase {
                }
                $formatter->filterContent();
                $html = $formatter->getText();
+
+               $this->assertValidHtmlSnippet( $html );
                $this->assertEquals( self::normalize( $expected ), self::normalize( $html ) );
        }
 
diff --git a/tests/phpunit/includes/MWTimestampTest.php b/tests/phpunit/includes/MWTimestampTest.php
new file mode 100644 (file)
index 0000000..fccd53b
--- /dev/null
@@ -0,0 +1,304 @@
+<?php
+
+/**
+ * Tests timestamp parsing and output.
+ */
+class MWTimestampTest extends MediaWikiLangTestCase {
+
+       protected function setUp() {
+               parent::setUp();
+
+               RequestContext::getMain()->setLanguage( Language::factory( 'en' ) );
+       }
+
+       /**
+        * Test parsing of valid timestamps and outputing to MW format.
+        * @dataProvider provideValidTimestamps
+        * @covers MWTimestamp::getTimestamp
+        */
+       public function testValidParse( $format, $original, $expected ) {
+               $timestamp = new MWTimestamp( $original );
+               $this->assertEquals( $expected, $timestamp->getTimestamp( TS_MW ) );
+       }
+
+       /**
+        * Test outputting valid timestamps to different formats.
+        * @dataProvider provideValidTimestamps
+        * @covers MWTimestamp::getTimestamp
+        */
+       public function testValidOutput( $format, $expected, $original ) {
+               $timestamp = new MWTimestamp( $original );
+               $this->assertEquals( $expected, (string)$timestamp->getTimestamp( $format ) );
+       }
+
+       /**
+        * Test an invalid timestamp.
+        * @expectedException TimestampException
+        * @covers MWTimestamp
+        */
+       public function testInvalidParse() {
+               new MWTimestamp( "This is not a timestamp." );
+       }
+
+       /**
+        * Test requesting an invalid output format.
+        * @expectedException TimestampException
+        * @covers MWTimestamp::getTimestamp
+        */
+       public function testInvalidOutput() {
+               $timestamp = new MWTimestamp( '1343761268' );
+               $timestamp->getTimestamp( 98 );
+       }
+
+       /**
+        * Returns a list of valid timestamps in the format:
+        * array( type, timestamp_of_type, timestamp_in_MW )
+        */
+       public static function provideValidTimestamps() {
+               return array(
+                       // Various formats
+                       array( TS_UNIX, '1343761268', '20120731190108' ),
+                       array( TS_MW, '20120731190108', '20120731190108' ),
+                       array( TS_DB, '2012-07-31 19:01:08', '20120731190108' ),
+                       array( TS_ISO_8601, '2012-07-31T19:01:08Z', '20120731190108' ),
+                       array( TS_ISO_8601_BASIC, '20120731T190108Z', '20120731190108' ),
+                       array( TS_EXIF, '2012:07:31 19:01:08', '20120731190108' ),
+                       array( TS_RFC2822, 'Tue, 31 Jul 2012 19:01:08 GMT', '20120731190108' ),
+                       array( TS_ORACLE, '31-07-2012 19:01:08.000000', '20120731190108' ),
+                       array( TS_POSTGRES, '2012-07-31 19:01:08 GMT', '20120731190108' ),
+                       // Some extremes and weird values
+                       array( TS_ISO_8601, '9999-12-31T23:59:59Z', '99991231235959' ),
+                       array( TS_UNIX, '-62135596801', '00001231235959' )
+               );
+       }
+
+       /**
+        * @dataProvider provideHumanTimestampTests
+        * @covers MWTimestamp::getHumanTimestamp
+        */
+       public function testHumanTimestamp(
+               $tsTime, // The timestamp to format
+               $currentTime, // The time to consider "now"
+               $timeCorrection, // The time offset to use
+               $dateFormat, // The date preference to use
+               $expectedOutput, // The expected output
+               $desc // Description
+       ) {
+               $user = $this->getMock( 'User' );
+               $user->expects( $this->any() )
+                       ->method( 'getOption' )
+                       ->with( 'timecorrection' )
+                       ->will( $this->returnValue( $timeCorrection ) );
+
+               $user->expects( $this->any() )
+                       ->method( 'getDatePreference' )
+                       ->will( $this->returnValue( $dateFormat ) );
+
+               $tsTime = new MWTimestamp( $tsTime );
+               $currentTime = new MWTimestamp( $currentTime );
+
+               $this->assertEquals(
+                       $expectedOutput,
+                       $tsTime->getHumanTimestamp( $currentTime, $user ),
+                       $desc
+               );
+       }
+
+       public static function provideHumanTimestampTests() {
+               return array(
+                       array(
+                               '20111231170000',
+                               '20120101000000',
+                               'Offset|0',
+                               'mdy',
+                               'Yesterday at 17:00',
+                               '"Yesterday" across years',
+                       ),
+                       array(
+                               '20120717190900',
+                               '20120717190929',
+                               'Offset|0',
+                               'mdy',
+                               'just now',
+                               '"Just now"',
+                       ),
+                       array(
+                               '20120717190900',
+                               '20120717191530',
+                               'Offset|0',
+                               'mdy',
+                               '6 minutes ago',
+                               'X minutes ago',
+                       ),
+                       array(
+                               '20121006173100',
+                               '20121006173200',
+                               'Offset|0',
+                               'mdy',
+                               '1 minute ago',
+                               '"1 minute ago"',
+                       ),
+                       array(
+                               '20120617190900',
+                               '20120717190900',
+                               'Offset|0',
+                               'mdy',
+                               'June 17',
+                               'Another month'
+                       ),
+                       array(
+                               '19910130151500',
+                               '20120716193700',
+                               'Offset|0',
+                               'mdy',
+                               '15:15, January 30, 1991',
+                               'Different year',
+                       ),
+                       array(
+                               '20120101050000',
+                               '20120101080000',
+                               'Offset|-360',
+                               'mdy',
+                               'Yesterday at 23:00',
+                               '"Yesterday" across years with time correction',
+                       ),
+                       array(
+                               '20120714184300',
+                               '20120716184300',
+                               'Offset|-420',
+                               'mdy',
+                               'Saturday at 11:43',
+                               'Recent weekday with time correction',
+                       ),
+                       array(
+                               '20120714184300',
+                               '20120715040000',
+                               'Offset|-420',
+                               'mdy',
+                               '11:43',
+                               'Today at another time with time correction',
+                       ),
+                       array(
+                               '20120617190900',
+                               '20120717190900',
+                               'Offset|0',
+                               'dmy',
+                               '17 June',
+                               'Another month with dmy'
+                       ),
+                       array(
+                               '20120617190900',
+                               '20120717190900',
+                               'Offset|0',
+                               'ISO 8601',
+                               '06-17',
+                               'Another month with ISO-8601'
+                       ),
+                       array(
+                               '19910130151500',
+                               '20120716193700',
+                               'Offset|0',
+                               'ISO 8601',
+                               '1991-01-30T15:15:00',
+                               'Different year with ISO-8601',
+                       ),
+               );
+       }
+
+       /**
+        * @dataProvider provideRelativeTimestampTests
+        * @covers MWTimestamp::getRelativeTimestamp
+        */
+       public function testRelativeTimestamp(
+               $tsTime, // The timestamp to format
+               $currentTime, // The time to consider "now"
+               $timeCorrection, // The time offset to use
+               $dateFormat, // The date preference to use
+               $expectedOutput, // The expected output
+               $desc // Description
+       ) {
+               $user = $this->getMock( 'User' );
+               $user->expects( $this->any() )
+                       ->method( 'getOption' )
+                       ->with( 'timecorrection' )
+                       ->will( $this->returnValue( $timeCorrection ) );
+
+               $tsTime = new MWTimestamp( $tsTime );
+               $currentTime = new MWTimestamp( $currentTime );
+
+               $this->assertEquals(
+                       $expectedOutput,
+                       $tsTime->getRelativeTimestamp( $currentTime, $user ),
+                       $desc
+               );
+       }
+
+       public static function provideRelativeTimestampTests() {
+               return array(
+                       array(
+                               '20111231170000',
+                               '20120101000000',
+                               'Offset|0',
+                               'mdy',
+                               '7 hours ago',
+                               '"Yesterday" across years',
+                       ),
+                       array(
+                               '20120717190900',
+                               '20120717190929',
+                               'Offset|0',
+                               'mdy',
+                               '29 seconds ago',
+                               '"Just now"',
+                       ),
+                       array(
+                               '20120717190900',
+                               '20120717191530',
+                               'Offset|0',
+                               'mdy',
+                               '6 minutes and 30 seconds ago',
+                               'Combination of multiple units',
+                       ),
+                       array(
+                               '20121006173100',
+                               '20121006173200',
+                               'Offset|0',
+                               'mdy',
+                               '1 minute ago',
+                               '"1 minute ago"',
+                       ),
+                       array(
+                               '19910130151500',
+                               '20120716193700',
+                               'Offset|0',
+                               'mdy',
+                               '2 decades, 1 year, 168 days, 2 hours, 8 minutes and 48 seconds ago',
+                               'A long time ago',
+                       ),
+                       array(
+                               '20120101050000',
+                               '20120101080000',
+                               'Offset|-360',
+                               'mdy',
+                               '3 hours ago',
+                               '"Yesterday" across years with time correction',
+                       ),
+                       array(
+                               '20120714184300',
+                               '20120716184300',
+                               'Offset|-420',
+                               'mdy',
+                               '2 days ago',
+                               'Recent weekday with time correction',
+                       ),
+                       array(
+                               '20120714184300',
+                               '20120715040000',
+                               'Offset|-420',
+                               'mdy',
+                               '9 hours and 17 minutes ago',
+                               'Today at another time with time correction',
+                       ),
+               );
+       }
+}
index a3d68b6..2ba804f 100644 (file)
@@ -166,6 +166,29 @@ class StatusTest extends MediaWikiLangTestCase {
                }
        }
 
+       /**
+        * @dataProvider provideMockMessageDetails
+        * @covers Status::fatal
+        * @covers Status::getErrorsArray
+        * @covers Status::getStatusArray
+        */
+       public function testFatalWithMessage( $mockDetails ) {
+               $status = new Status();
+               $messages = $this->getMockMessages( $mockDetails );
+
+               foreach ( $messages as $message ) {
+                       $status->fatal( $message );
+               }
+               $errors = $status->getErrorsArray();
+
+               $this->assertEquals( count( $messages ), count( $errors ) );
+               foreach ( $messages as $key => $message ) {
+                       $expectedArray = array_merge( array( $message->getKey() ), $message->getParams() );
+                       $this->assertEquals( $errors[$key], $expectedArray );
+               }
+               $this->assertFalse( $status->isOK() );
+       }
+
        protected function getMockMessage( $key = 'key', $params = array() ) {
                $message = $this->getMockBuilder( 'Message' )
                        ->disableOriginalConstructor()
@@ -200,7 +223,6 @@ class StatusTest extends MediaWikiLangTestCase {
 
        /**
         * @covers Status::merge
-        * @todo test merge with $overwriteValue true
         */
        public function testMerge() {
                $status1 = new Status();
@@ -214,6 +236,23 @@ class StatusTest extends MediaWikiLangTestCase {
                $this->assertEquals( 2, count( $status1->getWarningsArray() ) + count( $status1->getErrorsArray() ) );
        }
 
+       /**
+        * @covers Status::merge
+        */
+       public function testMergeWithOverwriteValue() {
+               $status1 = new Status();
+               $status2 = new Status();
+               $message1 = $this->getMockMessage( 'warn1' );
+               $message2 = $this->getMockMessage( 'error2' );
+               $status1->warning( $message1 );
+               $status2->error( $message2 );
+               $status2->value = 'FooValue';
+
+               $status1->merge( $status2, true );
+               $this->assertEquals( 2, count( $status1->getWarningsArray() ) + count( $status1->getErrorsArray() ) );
+               $this->assertEquals( 'FooValue', $status1->getValue() );
+       }
+
        /**
         * @covers Status::hasMessage
         */
@@ -237,12 +276,14 @@ class StatusTest extends MediaWikiLangTestCase {
                $this->assertEquals( $expected, $method->invoke( $status, $params ) );
        }
 
-       /**
-        * @todo test cleanParams with a callback
-        */
        public static function provideCleanParams() {
+               $cleanCallback = function( $value ) {
+                       return '-' . $value . '-';
+               };
+
                return array(
                        array( false, array( 'foo' => 'bar' ), array( 'foo' => 'bar' ) ),
+                       array( $cleanCallback, array( 'foo' => 'bar' ), array( 'foo' => '-bar-' ) ),
                );
        }
 
diff --git a/tests/phpunit/includes/TimestampTest.php b/tests/phpunit/includes/TimestampTest.php
deleted file mode 100644 (file)
index 5338839..0000000
+++ /dev/null
@@ -1,304 +0,0 @@
-<?php
-
-/**
- * Tests timestamp parsing and output.
- */
-class TimestampTest extends MediaWikiLangTestCase {
-
-       protected function setUp() {
-               parent::setUp();
-
-               RequestContext::getMain()->setLanguage( Language::factory( 'en' ) );
-       }
-
-       /**
-        * Test parsing of valid timestamps and outputing to MW format.
-        * @dataProvider provideValidTimestamps
-        * @covers MWTimestamp::getTimestamp
-        */
-       public function testValidParse( $format, $original, $expected ) {
-               $timestamp = new MWTimestamp( $original );
-               $this->assertEquals( $expected, $timestamp->getTimestamp( TS_MW ) );
-       }
-
-       /**
-        * Test outputting valid timestamps to different formats.
-        * @dataProvider provideValidTimestamps
-        * @covers MWTimestamp::getTimestamp
-        */
-       public function testValidOutput( $format, $expected, $original ) {
-               $timestamp = new MWTimestamp( $original );
-               $this->assertEquals( $expected, (string)$timestamp->getTimestamp( $format ) );
-       }
-
-       /**
-        * Test an invalid timestamp.
-        * @expectedException TimestampException
-        * @covers MWTimestamp
-        */
-       public function testInvalidParse() {
-               new MWTimestamp( "This is not a timestamp." );
-       }
-
-       /**
-        * Test requesting an invalid output format.
-        * @expectedException TimestampException
-        * @covers MWTimestamp::getTimestamp
-        */
-       public function testInvalidOutput() {
-               $timestamp = new MWTimestamp( '1343761268' );
-               $timestamp->getTimestamp( 98 );
-       }
-
-       /**
-        * Returns a list of valid timestamps in the format:
-        * array( type, timestamp_of_type, timestamp_in_MW )
-        */
-       public static function provideValidTimestamps() {
-               return array(
-                       // Various formats
-                       array( TS_UNIX, '1343761268', '20120731190108' ),
-                       array( TS_MW, '20120731190108', '20120731190108' ),
-                       array( TS_DB, '2012-07-31 19:01:08', '20120731190108' ),
-                       array( TS_ISO_8601, '2012-07-31T19:01:08Z', '20120731190108' ),
-                       array( TS_ISO_8601_BASIC, '20120731T190108Z', '20120731190108' ),
-                       array( TS_EXIF, '2012:07:31 19:01:08', '20120731190108' ),
-                       array( TS_RFC2822, 'Tue, 31 Jul 2012 19:01:08 GMT', '20120731190108' ),
-                       array( TS_ORACLE, '31-07-2012 19:01:08.000000', '20120731190108' ),
-                       array( TS_POSTGRES, '2012-07-31 19:01:08 GMT', '20120731190108' ),
-                       // Some extremes and weird values
-                       array( TS_ISO_8601, '9999-12-31T23:59:59Z', '99991231235959' ),
-                       array( TS_UNIX, '-62135596801', '00001231235959' )
-               );
-       }
-
-       /**
-        * @dataProvider provideHumanTimestampTests
-        * @covers MWTimestamp::getHumanTimestamp
-        */
-       public function testHumanTimestamp(
-               $tsTime, // The timestamp to format
-               $currentTime, // The time to consider "now"
-               $timeCorrection, // The time offset to use
-               $dateFormat, // The date preference to use
-               $expectedOutput, // The expected output
-               $desc // Description
-       ) {
-               $user = $this->getMock( 'User' );
-               $user->expects( $this->any() )
-                       ->method( 'getOption' )
-                       ->with( 'timecorrection' )
-                       ->will( $this->returnValue( $timeCorrection ) );
-
-               $user->expects( $this->any() )
-                       ->method( 'getDatePreference' )
-                       ->will( $this->returnValue( $dateFormat ) );
-
-               $tsTime = new MWTimestamp( $tsTime );
-               $currentTime = new MWTimestamp( $currentTime );
-
-               $this->assertEquals(
-                       $expectedOutput,
-                       $tsTime->getHumanTimestamp( $currentTime, $user ),
-                       $desc
-               );
-       }
-
-       public static function provideHumanTimestampTests() {
-               return array(
-                       array(
-                               '20111231170000',
-                               '20120101000000',
-                               'Offset|0',
-                               'mdy',
-                               'Yesterday at 17:00',
-                               '"Yesterday" across years',
-                       ),
-                       array(
-                               '20120717190900',
-                               '20120717190929',
-                               'Offset|0',
-                               'mdy',
-                               'just now',
-                               '"Just now"',
-                       ),
-                       array(
-                               '20120717190900',
-                               '20120717191530',
-                               'Offset|0',
-                               'mdy',
-                               '6 minutes ago',
-                               'X minutes ago',
-                       ),
-                       array(
-                               '20121006173100',
-                               '20121006173200',
-                               'Offset|0',
-                               'mdy',
-                               '1 minute ago',
-                               '"1 minute ago"',
-                       ),
-                       array(
-                               '20120617190900',
-                               '20120717190900',
-                               'Offset|0',
-                               'mdy',
-                               'June 17',
-                               'Another month'
-                       ),
-                       array(
-                               '19910130151500',
-                               '20120716193700',
-                               'Offset|0',
-                               'mdy',
-                               '15:15, January 30, 1991',
-                               'Different year',
-                       ),
-                       array(
-                               '20120101050000',
-                               '20120101080000',
-                               'Offset|-360',
-                               'mdy',
-                               'Yesterday at 23:00',
-                               '"Yesterday" across years with time correction',
-                       ),
-                       array(
-                               '20120714184300',
-                               '20120716184300',
-                               'Offset|-420',
-                               'mdy',
-                               'Saturday at 11:43',
-                               'Recent weekday with time correction',
-                       ),
-                       array(
-                               '20120714184300',
-                               '20120715040000',
-                               'Offset|-420',
-                               'mdy',
-                               '11:43',
-                               'Today at another time with time correction',
-                       ),
-                       array(
-                               '20120617190900',
-                               '20120717190900',
-                               'Offset|0',
-                               'dmy',
-                               '17 June',
-                               'Another month with dmy'
-                       ),
-                       array(
-                               '20120617190900',
-                               '20120717190900',
-                               'Offset|0',
-                               'ISO 8601',
-                               '06-17',
-                               'Another month with ISO-8601'
-                       ),
-                       array(
-                               '19910130151500',
-                               '20120716193700',
-                               'Offset|0',
-                               'ISO 8601',
-                               '1991-01-30T15:15:00',
-                               'Different year with ISO-8601',
-                       ),
-               );
-       }
-
-       /**
-        * @dataProvider provideRelativeTimestampTests
-        * @covers MWTimestamp::getRelativeTimestamp
-        */
-       public function testRelativeTimestamp(
-               $tsTime, // The timestamp to format
-               $currentTime, // The time to consider "now"
-               $timeCorrection, // The time offset to use
-               $dateFormat, // The date preference to use
-               $expectedOutput, // The expected output
-               $desc // Description
-       ) {
-               $user = $this->getMock( 'User' );
-               $user->expects( $this->any() )
-                       ->method( 'getOption' )
-                       ->with( 'timecorrection' )
-                       ->will( $this->returnValue( $timeCorrection ) );
-
-               $tsTime = new MWTimestamp( $tsTime );
-               $currentTime = new MWTimestamp( $currentTime );
-
-               $this->assertEquals(
-                       $expectedOutput,
-                       $tsTime->getRelativeTimestamp( $currentTime, $user ),
-                       $desc
-               );
-       }
-
-       public static function provideRelativeTimestampTests() {
-               return array(
-                       array(
-                               '20111231170000',
-                               '20120101000000',
-                               'Offset|0',
-                               'mdy',
-                               '7 hours ago',
-                               '"Yesterday" across years',
-                       ),
-                       array(
-                               '20120717190900',
-                               '20120717190929',
-                               'Offset|0',
-                               'mdy',
-                               '29 seconds ago',
-                               '"Just now"',
-                       ),
-                       array(
-                               '20120717190900',
-                               '20120717191530',
-                               'Offset|0',
-                               'mdy',
-                               '6 minutes and 30 seconds ago',
-                               'Combination of multiple units',
-                       ),
-                       array(
-                               '20121006173100',
-                               '20121006173200',
-                               'Offset|0',
-                               'mdy',
-                               '1 minute ago',
-                               '"1 minute ago"',
-                       ),
-                       array(
-                               '19910130151500',
-                               '20120716193700',
-                               'Offset|0',
-                               'mdy',
-                               '2 decades, 1 year, 168 days, 2 hours, 8 minutes and 48 seconds ago',
-                               'A long time ago',
-                       ),
-                       array(
-                               '20120101050000',
-                               '20120101080000',
-                               'Offset|-360',
-                               'mdy',
-                               '3 hours ago',
-                               '"Yesterday" across years with time correction',
-                       ),
-                       array(
-                               '20120714184300',
-                               '20120716184300',
-                               'Offset|-420',
-                               'mdy',
-                               '2 days ago',
-                               'Recent weekday with time correction',
-                       ),
-                       array(
-                               '20120714184300',
-                               '20120715040000',
-                               'Offset|-420',
-                               'mdy',
-                               '9 hours and 17 minutes ago',
-                               'Today at another time with time correction',
-                       ),
-               );
-       }
-}
index ff33e82..b7df3f6 100644 (file)
@@ -234,4 +234,49 @@ class UserTest extends MediaWikiTestCase {
                $this->assertEquals( $wgDefaultUserOptions['cols'], $this->user->getOption( 'cols' ) );
                $this->assertEquals( 'test', $this->user->getOption( 'someoption' ) );
        }
+
+       /**
+        * Helper, fetch user properties from the database.
+        * @param int $userId
+        */
+       function dbUserProperties( $userId ) {
+               $res = wfGetDB( DB_SLAVE )->select(
+                       'user_properties',
+                       array( 'up_property', 'up_value' ),
+                       array( 'up_user' => $userId ),
+                       __METHOD__
+               );
+               $ret = array();
+               foreach( $res as $row ) {
+                       $ret[$row->up_property] = $row->up_value;
+               }
+               return $ret;
+       }
+
+       public function testOnlySaveChangedOptions() {
+               $user = User::newFromName( 'UnitTestUser2' );
+               $user->addToDatabase();
+
+               // Fresh user only has default, so nothing should be in the DB
+               $dbProps = $this->dbUserProperties( $user->getId() );
+               $this->assertEmpty( $dbProps,
+                       "A new user should not have any user property saved in the DB" );
+
+               // Make sure we only save the altered option
+               $user->setOption( 'changed_opt', 'alix_20281' );
+               $user->setOption( 'switch', 1 );
+               $user->setOption( 'anotherswitch', 1 );
+               $user->saveSettings();
+
+               $expected = array (
+                       'changed_opt' => 'alix_20281',
+                       'switch' => '1',
+                       'anotherswitch' => '1',
+               );
+               $dbProps = $this->dbUserProperties( $user->getId() );
+
+               $this->assertEquals( $expected, $dbProps,
+                       "non default options should be saved, and default ones should not" );
+
+       }
 }
index 759dfc7..54f447a 100644 (file)
@@ -8,7 +8,7 @@
  */
 class ApiFormatPhpTest extends ApiFormatTestBase {
 
-       public function testValidyntax( ) {
+       public function testValidSyntax( ) {
                $data = $this->apiRequest( 'php', array( 'action' => 'query', 'meta' => 'siteinfo' ) );
 
                $this->assertInternalType( 'array', unserialize( $data ) );
index f5e6568..cee2da2 100644 (file)
@@ -656,9 +656,25 @@ class FileBackendTest extends MediaWikiTestCase {
 
                if ( $withSource ) {
                        $status = $this->backend->doOperation(
-                               array( 'op' => 'create', 'content' => 'blahblah', 'dst' => $source ) );
+                               array( 'op' => 'create', 'content' => 'blahblah', 'dst' => $source,
+                                       'headers' => array( 'Content-Disposition' => 'xxx' ) ) );
                        $this->assertGoodStatus( $status,
                                "Creation of file at $source succeeded ($backendName)." );
+                       if ( $this->backend->hasFeatures( FileBackend::ATTR_HEADERS ) ) {
+                               $attr = $this->backend->getFileXAttributes( array( 'src' => $source ) );
+                               $this->assertHasHeaders( array( 'Content-Disposition' => 'xxx' ), $attr );
+                       }
+
+                       $status = $this->backend->describe( array( 'src' => $source,
+                               'headers' => array( 'Content-Disposition' => '' ) ) ); // remove
+                       $this->assertGoodStatus( $status,
+                               "Removal of header for $source succeeded ($backendName)." );
+
+                       if ( $this->backend->hasFeatures( FileBackend::ATTR_HEADERS ) ) {
+                               $attr = $this->backend->getFileXAttributes( array( 'src' => $source ) );
+                               $this->assertFalse( isset( $attr['headers']['content-disposition'] ),
+                                       "File 'Content-Disposition' header removed." );
+                       }
                }
 
                $status = $this->backend->doOperation( $op );
@@ -669,6 +685,9 @@ class FileBackendTest extends MediaWikiTestCase {
                                "Describe of file at $source succeeded ($backendName)." );
                        $this->assertEquals( array( 0 => true ), $status->success,
                                "Describe of file at $source has proper 'success' field in Status ($backendName)." );
+                       if ( $this->backend->hasFeatures( FileBackend::ATTR_HEADERS ) ) {
+                               $this->assertHasHeaders( $op['headers'], $attr );
+                       }
                } else {
                        $this->assertEquals( false, $status->isOK(),
                                "Describe of file at $source failed ($backendName)." );
@@ -677,14 +696,27 @@ class FileBackendTest extends MediaWikiTestCase {
                $this->assertBackendPathsConsistent( array( $source ) );
        }
 
+       private function assertHasHeaders( array $headers, array $attr ) {
+               foreach ( $headers as $n => $v ) {
+                       if ( $n !== '' ) {
+                               $this->assertTrue( isset( $attr['headers'][strtolower( $n )] ),
+                                       "File has '$n' header." );
+                               $this->assertEquals( $v, $attr['headers'][strtolower( $n )],
+                                       "File has '$n' header value." );
+                       } else {
+                               $this->assertFalse( isset( $attr['headers'][strtolower( $n )] ),
+                                       "File does not have '$n' header." );
+                       }
+               }
+       }
+
        public static function provider_testDescribe() {
                $cases = array();
 
                $source = self::baseStorePath() . '/unittest-cont1/e/myfacefile.txt';
 
                $op = array( 'op' => 'describe', 'src' => $source,
-                       'headers' => array( 'X-Content-Length' => '91.3', 'Content-Old-Header' => '' ),
-                       'disposition' => 'inline' );
+                       'headers' => array( 'Content-Disposition' => 'inline' ), );
                $cases[] = array(
                        $op, // operation
                        true, // with source
@@ -1292,7 +1324,7 @@ class FileBackendTest extends MediaWikiTestCase {
                $cases[] = array(
                        array( "$base/unittest-cont1/e/a/x.txt", "$base/unittest-cont1/e/a/y.txt",
                                "$base/unittest-cont1/e/a/z.txt" ),
-                       array( "contents xx", "contents xy", "contents xz" )
+                       array( "contents xx $", "contents xy 111", "contents xz" )
                );
 
                return $cases;
@@ -1359,7 +1391,7 @@ class FileBackendTest extends MediaWikiTestCase {
                $cases[] = array(
                        array( "$base/unittest-cont1/e/a/x.txt", "$base/unittest-cont1/e/a/y.txt",
                                "$base/unittest-cont1/e/a/z.txt" ),
-                       array( "contents xx", "contents xy", "contents xz" )
+                       array( "contents xx 1111", "contents xy %", "contents xz $" )
                );
 
                return $cases;
index 531a954..3d2b5d8 100644 (file)
@@ -6,7 +6,7 @@
  * @group Database
  */
 class RefreshLinksPartitionTest extends MediaWikiTestCase {
-       function __construct( $name = null, array $data = array(), $dataName = '' ) {
+       public function __construct( $name = null, array $data = array(), $dataName = '' ) {
                parent::__construct( $name, $data, $dataName );
 
                $this->tablesUsed[] = 'page';
@@ -20,9 +20,6 @@ class RefreshLinksPartitionTest extends MediaWikiTestCase {
        public function testRefreshLinks( $ns, $dbKey, $pages ) {
                $title = Title::makeTitle( $ns, $dbKey );
 
-               $dbw = wfGetDB( DB_MASTER );
-
-               $rows = array();
                foreach ( $pages as $page ) {
                        list( $bns, $bdbkey ) = $page;
                        $bpage = WikiPage::factory( Title::makeTitle( $bns, $bdbkey ) );
index a0e63a8..8402522 100644 (file)
@@ -19,12 +19,8 @@ class BitmapMetadataHandlerTest extends MediaWikiTestCase {
         * @covers BitmapMetadataHandler::Jpeg
         */
        public function testMultilingualCascade() {
-               if ( !extension_loaded( 'exif' ) ) {
-                       $this->markTestSkipped( "This test needs the exif extension." );
-               }
-               if ( !extension_loaded( 'xml' ) ) {
-                       $this->markTestSkipped( "This test needs the xml extension." );
-               }
+               $this->checkPHPExtension( 'exif' );
+               $this->checkPHPExtension( 'xml' );
 
                $this->setMwGlobals( 'wgShowEXIF', true );
 
index a2e0eb6..fb3e40e 100644 (file)
@@ -9,9 +9,7 @@ class ExifBitmapTest extends MediaWikiTestCase {
 
        protected function setUp() {
                parent::setUp();
-               if ( !extension_loaded( 'exif' ) ) {
-                       $this->markTestSkipped( "This test needs the exif extension." );
-               }
+               $this->checkPHPExtension( 'exif' );
 
                $this->setMwGlobals( 'wgShowEXIF', true );
 
index 118dc85..3cfbf1a 100644 (file)
@@ -10,9 +10,7 @@ class ExifRotationTest extends MediaWikiTestCase {
 
        protected function setUp() {
                parent::setUp();
-               if ( !extension_loaded( 'exif' ) ) {
-                       $this->markTestSkipped( "This test needs the exif extension." );
-               }
+               $this->checkPHPExtension( 'exif' );
 
                $this->handler = new BitmapHandler();
                $filePath = __DIR__ . '/../../data/media';
index 667c078..735663c 100644 (file)
@@ -10,9 +10,7 @@ class ExifTest extends MediaWikiTestCase {
 
        protected function setUp() {
                parent::setUp();
-               if ( !extension_loaded( 'exif' ) ) {
-                       $this->markTestSkipped( "This test needs the exif extension." );
-               }
+               $this->checkPHPExtension( 'exif' );
 
                $this->mediaPath = __DIR__ . '/../../data/media/';
 
index 44d8f00..605dfa8 100644 (file)
@@ -10,9 +10,7 @@ class FormatMetadataTest extends MediaWikiTestCase {
        protected function setUp() {
                parent::setUp();
 
-               if ( !extension_loaded( 'exif' ) ) {
-                       $this->markTestSkipped( "This test needs the exif extension." );
-               }
+               $this->checkPHPExtension( 'exif' );
                $filePath = __DIR__ . '/../../data/media';
                $this->backend = new FSFileBackend( array(
                        'name' => 'localtesting',
index a5bf1dc..1b28de1 100644 (file)
@@ -8,9 +8,7 @@ class JpegTest extends MediaWikiTestCase {
 
        protected function setUp() {
                parent::setUp();
-               if ( !extension_loaded( 'exif' ) ) {
-                       $this->markTestSkipped( "This test needs the exif extension." );
-               }
+               $this->checkPHPExtension( 'exif' );
 
                $this->filePath = __DIR__ . '/../../data/media/';
 
index 8d74b98..ca97698 100644 (file)
@@ -8,9 +8,7 @@ class TiffTest extends MediaWikiTestCase {
 
        protected function setUp() {
                parent::setUp();
-               if ( !extension_loaded( 'exif' ) ) {
-                       $this->markTestSkipped( "This test needs the exif extension." );
-               }
+               $this->checkPHPExtension( 'exif' );
 
                $this->setMwGlobals( 'wgShowEXIF', true );
 
index 9ec5796..61ba189 100644 (file)
@@ -7,9 +7,7 @@ class XMPTest extends MediaWikiTestCase {
 
        protected function setUp() {
                parent::setUp();
-               if ( !extension_loaded( 'xml' ) ) {
-                       $this->markTestSkipped( 'Requires libxml to do XMP parsing' );
-               }
+               $this->checkPHPExtension( 'exif' ); # Requires libxml to do XMP parsing
        }
 
        /**
index 24b077a..1267268 100644 (file)
@@ -297,6 +297,8 @@ class IPTest extends MediaWikiTestCase {
                        array( 16909060, '1.2.3.4' ),
                        array( 2130706433, '127.0.0.1' ),
                        array( '2147483648', '128.0.0.0' ),
+                       array( 2130706440, '127.0.0.08' ),
+                       array( 2130706441, '127.0.0.09' ),
                        array( '3735931646', '222.173.202.254' ),
                        array( pow( 2, 32 ) - 1, '255.255.255.255' ),
                        array( false, 'IN.VA.LI.D' ),
index 1ffe811..be18a49 100644 (file)
@@ -11,9 +11,6 @@ class AutoLoaderTest extends MediaWikiTestCase {
                        'TestAutoloadedLocalClass' => __DIR__ . '/../data/autoloader/TestAutoloadedLocalClass.php',
                        'TestAutoloadedCamlClass' => __DIR__ . '/../data/autoloader/TestAutoloadedCamlClass.php',
                        'TestAutoloadedSerializedClass' => __DIR__ . '/../data/autoloader/TestAutoloadedSerializedClass.php',
-                       'TestAutoloadedAliasedClass' => 'alias:TestAutoloadedAliasedClassNew',
-                       'TestAutoloadedAliasedClassDeprecated' => 'alias:TestAutoloadedAliasedClassNew?v=1.1',
-                       'TestAutoloadedAliasedClassNew' => __DIR__ . '/../data/autoloader/TestAutoloadedAliasedClassNew.php',
                );
                $this->setMwGlobals( 'wgAutoloadLocalClasses', $this->testLocalClasses + $wgAutoloadLocalClasses );
                AutoLoader::resetAutoloadLocalClassesLower();
@@ -41,29 +38,12 @@ class AutoLoaderTest extends MediaWikiTestCase {
 
        protected static function checkAutoLoadConf() {
                global $wgAutoloadLocalClasses, $wgAutoloadClasses, $IP;
-               $supportsParsekit = function_exists( 'parsekit_compile_file' );
 
                // wgAutoloadLocalClasses has precedence, just like in includes/AutoLoader.php
                $expected = $wgAutoloadLocalClasses + $wgAutoloadClasses;
                $actual = array();
 
-               // Check aliases
-               foreach ( $expected as $class => $file ) {
-                       if ( substr( $file, 0, 6 ) !== 'alias:' ) {
-                               // Not an alias, so should be an actual file
-                               $files[] = $file;
-                       } else {
-                               $newClass = substr( $file, 6, strcspn( $file, '?', 6 ) );
-                               if ( isset( $expected[$newClass] ) ) {
-                                       if ( substr( $expected[$newClass], 0, 6 ) !== 'alias:' ) {
-                                               // Alias pointing to an existing MediaWiki class
-                                               $actual[$class] = $file;
-                                       }
-                               }
-                       }
-               }
-
-               $files = array_unique( $files );
+               $files = array_unique( $expected );
 
                foreach ( $files as $file ) {
                        // Only prefix $IP if it doesn't have it already.
@@ -73,17 +53,44 @@ class AutoLoaderTest extends MediaWikiTestCase {
                        } else {
                                $filePath = $file;
                        }
-                       if ( $supportsParsekit ) {
-                               $parseInfo = parsekit_compile_file( "$filePath" );
-                               $classes = array_keys( $parseInfo['class_table'] );
-                       } else {
-                               $contents = file_get_contents( "$filePath" );
-                               $m = array();
-                               preg_match_all( '/\n\s*(?:final)?\s*(?:abstract)?\s*(?:class|interface)\s+([a-zA-Z0-9_]+)/', $contents, $m, PREG_PATTERN_ORDER );
-                               $classes = $m[1];
+
+                       $contents = file_get_contents( $filePath );
+
+                       // We could use token_get_all() here, but this is faster
+                       $matches = array();
+                       preg_match_all( '/
+                               ^ [\t ]* (?:
+                                       (?:final\s+)? (?:abstract\s+)? (?:class|interface) \s+
+                                       (?P<class> [a-zA-Z0-9_]+)
+                               |
+                                       class_alias \s* \( \s*
+                                               ([\'"]) (?P<original> [^\'"]+) \g{-2} \s* , \s*
+                                               ([\'"]) (?P<alias> [^\'"]+ ) \g{-2} \s*
+                                       \) \s* ;
+                               )
+                       /imx', $contents, $matches, PREG_SET_ORDER );
+
+                       $classesInFile = array();
+                       $aliasesInFile = array();
+
+                       foreach ( $matches as $match ) {
+                               if ( !empty( $match['class'] ) ) {
+                                       $actual[$match['class']] = $file;
+                                       $classesInFile[$match['class']] = true;
+                               } else {
+                                       $aliasesInFile[$match['alias']] = $match['original'];
+                               }
                        }
-                       foreach ( $classes as $class ) {
-                               $actual[$class] = $file;
+
+                       // Only accept aliases for classes in the same file, because for correct
+                       // behavior, all aliases for a class must be set up when the class is loaded
+                       // (see <https://bugs.php.net/bug.php?id=61422>).
+                       foreach ( $aliasesInFile as $alias => $class ) {
+                               if ( isset( $classesInFile[$class] ) ) {
+                                       $actual[$alias] = $file;
+                               } else {
+                                       $actual[$alias] = "[original class not in $file]";
+                               }
                        }
                }
 
@@ -111,16 +118,4 @@ class AutoLoaderTest extends MediaWikiTestCase {
                $this->assertFalse( $uncerealized instanceof __PHP_Incomplete_Class,
                        "unserialize() can load classes case-insensitively." );
        }
-
-       function testAliasedClass() {
-               $this->assertSame( 'TestAutoloadedAliasedClassNew',
-                       get_class( new TestAutoloadedAliasedClass ) );
-       }
-
-       function testAliasedClassDeprecated() {
-               wfSuppressWarnings();
-               $this->assertSame( 'TestAutoloadedAliasedClassNew',
-                       get_class( new TestAutoloadedAliasedClassDeprecated ) );
-               wfRestoreWarnings();
-       }
 }
index 90cd546..6e13e13 100644 (file)
@@ -10,8 +10,7 @@
 
        QUnit.module( 'mediawiki.jqueryMsg', QUnit.newMwEnvironment( {
                setup: function () {
-                       this.orgMwLangauge = mw.language;
-                       mw.language = $.extend( true, {}, this.orgMwLangauge );
+                       this.originalMwLanguage = mw.language;
 
                        // Messages that are reused in multiple tests
                        mw.messages.set( {
@@ -55,7 +54,7 @@
                        } );
                },
                teardown: function () {
-                       mw.language = this.orgMwLangauge;
+                       mw.language = this.originalMwLanguage;
                }
        } ) );