Merge "Even more out-factoring to methods in the header"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Wed, 9 Nov 2016 16:18:55 +0000 (16:18 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Wed, 9 Nov 2016 16:18:55 +0000 (16:18 +0000)
371 files changed:
RELEASE-NOTES-1.28
RELEASE-NOTES-1.29
autoload.php
docs/hooks.txt
includes/AjaxDispatcher.php
includes/AjaxResponse.php
includes/CategoryViewer.php
includes/DefaultSettings.php
includes/EditPage.php
includes/Feed.php
includes/FormOptions.php
includes/GlobalFunctions.php
includes/Html.php
includes/MediaWiki.php
includes/MediaWikiServices.php
includes/MergeHistory.php
includes/OutputPage.php
includes/PHPVersionCheck.php
includes/Preferences.php
includes/Revision.php
includes/Sanitizer.php
includes/ServiceWiring.php
includes/Setup.php
includes/Title.php
includes/WatchedItemQueryService.php
includes/WatchedItemQueryServiceExtension.php [new file with mode: 0644]
includes/WatchedItemStore.php
includes/WebRequest.php
includes/WebRequestUpload.php
includes/Xml.php
includes/actions/HistoryAction.php
includes/actions/MarkpatrolledAction.php
includes/api/ApiAuthManagerHelper.php
includes/api/ApiMain.php
includes/api/ApiQueryMyStashedFiles.php
includes/api/ApiQuerySiteinfo.php
includes/api/ApiQueryTags.php
includes/api/ApiQueryWatchlist.php
includes/api/ApiRsd.php
includes/api/i18n/es.json
includes/api/i18n/fr.json
includes/api/i18n/gl.json
includes/api/i18n/ja.json
includes/api/i18n/lt.json
includes/api/i18n/nl.json
includes/api/i18n/nso.json [new file with mode: 0644]
includes/api/i18n/oc.json
includes/api/i18n/pl.json
includes/api/i18n/pt.json
includes/api/i18n/qqq.json
includes/api/i18n/ru.json
includes/api/i18n/zh-hans.json
includes/cache/UserCache.php
includes/cache/localisation/LCStoreCDB.php
includes/cache/localisation/LocalisationCache.php
includes/changetags/ChangeTags.php
includes/collation/IcuCollation.php
includes/config/HashConfig.php
includes/db/DatabaseMssql.php
includes/debug/logger/monolog/AvroFormatter.php
includes/deferred/LinksUpdate.php
includes/deferred/SearchUpdate.php
includes/diff/DifferenceEngine.php
includes/diff/WordLevelDiff.php
includes/exception/MWExceptionHandler.php
includes/export/XmlDumpWriter.php
includes/filebackend/lockmanager/MySqlLockManager.php
includes/filerepo/LocalRepo.php
includes/filerepo/file/LocalFile.php
includes/filerepo/file/OldLocalFile.php
includes/htmlform/HTMLForm.php
includes/htmlform/HTMLFormField.php
includes/htmlform/HTMLNestedFilterable.php
includes/htmlform/OOUIHTMLForm.php
includes/htmlform/VFormHTMLForm.php
includes/htmlform/fields/HTMLAutoCompleteSelectField.php
includes/htmlform/fields/HTMLCheckField.php
includes/htmlform/fields/HTMLCheckMatrix.php
includes/htmlform/fields/HTMLComboboxField.php
includes/htmlform/fields/HTMLDateTimeField.php
includes/htmlform/fields/HTMLFloatField.php
includes/htmlform/fields/HTMLHiddenField.php
includes/htmlform/fields/HTMLInfoField.php
includes/htmlform/fields/HTMLIntField.php
includes/htmlform/fields/HTMLMultiSelectField.php
includes/htmlform/fields/HTMLRadioField.php
includes/htmlform/fields/HTMLRestrictionsField.php
includes/htmlform/fields/HTMLSelectAndOtherField.php
includes/htmlform/fields/HTMLSelectField.php
includes/htmlform/fields/HTMLSelectLimitField.php
includes/htmlform/fields/HTMLSelectNamespace.php
includes/htmlform/fields/HTMLSelectOrOtherField.php
includes/htmlform/fields/HTMLSizeFilterField.php [new file with mode: 0644]
includes/htmlform/fields/HTMLTagFilter.php
includes/htmlform/fields/HTMLTextAreaField.php
includes/htmlform/fields/HTMLTextField.php
includes/http/MWHttpRequest.php
includes/installer/DatabaseInstaller.php
includes/installer/MssqlInstaller.php
includes/installer/PhpBugTests.php
includes/installer/PostgresUpdater.php
includes/installer/i18n/ar.json
includes/installer/i18n/be-tarask.json
includes/installer/i18n/bn.json
includes/installer/i18n/cs.json
includes/installer/i18n/de.json
includes/installer/i18n/en.json
includes/installer/i18n/et.json
includes/installer/i18n/gl.json
includes/installer/i18n/it.json
includes/installer/i18n/ja.json
includes/installer/i18n/lb.json
includes/installer/i18n/lt.json
includes/installer/i18n/pl.json
includes/installer/i18n/pt.json
includes/installer/i18n/ru.json
includes/installer/i18n/sl.json
includes/installer/i18n/zh-hans.json
includes/interwiki/InterwikiLookupAdapter.php [new file with mode: 0644]
includes/jobqueue/JobQueueDB.php
includes/jobqueue/JobRunner.php
includes/json/FormatJson.php
includes/libs/CSSMin.php
includes/libs/MultiHttpClient.php
includes/libs/Timing.php
includes/libs/filebackend/FileBackend.php
includes/libs/filebackend/SwiftFileBackend.php
includes/libs/jsminplus.php
includes/libs/mime/MimeAnalyzer.php
includes/libs/mime/XmlTypeCheck.php
includes/libs/rdbms/database/Database.php
includes/libs/rdbms/database/DatabaseMysqlBase.php
includes/libs/rdbms/database/DatabasePostgres.php
includes/libs/rdbms/database/DatabaseSqlite.php
includes/libs/rdbms/database/IDatabase.php
includes/libs/rdbms/database/position/MySQLMasterPos.php
includes/libs/rdbms/database/utils/SavepointPostgres.php
includes/libs/rdbms/exception/DBAccessError.php
includes/libs/rdbms/field/PostgresField.php
includes/libs/rdbms/lbfactory/ILBFactory.php
includes/libs/rdbms/lbfactory/LBFactory.php
includes/libs/rdbms/lbfactory/LBFactoryMulti.php
includes/libs/rdbms/lbfactory/LBFactorySimple.php
includes/libs/rdbms/lbfactory/LBFactorySingle.php
includes/libs/rdbms/loadbalancer/LoadBalancer.php
includes/libs/rdbms/loadmonitor/LoadMonitorMySQL.php
includes/libs/time/ConvertibleTimestamp.php
includes/libs/virtualrest/ParsoidVirtualRESTService.php
includes/libs/virtualrest/RestbaseVirtualRESTService.php
includes/mail/UserMailer.php
includes/media/DjVuImage.php
includes/media/FormatMetadata.php
includes/media/MediaHandler.php
includes/media/PNGMetadataExtractor.php
includes/media/SVGMetadataExtractor.php
includes/media/XCF.php
includes/page/Article.php
includes/page/ImagePage.php
includes/page/WikiPage.php
includes/pager/ReverseChronologicalPager.php
includes/pager/TablePager.php
includes/parser/CoreParserFunctions.php
includes/parser/LinkHolderArray.php
includes/parser/Parser.php
includes/parser/ParserOptions.php
includes/parser/ParserOutput.php
includes/registration/ExtensionRegistry.php
includes/resourceloader/ResourceLoader.php
includes/search/SearchPostgres.php
includes/session/PHPSessionHandler.php
includes/skins/BaseTemplate.php
includes/skins/SkinTemplate.php
includes/specialpage/LoginSignupSpecialPage.php
includes/specialpage/PageQueryPage.php
includes/specialpage/QueryPage.php
includes/specialpage/WantedQueryPage.php
includes/specials/SpecialActiveusers.php
includes/specials/SpecialAncientpages.php
includes/specials/SpecialBlockList.php
includes/specials/SpecialBrokenRedirects.php
includes/specials/SpecialContributions.php
includes/specials/SpecialLinkSearch.php
includes/specials/SpecialListDuplicatedFiles.php
includes/specials/SpecialMIMEsearch.php
includes/specials/SpecialMediaStatistics.php
includes/specials/SpecialMostcategories.php
includes/specials/SpecialMostinterwikis.php
includes/specials/SpecialMostlinked.php
includes/specials/SpecialMostlinkedcategories.php
includes/specials/SpecialMostlinkedtemplates.php
includes/specials/SpecialNewpages.php
includes/specials/SpecialPasswordReset.php
includes/specials/SpecialSearch.php
includes/specials/SpecialShortpages.php
includes/specials/SpecialTags.php
includes/specials/SpecialTrackingCategories.php
includes/specials/SpecialUnusedcategories.php
includes/specials/SpecialUnwatchedpages.php
includes/specials/SpecialUploadStash.php
includes/specials/SpecialWantedpages.php
includes/specials/pagers/ActiveUsersPager.php
includes/specials/pagers/NewPagesPager.php
includes/tidy/RaggettInternalPHP.php
includes/upload/UploadBase.php
includes/user/User.php
includes/utils/UIDGenerator.php
includes/widget/AUTHORS.txt
includes/widget/DateInputWidget.php [new file with mode: 0644]
languages/classes/LanguageSr.php
languages/classes/LanguageZh.php
languages/i18n/ang.json
languages/i18n/ar.json
languages/i18n/arn.json
languages/i18n/ast.json
languages/i18n/azb.json
languages/i18n/be-tarask.json
languages/i18n/be.json
languages/i18n/bg.json
languages/i18n/bgn.json
languages/i18n/bho.json
languages/i18n/bn.json
languages/i18n/bqi.json
languages/i18n/bs.json
languages/i18n/cs.json
languages/i18n/da.json
languages/i18n/de.json
languages/i18n/diq.json
languages/i18n/en.json
languages/i18n/eo.json
languages/i18n/es.json
languages/i18n/et.json
languages/i18n/ext.json
languages/i18n/fi.json
languages/i18n/fr.json
languages/i18n/gl.json
languages/i18n/he.json
languages/i18n/hr.json
languages/i18n/hu.json
languages/i18n/hy.json
languages/i18n/id.json
languages/i18n/it.json
languages/i18n/ja.json
languages/i18n/kk-cyrl.json
languages/i18n/ko.json
languages/i18n/ky.json
languages/i18n/lb.json
languages/i18n/lij.json
languages/i18n/lt.json
languages/i18n/lv.json
languages/i18n/mhr.json
languages/i18n/mk.json
languages/i18n/mn.json
languages/i18n/mt.json
languages/i18n/nah.json
languages/i18n/nan.json
languages/i18n/nb.json
languages/i18n/ne.json
languages/i18n/nl.json
languages/i18n/nn.json
languages/i18n/nso.json
languages/i18n/oc.json
languages/i18n/or.json
languages/i18n/pl.json
languages/i18n/pt-br.json
languages/i18n/pt.json
languages/i18n/qqq.json
languages/i18n/qu.json
languages/i18n/roa-tara.json
languages/i18n/ru.json
languages/i18n/sah.json
languages/i18n/scn.json
languages/i18n/sgs.json
languages/i18n/sk.json
languages/i18n/sl.json
languages/i18n/sr-ec.json
languages/i18n/sr-el.json
languages/i18n/sv.json
languages/i18n/szl.json
languages/i18n/te.json
languages/i18n/tl.json
languages/i18n/tr.json
languages/i18n/udm.json
languages/i18n/uk.json
languages/i18n/ur.json
languages/i18n/vec.json
languages/i18n/wo.json
languages/i18n/yue.json
languages/i18n/zh-hans.json
languages/i18n/zh-hant.json
languages/messages/MessagesSk.php
maintenance/Maintenance.php
maintenance/archives/patch-img_media_type.sql
maintenance/checkComposerLockUpToDate.php
maintenance/createCommonPasswordCdb.php
maintenance/dev/includes/router.php
maintenance/findHooks.php
maintenance/getLagTimes.php
maintenance/jsduck/external.js
maintenance/language/digit2html.php
maintenance/mssql/tables.sql
maintenance/mwdoc-filter.php
maintenance/rebuildLocalisationCache.php
maintenance/sqlite/archives/searchindex-fts3.sql
maintenance/tables.sql
maintenance/validateRegistrationFile.php
resources/src/jquery/jquery.accessKeyLabel.js
resources/src/jquery/jquery.byteLimit.js
resources/src/mediawiki.action/mediawiki.action.edit.preview.js
resources/src/mediawiki.legacy/oldshared.css
resources/src/mediawiki.less/mediawiki.ui/variables.less
resources/src/mediawiki.skinning/content.css
resources/src/mediawiki.widgets/mw.widgets.DateInputWidget.js
resources/src/mediawiki.widgets/mw.widgets.TitleWidget.js
resources/src/mediawiki/htmlform/ooui.styles.css
resources/src/mediawiki/mediawiki.js
resources/src/mediawiki/mediawiki.util.js
resources/src/mediawiki/page/gallery.css
resources/src/polyfill-nodeTypes.js
resources/src/startup.js
tests/common/TestsAutoLoader.php
tests/parser/TestFileEditor.php [new file with mode: 0644]
tests/parser/TestFileReader.php
tests/parser/TestRecorder.php
tests/parser/editTests.php [new file with mode: 0644]
tests/parser/parserTests.php
tests/parser/parserTests.txt
tests/phpunit/MediaWikiTestCase.php
tests/phpunit/data/upload/buggynamespace-bad.svg [new file with mode: 0644]
tests/phpunit/data/upload/buggynamespace-evilhtml.svg [new file with mode: 0644]
tests/phpunit/data/upload/buggynamespace-okay.svg [new file with mode: 0644]
tests/phpunit/data/upload/buggynamespace-okay2.svg [new file with mode: 0644]
tests/phpunit/data/upload/buggynamespace-original.svg [new file with mode: 0644]
tests/phpunit/includes/FormOptionsTest.php
tests/phpunit/includes/GitInfoTest.php
tests/phpunit/includes/HtmlTest.php
tests/phpunit/includes/HttpTest.php
tests/phpunit/includes/LinkFilterTest.php
tests/phpunit/includes/MediaWikiServicesTest.php
tests/phpunit/includes/MediaWikiTest.php
tests/phpunit/includes/PagePropsTest.php
tests/phpunit/includes/SampleTest.php
tests/phpunit/includes/SanitizerTest.php
tests/phpunit/includes/TemplateCategoriesTest.php
tests/phpunit/includes/WatchedItemQueryServiceUnitTest.php
tests/phpunit/includes/api/ApiContinuationManagerTest.php
tests/phpunit/includes/api/ApiResultTest.php
tests/phpunit/includes/api/ApiRevisionDeleteTest.php
tests/phpunit/includes/auth/AuthManagerTest.php
tests/phpunit/includes/auth/EmailNotificationSecondaryAuthenticationProviderTest.php
tests/phpunit/includes/auth/LocalPasswordPrimaryAuthenticationProviderTest.php
tests/phpunit/includes/auth/TemporaryPasswordPrimaryAuthenticationProviderTest.php
tests/phpunit/includes/auth/UserDataAuthenticationRequestTest.php
tests/phpunit/includes/db/LBFactoryTest.php
tests/phpunit/includes/exception/MWExceptionTest.php
tests/phpunit/includes/installer/DatabaseUpdaterTest.php
tests/phpunit/includes/interwiki/InterwikiLookupAdapterTest.php [new file with mode: 0644]
tests/phpunit/includes/json/FormatJsonTest.php
tests/phpunit/includes/libs/CSSMinTest.php
tests/phpunit/includes/linker/LinkRendererTest.php
tests/phpunit/includes/media/ExifBitmapTest.php
tests/phpunit/includes/session/SessionProviderTest.php
tests/phpunit/includes/session/SessionTest.php
tests/phpunit/includes/specials/QueryAllSpecialPagesTest.php
tests/phpunit/includes/upload/UploadBaseTest.php
tests/phpunit/includes/user/UserTest.php
tests/phpunit/includes/utils/BatchRowUpdateTest.php
tests/phpunit/structure/ExtensionJsonValidationTest.php
tests/phpunit/structure/ResourcesTest.php
tests/phpunit/suites/ParserTestTopLevelSuite.php
tests/qunit/suites/resources/mediawiki/mediawiki.util.test.js
tests/qunit/suites/resources/startup.test.js

index a2a986f..557162e 100644 (file)
@@ -5,6 +5,20 @@ THIS IS NOT A RELEASE YET
 MediaWiki 1.28 is an alpha-quality branch and is not recommended for use in
 production.
 
+=== Changes since 1.28.0rc0 ===
+* (T142210) The changes to move the parser "NewPP limit report" from a HTML
+  comment to a machine-readable JavaScript config option 'wgPageParseReport'
+  have been undone. They caused the human-readable limit report to be shown
+  incompletely or not at all. ParserOutput::setLimitReportData() and
+  getLimitReportData() behave as they did in MediaWiki 1.27 again.
+* (T149510) Value of {{DISPLAYTITLE:}} parser function will not be used for
+  the text of subheadings on a category page when creating it. This wasn't
+  working correctly.
+* (T106793) MediaWiki will no longer try to perform a HTTP redirect to the
+  canonical pretty URL when a non-pretty URL is used. It resulted in redirect
+  loops in some clients and in some server configurations. This undoes a change
+  made in MediaWiki 1.26.
+
 === Configuration changes in 1.28 ===
 * $wgSend404Code now affects status code of action=history if the page is not there.
 * BREAKING CHANGE: $wgHTTPProxy is now *required* for all external requests
@@ -34,6 +48,14 @@ production.
   instead of just administrators ('sysop'). Documentation for this feature is
   available at <https://www.mediawiki.org/wiki/Help:ChangeContentModel>.
 * $wgRevisionCacheExpiry is now set to one week by default instead of being disabled.
+* Magic links are now disabled by default, and can be re-enabled by modifying the value
+  of $wgEnableMagicLinks. Their usage is discouraged, but if they are manually enabled,
+  a tracking category will be added to help identify usage and make it easier to migrate
+  away from. If you depend upon magic link functionality, it is requested that you comment
+  on <https://www.mediawiki.org/wiki/Requests_for_comment/Future_of_magic_links> and
+  explain your use case(s).
+* New config variable $wgCSPFalsePositiveUrls to control what URLs to ignore
+  in upcoming Content-Security-Policy feature's reporting.
 
 === New features in 1.28 ===
 * User::isBot() method for checking if an account is a bot role account.
@@ -203,7 +225,6 @@ changes to languages because of Phabricator reports.
   * Skin::linkKnown() (use MediaWiki\Linker\LinkRenderer instead)
   * Skin::userLink() (use Linker::userLink() instead)
   * Skin::userToolLinks() (use Linker::userToolLinks() instead)
-* The 'ParserLimitReportFormat' hook was removed.
 * Disabled "bug 2702" HTML tidying of parsed UI messages on wikis where Tidy is
   disabled.
 * DifferenceEngine::generateDiffBody() was removed (deprecated since 1.21).
@@ -223,8 +244,6 @@ changes to languages because of Phabricator reports.
   Instead of --keep-uploads, use the same option to parserTests.php, but you
   must specify a directory with --upload-dir.
 * The 'jquery.arrowSteps' ResourceLoader module is now deprecated.
-* (T62604) Core parser functions returning a number now format the number according
-  to the page content language, not wiki content language.
 * IP::isConfiguredProxy() and IP::isTrustedProxy() were removed. Callers should
   migrate to using the same functions on a ProxyLookup instance, obtainable from
   MediaWikiServices.
index 6c53809..5a38cf9 100644 (file)
@@ -20,6 +20,10 @@ production.
 === Bug fixes in 1.29 ===
 
 === Action API changes in 1.29 ===
+* Submitting sensitive authentication request parameters to action=clientlogin,
+  action=createaccount, action=linkaccount, and action=changeauthenticationdata
+  in the query string is now an error. They should be submitted in the POST
+  body instead.
 
 === Action API internal changes in 1.29 ===
 
index 3a2d06f..30ef985 100644 (file)
@@ -556,6 +556,7 @@ $wgAutoloadLocalClasses = [
        'HTMLSelectNamespace' => __DIR__ . '/includes/htmlform/fields/HTMLSelectNamespace.php',
        'HTMLSelectNamespaceWithButton' => __DIR__ . '/includes/htmlform/fields/HTMLSelectNamespaceWithButton.php',
        'HTMLSelectOrOtherField' => __DIR__ . '/includes/htmlform/fields/HTMLSelectOrOtherField.php',
+       'HTMLSizeFilterField' => __DIR__ . '/includes/htmlform/fields/HTMLSizeFilterField.php',
        'HTMLSubmitField' => __DIR__ . '/includes/htmlform/fields/HTMLSubmitField.php',
        'HTMLTagFilter' => __DIR__ . '/includes/htmlform/fields/HTMLTagFilter.php',
        'HTMLTextAreaField' => __DIR__ . '/includes/htmlform/fields/HTMLTextAreaField.php',
@@ -858,6 +859,7 @@ $wgAutoloadLocalClasses = [
        'MediaWiki\\Diff\\WordAccumulator' => __DIR__ . '/includes/diff/WordAccumulator.php',
        'MediaWiki\\Interwiki\\ClassicInterwikiLookup' => __DIR__ . '/includes/interwiki/ClassicInterwikiLookup.php',
        'MediaWiki\\Interwiki\\InterwikiLookup' => __DIR__ . '/includes/interwiki/InterwikiLookup.php',
+       'MediaWiki\\Interwiki\\InterwikiLookupAdapter' => __DIR__ . '/includes/interwiki/InterwikiLookupAdapter.php',
        'MediaWiki\\Languages\\Data\\Names' => __DIR__ . '/languages/data/Names.php',
        'MediaWiki\\Languages\\Data\\ZhConversion' => __DIR__ . '/languages/data/ZhConversion.php',
        'MediaWiki\\Linker\\LinkRenderer' => __DIR__ . '/includes/linker/LinkRenderer.php',
@@ -919,6 +921,7 @@ $wgAutoloadLocalClasses = [
        'MediaWiki\\Tidy\\TidyDriverBase' => __DIR__ . '/includes/tidy/TidyDriverBase.php',
        'MediaWiki\\Widget\\ComplexNamespaceInputWidget' => __DIR__ . '/includes/widget/ComplexNamespaceInputWidget.php',
        'MediaWiki\\Widget\\ComplexTitleInputWidget' => __DIR__ . '/includes/widget/ComplexTitleInputWidget.php',
+       'MediaWiki\\Widget\\DateInputWidget' => __DIR__ . '/includes/widget/DateInputWidget.php',
        'MediaWiki\\Widget\\DateTimeInputWidget' => __DIR__ . '/includes/widget/DateTimeInputWidget.php',
        'MediaWiki\\Widget\\NamespaceInputWidget' => __DIR__ . '/includes/widget/NamespaceInputWidget.php',
        'MediaWiki\\Widget\\SearchInputWidget' => __DIR__ . '/includes/widget/SearchInputWidget.php',
@@ -1007,6 +1010,7 @@ $wgAutoloadLocalClasses = [
        'OrphanStats' => __DIR__ . '/maintenance/storage/orphanStats.php',
        'Orphans' => __DIR__ . '/maintenance/orphans.php',
        'OutputPage' => __DIR__ . '/includes/OutputPage.php',
+       'PHPVersionCheck' => __DIR__ . '/includes/PHPVersionCheck.php',
        'PNGHandler' => __DIR__ . '/includes/media/PNG.php',
        'PNGMetadataExtractor' => __DIR__ . '/includes/media/PNGMetadataExtractor.php',
        'PPCustomFrame_DOM' => __DIR__ . '/includes/parser/Preprocessor_DOM.php',
@@ -1529,6 +1533,7 @@ $wgAutoloadLocalClasses = [
        'WatchAction' => __DIR__ . '/includes/actions/WatchAction.php',
        'WatchedItem' => __DIR__ . '/includes/WatchedItem.php',
        'WatchedItemQueryService' => __DIR__ . '/includes/WatchedItemQueryService.php',
+       'WatchedItemQueryServiceExtension' => __DIR__ . '/includes/WatchedItemQueryServiceExtension.php',
        'WatchedItemStore' => __DIR__ . '/includes/WatchedItemStore.php',
        'WatchlistCleanup' => __DIR__ . '/maintenance/cleanupWatchlist.php',
        'WebInstaller' => __DIR__ . '/includes/installer/WebInstaller.php',
index 562d7b4..4543077 100644 (file)
@@ -565,6 +565,18 @@ your callback to the $tokenFunctions array and return true (returning false
 makes no sense).
 &$tokenFunctions: array(action => callback)
 
+'ApiQueryWatchlistExtractOutputData': Extract row data for ApiQueryWatchlist.
+$module: ApiQueryWatchlist instance
+$watchedItem: WatchedItem instance
+$recentChangeInfo: Array of recent change info data
+&$vals: Associative array of data to be output for the row
+
+'ApiQueryWatchlistPrepareWatchedItemQueryServiceOptions': Populate the options
+to be passed from ApiQueryWatchlist to WatchedItemQueryService.
+$module: ApiQueryWatchlist instance
+$params: Array of parameters, as would be returned by $module->extractRequestParams()
+&$options: Array of options for WatchedItemQueryService::getWatchedItemsWithRecentChangeInfo()
+
 'ApiRsdServiceApis': Add or remove APIs from the RSD services list. Each service
 should have its own entry in the $apis array and have a unique name, passed as
 key for the array that represents the service data. In this data array, the
@@ -1188,7 +1200,6 @@ wrapped in a span element which has class="patrollink".
 $differenceEngine: DifferenceEngine object
 &$markAsPatrolledLink: The "mark as patrolled" link HTML (string)
 $rcid: Recent change ID (rc_id) for this change (int)
-$token: Patrol token; $rcid is used in generating this variable
 
 'DifferenceEngineMarkPatrolledRCID': Allows extensions to possibly change the rcid parameter.
 For example the rcid might be set to zero due to the user being the same as the
@@ -1914,8 +1925,8 @@ $code: language of the preferred translations
 in various places to allow extensions to define the effective language
 links for a page.
 $title: The page's Title.
-&$links: Associative array mapping language codes to prefixed links of the
-  form "language:title".
+&$links: Array with elements of the form "language:title" in the order
+  that they will be output.
 &$linkFlags: Associative array mapping prefixed links to arrays of flags.
   Currently unused, but planned to provide support for marking individual
   language links in the UI, e.g. for featured articles.
@@ -2475,12 +2486,24 @@ cache or return false to not use it.
 &$parser: Parser object
 &$varCache: variable cache (array)
 
-'ParserLimitReport': DEPRECATED! Use ParserLimitReportPrepare instead.
+'ParserLimitReport': DEPRECATED! Use ParserLimitReportPrepare and
+ParserLimitReportFormat instead.
 Called at the end of Parser:parse() when the parser will
 include comments about size of the text parsed.
 $parser: Parser object
 &$limitReport: text that will be included (without comment tags)
 
+'ParserLimitReportFormat': Called for each row in the parser limit report that
+needs formatting. If nothing handles this hook, the default is to use "$key" to
+get the label, and "$key-value" or "$key-value-text"/"$key-value-html" to
+format the value.
+$key: Key for the limit report item (string)
+&$value: Value of the limit report item
+&$report: String onto which to append the data
+$isHTML: If true, $report is an HTML table with two columns; if false, it's
+  text intended for display in a monospaced font.
+$localize: If false, $report should be output in English.
+
 'ParserLimitReportPrepare': Called at the end of Parser:parse() when the parser
 will include comments about size of the text parsed. Hooks should use
 $output->setLimitReportData() to populate data. Functions for this hook should
@@ -2509,10 +2532,6 @@ $showEditLinks: boolean describing whether this section has an edit link
 &$globals: Array with all the globals which should be set for parser tests.
   The arrays keys serve as the globals names, its values are the globals values.
 
-'ParserTestParser': Called when creating a new instance of Parser in
-tests/parser/parserTest.inc.
-&$parser: Parser object created
-
 'ParserTestTables': Alter the list of tables to duplicate when parser tests are
 run. Use when page save hooks require the presence of custom tables to ensure
 that tests continue to run properly.
@@ -3735,6 +3754,10 @@ used to alter the SQL query which gets the list of wanted pages.
 &$user: user that watched
 &$page: WikiPage object watched
 
+'WatchedItemQueryServiceExtensions': Create a WatchedItemQueryServiceExtension.
+&$extensions: Add WatchedItemQueryServiceExtension objects to this array
+$watchedItemQueryService: Service object
+
 'WatchlistEditorBeforeFormRender': Before building the Special:EditWatchlist
 form, used to manipulate the list of pages or preload data based on that list.
 &$watchlistInfo: array of watchlisted pages in
index 9142238..d444a27 100644 (file)
@@ -90,7 +90,6 @@ class AjaxDispatcher {
                                # Or we could throw an exception:
                                # throw new MWException( __METHOD__ . ' called without any data (mode empty).' );
                }
-
        }
 
        /**
@@ -156,6 +155,5 @@ class AjaxDispatcher {
                                }
                        }
                }
-
        }
 }
index 4fe46dd..0686578 100644 (file)
@@ -161,7 +161,7 @@ class AjaxResponse {
                        // For back-compat, it is supported that mResponseCode be a string like " 200 OK"
                        // (with leading space and the status message after). Cast response code to an integer
                        // to take advantage of PHP's conversion rules which will turn "  200 OK" into 200.
-                       // http://php.net/string#language.types.string.conversion
+                       // https://secure.php.net/manual/en/language.types.string.php#language.types.string.conversion
                        $n = intval( trim( $this->mResponseCode ) );
                        HttpStatus::header( $n );
                }
index c858dd7..b95f274 100644 (file)
@@ -422,26 +422,11 @@ class CategoryViewer extends ContextSource {
                return $r;
        }
 
-       /**
-        * Return pretty name which is display name if given and different from prefix text or
-        * the unprefixed page name.
-        *
-        * @return string HTML safe name.
-        */
-       function getPrettyPageNameHtml() {
-               $displayTitle = $this->getOutput()->getPageTitle();
-               if ( $displayTitle === $this->getTitle()->getPrefixedText() ) {
-                       return htmlspecialchars( $this->getTitle()->getText() );
-               } else {
-                       return $displayTitle;
-               }
-       }
-
        /**
         * @return string
         */
        function getPagesSection() {
-               $name = $this->getPrettyPageNameHtml();
+               $ti = wfEscapeWikiText( $this->title->getText() );
                # Don't show articles section if there are none.
                $r = '';
 
@@ -457,7 +442,7 @@ class CategoryViewer extends ContextSource {
 
                if ( $rescnt > 0 ) {
                        $r = "<div id=\"mw-pages\">\n";
-                       $r .= '<h2>' . $this->msg( 'category_header' )->rawParams( $name )->parse() . "</h2>\n";
+                       $r .= '<h2>' . $this->msg( 'category_header', $ti )->parse() . "</h2>\n";
                        $r .= $countmsg;
                        $r .= $this->getSectionPagingLinks( 'page' );
                        $r .= $this->formatList( $this->articles, $this->articles_start_char );
@@ -471,7 +456,6 @@ class CategoryViewer extends ContextSource {
         * @return string
         */
        function getImageSection() {
-               $name = $this->getPrettyPageNameHtml();
                $r = '';
                $rescnt = $this->showGallery ? $this->gallery->count() : count( $this->imgsNoGallery );
                $dbcnt = $this->cat->getFileCount();
@@ -481,7 +465,10 @@ class CategoryViewer extends ContextSource {
                if ( $rescnt > 0 ) {
                        $r .= "<div id=\"mw-category-media\">\n";
                        $r .= '<h2>' .
-                               $this->msg( 'category-media-header' )->rawParams( $name )->parse() .
+                               $this->msg(
+                                       'category-media-header',
+                                       wfEscapeWikiText( $this->title->getText() )
+                               )->text() .
                                "</h2>\n";
                        $r .= $countmsg;
                        $r .= $this->getSectionPagingLinks( 'file' );
index 98dd2b7..9d8ccf8 100644 (file)
@@ -311,7 +311,7 @@ $wgAppleTouchIcon = false;
  * Value for the referrer policy meta tag.
  * One of 'never', 'default', 'origin', 'always'. Setting it to false just
  * prevents the meta tag from being output.
- * See http://www.w3.org/TR/referrer-policy/ for details.
+ * See https://www.w3.org/TR/referrer-policy/ for details.
  *
  * @since 1.25
  */
@@ -658,7 +658,7 @@ $wgLockManagers = [];
 
 /**
  * Show Exif data, on by default if available.
- * Requires PHP's Exif extension: http://www.php.net/manual/en/ref.exif.php
+ * Requires PHP's Exif extension: https://secure.php.net/manual/en/ref.exif.php
  *
  * @note FOR WINDOWS USERS:
  * To enable Exif functions, add the following line to the "Windows
@@ -1511,7 +1511,7 @@ $wgDjvuTxt = null;
  * For now we recommend you use djvudump instead. The djvuxml output is
  * probably more stable, so we'll switch back to it as soon as they fix
  * the efficiency problem.
- * http://sourceforge.net/tracker/index.php?func=detail&aid=1704049&group_id=32953&atid=406583
+ * https://sourceforge.net/tracker/index.php?func=detail&aid=1704049&group_id=32953&atid=406583
  *
  * @par Example:
  * @code
@@ -1973,7 +1973,7 @@ $wgDBerrorLog = false;
  * Defaults to the wiki timezone ($wgLocaltimezone).
  *
  * A list of usable timezones can found at:
- * http://php.net/manual/en/timezones.php
+ * https://secure.php.net/manual/en/timezones.php
  *
  * @par Examples:
  * @code
@@ -3110,7 +3110,7 @@ $wgForceUIMsgAsContentMsg = [];
  * timezone-nameinlowercase like timezone-utc.
  *
  * A list of usable timezones can found at:
- * http://php.net/manual/en/timezones.php
+ * https://secure.php.net/manual/en/timezones.php
  *
  * @par Examples:
  * @code
@@ -3178,7 +3178,7 @@ $wgHtml5 = true;
  *
  * If your wiki uses RDFa, set it to the correct value for RDFa+HTML5.
  * Correct current values are 'HTML+RDFa 1.0' or 'XHTML+RDFa 1.0'.
- * See also http://www.w3.org/TR/rdfa-in-html/#document-conformance
+ * See also https://www.w3.org/TR/rdfa-in-html/#document-conformance
  * @since 1.16
  */
 $wgHtml5Version = null;
@@ -4216,7 +4216,7 @@ $wgAllowImageTag = false;
 /**
  * Configuration for HTML postprocessing tool. Set this to a configuration
  * array to enable an external tool. Dave Raggett's "HTML Tidy" is typically
- * used. See http://www.w3.org/People/Raggett/tidy/
+ * used. See https://www.w3.org/People/Raggett/tidy/
  *
  * If this is null and $wgUseTidy is true, the deprecated configuration
  * parameters will be used instead.
@@ -4363,9 +4363,9 @@ $wgTranscludeCacheExpiry = 3600;
  * @since 1.28
  */
 $wgEnableMagicLinks = [
-       'ISBN' => true,
-       'PMID' => true,
-       'RFC' => true
+       'ISBN' => false,
+       'PMID' => false,
+       'RFC' => false
 ];
 
 /** @} */ # end of parser settings }
@@ -5747,6 +5747,8 @@ $wgGrantPermissions['viewdeleted']['browsearchive'] = true;
 $wgGrantPermissions['viewdeleted']['deletedhistory'] = true;
 $wgGrantPermissions['viewdeleted']['deletedtext'] = true;
 
+$wgGrantPermissions['viewrestrictedlogs']['suppressionlog'] = true;
+
 $wgGrantPermissions['delete'] = $wgGrantPermissions['editpage'] +
        $wgGrantPermissions['viewdeleted'];
 $wgGrantPermissions['delete']['delete'] = true;
@@ -5797,6 +5799,7 @@ $wgGrantPermissionGroups = [
        'blockusers'          => 'administration',
        'delete'              => 'administration',
        'viewdeleted'         => 'administration',
+       'viewrestrictedlogs'  => 'administration',
        'protect'             => 'administration',
        'createaccount'       => 'administration',
 
@@ -6372,9 +6375,9 @@ $wgDisableInternalSearch = false;
  * To forward to Google you'd have something like:
  * @code
  * $wgSearchForwardUrl =
- *     'http://www.google.com/search?q=$1' .
- *     '&domains=http://example.com' .
- *     '&sitesearch=http://example.com' .
+ *     'https://www.google.com/search?q=$1' .
+ *     '&domains=https://example.com' .
+ *     '&sitesearch=https://example.com' .
  *     '&ie=utf-8&oe=utf-8';
  * @endcode
  */
@@ -6707,9 +6710,9 @@ $wgFeedDiffCutoff = 32768;
  * Should be a format as key (either 'rss' or 'atom') and an URL to the feed
  * as value.
  * @par Example:
- * Configure the 'atom' feed to http://example.com/somefeed.xml
+ * Configure the 'atom' feed to https://example.com/somefeed.xml
  * @code
- * $wgSiteFeed['atom'] = "http://example.com/somefeed.xml";
+ * $wgSiteFeed['atom'] = "https://example.com/somefeed.xml";
  * @endcode
  */
 $wgOverrideSiteFeed = [];
@@ -7118,7 +7121,7 @@ $wgAutoloadAttemptLowercase = true;
  *         'Foo Barstein',
  *     ],
  *     'version' => '1.9.0',
- *     'url' => 'http://example.org/example-extension/',
+ *     'url' => 'https://example.org/example-extension/',
  *     'descriptionmsg' => 'exampleextension-desc',
  *     'license-name' => 'GPL-2.0+',
  * ];
@@ -7145,7 +7148,7 @@ $wgAutoloadAttemptLowercase = true;
  * - author: A string or an array of strings. Authors can be linked using
  *    the regular wikitext link syntax. To have an internationalized version of
  *    "and others" show, add an element "...". This element can also be linked,
- *    for instance "[http://example ...]".
+ *    for instance "[https://example ...]".
  *
  * - descriptionmsg: A message key or an an array with message key and parameters:
  *    `'descriptionmsg' => 'exampleextension-desc',`
@@ -7363,7 +7366,7 @@ $wgCategoryPagingLimit = 200;
  *     all languages in a mediocre way. However, it is better than "uppercase".
  *
  * To use the uca-default collation, you must have PHP's intl extension
- * installed. See http://php.net/manual/en/intl.setup.php . The details of the
+ * installed. See https://secure.php.net/manual/en/intl.setup.php . The details of the
  * resulting collation will depend on the version of ICU installed on the
  * server.
  *
@@ -8032,7 +8035,7 @@ $wgShellCgroup = false;
 $wgPhpCli = '/usr/bin/php';
 
 /**
- * Locale for LC_CTYPE, to work around http://bugs.php.net/bug.php?id=45132
+ * Locale for LC_CTYPE, to work around https://bugs.php.net/bug.php?id=45132
  * For Unix-like operating systems, set this to to a locale that has a UTF-8
  * character set. Only the character set is relevant.
  */
index cd6fb56..78ef2e3 100644 (file)
@@ -1044,7 +1044,6 @@ class EditPage {
 
                // Allow extensions to modify form data
                Hooks::run( 'EditPage::importFormData', [ $this, $request ] );
-
        }
 
        /**
@@ -1646,7 +1645,7 @@ class EditPage {
                                // being set. This is used by ConfirmEdit to display a captcha
                                // without any error message cruft.
                        } else {
-                               $this->hookError = $this->formatStatusErrors( $status );
+                               $this->hookError = $status->getWikiText();
                        }
                        // Use the existing $status->value if the hook set it
                        if ( !$status->value ) {
@@ -1656,7 +1655,7 @@ class EditPage {
                } elseif ( !$status->isOK() ) {
                        # ...or the hook could be expecting us to produce an error
                        // FIXME this sucks, we should just use the Status object throughout
-                       $this->hookError = $this->formatStatusErrors( $status );
+                       $this->hookError = $status->getWikiText();
                        $status->fatal( 'hookaborted' );
                        $status->value = self::AS_HOOK_ERROR_EXPECTED;
                        return false;
@@ -1665,26 +1664,6 @@ class EditPage {
                return true;
        }
 
-       /**
-        * Wrap status errors in an errorbox for increased visiblity
-        *
-        * @param Status $status
-        * @return string
-        */
-       private function formatStatusErrors( Status $status ) {
-               $errmsg = $status->getHTML(
-                       'edit-error-short',
-                       'edit-error-long',
-                       $this->context->getLanguage()
-               );
-               return <<<ERROR
-<div class="errorbox">
-{$errmsg}
-</div>
-<br clear="all" />
-ERROR;
-       }
-
        /**
         * Return the summary to be used for a new section.
         *
@@ -2257,7 +2236,6 @@ ERROR;
         * @return bool
         */
        private function mergeChangesIntoContent( &$editContent ) {
-
                $db = wfGetDB( DB_MASTER );
 
                // This is the revision the editor started from
@@ -2844,7 +2822,6 @@ ERROR;
                if ( !$wgUser->getOption( 'previewontop' ) ) {
                        $this->displayPreviewArea( $previewOutput, false );
                }
-
        }
 
        /**
@@ -2870,7 +2847,6 @@ ERROR;
                return Html::rawElement( 'div', [ 'class' => 'templatesUsed' ],
                        $templateListFormatter->format( $templates, $type )
                );
-
        }
 
        /**
@@ -3512,22 +3488,16 @@ HTML
                ] ) .
                        Html::openElement( 'tbody' );
 
-               foreach ( $output->getLimitReportData()['limitreport'] as $key => $value ) {
+               foreach ( $output->getLimitReportData() as $key => $value ) {
                        if ( Hooks::run( 'ParserLimitReportFormat',
                                [ $key, &$value, &$limitReport, true, true ]
                        ) ) {
-                               $keyMsg = wfMessage( "limitreport-$key" );
-                               $valueMsg = wfMessage(
-                                       [ "limitreport-$key-value-html", "limitreport-$key-value" ]
-                               );
+                               $keyMsg = wfMessage( $key );
+                               $valueMsg = wfMessage( [ "$key-value-html", "$key-value" ] );
                                if ( !$valueMsg->exists() ) {
                                        $valueMsg = new RawMessage( '$1' );
                                }
                                if ( !$keyMsg->isDisabled() && !$valueMsg->isDisabled() ) {
-                                       // If it's a value/limit array, convert it for $1/$2
-                                       if ( is_array( $value ) && isset( $value['value'] ) ) {
-                                               $value = [ $value['value'], $value['limit'] ];
-                                       }
                                        $limitReport .= Html::openElement( 'tr' ) .
                                                Html::rawElement( 'th', null, $keyMsg->parse() ) .
                                                Html::rawElement( 'td', null, $valueMsg->params( $value )->parse() ) .
@@ -4359,6 +4329,9 @@ HTML
                return strtr( $result, [ "&#x0" => "&#x" ] );
        }
 
+       /**
+        * @since 1.29
+        */
        protected function addEditNotices() {
                global $wgOut;
 
@@ -4377,6 +4350,9 @@ HTML
                }
        }
 
+       /**
+        * @since 1.29
+        */
        protected function addTalkPageText() {
                global $wgOut;
 
index 8bfe1c7..189fd9f 100644 (file)
@@ -236,7 +236,6 @@ abstract class ChannelFeed extends FeedItem {
                        $wgOut->addVaryHeader( 'X-Forwarded-Proto' );
                }
                $wgOut->sendCacheControl();
-
        }
 
        /**
index 5e5e8d4..725a512 100644 (file)
@@ -52,6 +52,9 @@ class FormOptions implements ArrayAccess {
         * This is useful for the namespace selector.
         */
        const INTNULL = 3;
+       /** Array type, maps guessType() to WebRequest::getArray()
+        * @since 1.29 */
+       const ARR = 5;
        /* @} */
 
        /**
@@ -120,6 +123,8 @@ class FormOptions implements ArrayAccess {
                        return self::FLOAT;
                } elseif ( is_string( $data ) ) {
                        return self::STRING;
+               } elseif ( is_array( $data ) ) {
+                       return self::ARR;
                } else {
                        throw new MWException( 'Unsupported datatype' );
                }
@@ -358,6 +363,9 @@ class FormOptions implements ArrayAccess {
                                case self::INTNULL:
                                        $value = $r->getIntOrNull( $name );
                                        break;
+                               case self::ARR:
+                                       $value = $r->getArray( $name );
+                                       break;
                                default:
                                        throw new MWException( 'Unsupported datatype' );
                        }
@@ -370,7 +378,7 @@ class FormOptions implements ArrayAccess {
 
        /** @name ArrayAccess functions
         * These functions implement the ArrayAccess PHP interface.
-        * @see http://php.net/manual/en/class.arrayaccess.php
+        * @see https://secure.php.net/manual/en/class.arrayaccess.php
         */
        /* @{ */
        /**
index bae9c77..b3ccc56 100644 (file)
@@ -40,7 +40,7 @@ use Wikimedia\ScopedCallback;
  */
 
 // hash_equals function only exists in PHP >= 5.6.0
-// http://php.net/hash_equals
+// https://secure.php.net/hash_equals
 if ( !function_exists( 'hash_equals' ) ) {
        /**
         * Check whether a user-provided string is equal to a fixed-length secret string
@@ -1670,7 +1670,9 @@ function wfClientAcceptsGzip( $force = false ) {
 function wfEscapeWikiText( $text ) {
        global $wgEnableMagicLinks;
        static $repl = null, $repl2 = null;
-       if ( $repl === null ) {
+       if ( $repl === null || defined( 'MW_PARSER_TEST' ) || defined( 'MW_PHPUNIT_TEST' ) ) {
+               // Tests depend upon being able to change $wgEnableMagicLinks, so don't cache
+               // in those situations
                $repl = [
                        '"' => '&#34;', '&' => '&#38;', "'" => '&#39;', '<' => '&#60;',
                        '=' => '&#61;', '>' => '&#62;', '[' => '&#91;', ']' => '&#93;',
@@ -2136,7 +2138,7 @@ function wfMkdirParents( $dir, $mode = null, $caller = null ) {
  */
 function wfRecursiveRemoveDir( $dir ) {
        wfDebug( __FUNCTION__ . "( $dir )\n" );
-       // taken from http://de3.php.net/manual/en/function.rmdir.php#98622
+       // taken from https://secure.php.net/manual/en/function.rmdir.php#98622
        if ( is_dir( $dir ) ) {
                $objects = scandir( $dir );
                foreach ( $objects as $object ) {
@@ -2229,8 +2231,8 @@ function wfEscapeShellArg( /*...*/ ) {
                        // Escaping for an MSVC-style command line parser and CMD.EXE
                        // @codingStandardsIgnoreStart For long URLs
                        // Refs:
-                       //  * http://web.archive.org/web/20020708081031/http://mailman.lyra.org/pipermail/scite-interest/2002-March/000436.html
-                       //  * http://technet.microsoft.com/en-us/library/cc723564.aspx
+                       //  * https://web.archive.org/web/20020708081031/http://mailman.lyra.org/pipermail/scite-interest/2002-March/000436.html
+                       //  * https://technet.microsoft.com/en-us/library/cc723564.aspx
                        //  * T15518
                        //  * CR r63214
                        // Double the backslashes before any double quotes. Escape the double quotes.
@@ -2330,7 +2332,7 @@ function wfShellExec( $cmd, &$retval = null, $environ = [],
                if ( wfIsWindows() ) {
                        /* Surrounding a set in quotes (method used by wfEscapeShellArg) makes the quotes themselves
                         * appear in the environment variable, so we must use carat escaping as documented in
-                        * http://technet.microsoft.com/en-us/library/cc723564.aspx
+                        * https://technet.microsoft.com/en-us/library/cc723564.aspx
                         * Note however that the quote isn't listed there, but is needed, and the parentheses
                         * are listed there but doesn't appear to need it.
                         */
@@ -2548,7 +2550,7 @@ function wfShellExecWithStderr( $cmd, &$retval = null, $environ = [], $limits =
 }
 
 /**
- * Workaround for http://bugs.php.net/bug.php?id=45132
+ * Workaround for https://bugs.php.net/bug.php?id=45132
  * escapeshellarg() destroys non-ASCII characters if LANG is not a UTF-8 locale
  */
 function wfInitShellLocale() {
@@ -2800,7 +2802,7 @@ function wfUseMW( $req_ver ) {
 /**
  * Return the final portion of a pathname.
  * Reimplemented because PHP5's "basename()" is buggy with multibyte text.
- * http://bugs.php.net/bug.php?id=33898
+ * https://bugs.php.net/bug.php?id=33898
  *
  * PHP's basename() only considers '\' a pathchar on Windows and Netware.
  * We'll consider it so always, as we don't want '\s' in our Unix paths either.
index 48b30c7..0b6b655 100644 (file)
@@ -3,7 +3,7 @@
  * Collection of methods to generate HTML content
  *
  * Copyright © 2009 Aryeh Gregor
- * http://www.mediawiki.org/
+ * https://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
@@ -156,10 +156,10 @@ class Html {
         * @param string $contents The raw HTML contents of the element: *not*
         *   escaped!
         * @param array $attrs Associative array of attributes, e.g., [
-        *   'href' => 'http://www.mediawiki.org/' ]. See expandAttributes() for
+        *   'href' => 'https://www.mediawiki.org/' ]. See expandAttributes() for
         *   further documentation.
         * @param string[] $modifiers classes to add to the button
-        * @see http://tools.wmflabs.org/styleguide/desktop/index.html for guidance on available modifiers
+        * @see https://tools.wmflabs.org/styleguide/desktop/index.html for guidance on available modifiers
         * @return string Raw HTML
         */
        public static function linkButton( $contents, array $attrs, array $modifiers = [] ) {
@@ -176,10 +176,10 @@ class Html {
         * @param string $contents The raw HTML contents of the element: *not*
         *   escaped!
         * @param array $attrs Associative array of attributes, e.g., [
-        *   'href' => 'http://www.mediawiki.org/' ]. See expandAttributes() for
+        *   'href' => 'https://www.mediawiki.org/' ]. See expandAttributes() for
         *   further documentation.
         * @param string[] $modifiers classes to add to the button
-        * @see http://tools.wmflabs.org/styleguide/desktop/index.html for guidance on available modifiers
+        * @see https://tools.wmflabs.org/styleguide/desktop/index.html for guidance on available modifiers
         * @return string Raw HTML
         */
        public static function submitButton( $contents, array $attrs, array $modifiers = [] ) {
@@ -200,7 +200,7 @@ class Html {
         *
         * @param string $element The element's name, e.g., 'a'
         * @param array $attribs Associative array of attributes, e.g., [
-        *   'href' => 'http://www.mediawiki.org/' ]. See expandAttributes() for
+        *   'href' => 'https://www.mediawiki.org/' ]. See expandAttributes() for
         *   further documentation.
         * @param string $contents The raw HTML contents of the element: *not*
         *   escaped!
@@ -321,7 +321,7 @@ class Html {
         *
         * @param string $element Name of the element, e.g., 'a'
         * @param array $attribs Associative array of attributes, e.g., [
-        *   'href' => 'http://www.mediawiki.org/' ].  See expandAttributes() for
+        *   'href' => 'https://www.mediawiki.org/' ].  See expandAttributes() for
         *   further documentation.
         * @return array An array of attributes functionally identical to $attribs
         */
@@ -431,8 +431,8 @@ class Html {
        /**
         * Given an associative array of element attributes, generate a string
         * to stick after the element name in HTML output.  Like [ 'href' =>
-        * 'http://www.mediawiki.org/' ] becomes something like
-        * ' href="http://www.mediawiki.org"'.  Again, this is like
+        * 'https://www.mediawiki.org/' ] becomes something like
+        * ' href="https://www.mediawiki.org"'.  Again, this is like
         * Xml::expandAttributes(), but it implements some HTML-specific logic.
         *
         * Attributes that can contain space-separated lists ('class', 'accesskey' and 'rel') array
@@ -458,7 +458,7 @@ class Html {
         * @endcode
         *
         * @param array $attribs Associative array of attributes, e.g., [
-        *   'href' => 'http://www.mediawiki.org/' ].  Values will be HTML-escaped.
+        *   'href' => 'https://www.mediawiki.org/' ].  Values will be HTML-escaped.
         *   A value of false means to omit the attribute.  For boolean attributes,
         *   you can omit the key, e.g., [ 'checked' ] instead of
         *   [ 'checked' => 'checked' ] or such.
@@ -501,8 +501,8 @@ class Html {
                                continue;
                        }
 
-                       // http://www.w3.org/TR/html401/index/attributes.html ("space-separated")
-                       // http://www.w3.org/TR/html5/index.html#attributes-1 ("space-separated")
+                       // https://www.w3.org/TR/html401/index/attributes.html ("space-separated")
+                       // https://www.w3.org/TR/html5/index.html#attributes-1 ("space-separated")
                        $spaceSeparatedListAttributes = [
                                'class', // html4, html5
                                'accesskey', // as of html5, multiple space-separated values allowed
@@ -956,7 +956,7 @@ class Html {
         * @return bool
         */
        public static function isXmlMimeType( $mimetype ) {
-               # http://www.whatwg.org/html/infrastructure.html#xml-mime-type
+               # https://html.spec.whatwg.org/multipage/infrastructure.html#xml-mime-type
                # * text/xml
                # * application/xml
                # * Any MIME type with a subtype ending in +xml (this implicitly includes application/xhtml+xml)
@@ -1005,7 +1005,7 @@ class Html {
         *
         * @note srcset width and height values are not supported.
         *
-        * @see http://www.whatwg.org/html/embedded-content-1.html#attr-img-srcset
+        * @see https://html.spec.whatwg.org/#attr-img-srcset
         *
         * @par Example:
         * @code
index f21128e..eaa1c99 100644 (file)
@@ -313,8 +313,6 @@ class MediaWiki {
         * - Normalise empty title:
         *   /wiki/ -> /wiki/Main
         *   /w/index.php?title= -> /wiki/Main
-        * - Normalise non-standard title urls:
-        *   /w/index.php?title=Foo_Bar -> /wiki/Foo_Bar
         * - Don't redirect anything with query parameters other than 'title' or 'action=view'.
         *
         * @param Title $title
@@ -327,6 +325,8 @@ class MediaWiki {
 
                if ( $request->getVal( 'action', 'view' ) != 'view'
                        || $request->wasPosted()
+                       || ( $request->getVal( 'title' ) !== null
+                               && $title->getPrefixedDBkey() == $request->getVal( 'title' ) )
                        || count( $request->getValueNames( [ 'action', 'title' ] ) )
                        || !Hooks::run( 'TestCanonicalRedirect', [ $request, $title, $output ] )
                ) {
@@ -341,19 +341,7 @@ class MediaWiki {
                }
                // Redirect to canonical url, make it a 301 to allow caching
                $targetUrl = wfExpandUrl( $title->getFullURL(), PROTO_CURRENT );
-
-               if ( $targetUrl != $request->getFullRequestURL() ) {
-                       $output->setCdnMaxage( 1200 );
-                       $output->redirect( $targetUrl, '301' );
-                       return true;
-               }
-
-               // If there is no title, or the title is in a non-standard encoding, we demand
-               // a redirect. If cgi somehow changed the 'title' query to be non-standard while
-               // the url is standard, the server is misconfigured.
-               if ( $request->getVal( 'title' ) === null
-                       || $title->getPrefixedDBkey() != $request->getVal( 'title' )
-               ) {
+               if ( $targetUrl == $request->getFullRequestURL() ) {
                        $message = "Redirect loop detected!\n\n" .
                                "This means the wiki got confused about what page was " .
                                "requested; this sometimes happens when moving a wiki " .
@@ -375,7 +363,9 @@ class MediaWiki {
                        }
                        throw new HttpError( 500, $message );
                }
-               return false;
+               $output->setSquidMaxage( 1200 );
+               $output->redirect( $targetUrl, '301' );
+               return true;
        }
 
        /**
@@ -676,14 +666,14 @@ class MediaWiki {
        /**
         * @param string $url
         * @param IContextSource $context
-        * @return string|bool Either "local" or "remote" if in the farm, false otherwise
+        * @return string Either "local", "remote" if in the farm, "external" otherwise
         */
        private static function getUrlDomainDistance( $url, IContextSource $context ) {
                static $relevantKeys = [ 'host' => true, 'port' => true ];
 
                $infoCandidate = wfParseUrl( $url );
                if ( $infoCandidate === false ) {
-                       return false;
+                       return 'external';
                }
 
                $infoCandidate = array_intersect_key( $infoCandidate, $relevantKeys );
@@ -705,7 +695,7 @@ class MediaWiki {
                        }
                }
 
-               return false;
+               return 'external';
        }
 
        /**
index ba8b71b..7c9363c 100644 (file)
@@ -22,6 +22,7 @@ use MediaWiki\Services\NoSuchServiceException;
 use MWException;
 use MimeAnalyzer;
 use ObjectCache;
+use Parser;
 use ProxyLookup;
 use SearchEngine;
 use SearchEngineConfig;
@@ -191,7 +192,6 @@ class MediaWikiServices extends ServiceContainer {
                } else {
                        $oldInstance->destroy();
                }
-
        }
 
        /**
@@ -297,7 +297,7 @@ class MediaWikiServices extends ServiceContainer {
                self::resetGlobalInstance();
 
                // Child, reseed because there is no bug in PHP:
-               // http://bugs.php.net/bug.php?id=42465
+               // https://bugs.php.net/bug.php?id=42465
                mt_srand( getmypid() );
        }
 
@@ -565,6 +565,14 @@ class MediaWikiServices extends ServiceContainer {
                return $this->getService( 'ProxyLookup' );
        }
 
+       /**
+        * @since 1.29
+        * @return Parser
+        */
+       public function getParser() {
+               return $this->getService( 'Parser' );
+       }
+
        /**
         * @since 1.28
         * @return GenderCache
index f797fe3..e57f880 100644 (file)
@@ -90,7 +90,8 @@ class MergeHistory {
                                        'revision',
                                        'MAX(rev_timestamp)',
                                        [
-                                               'rev_timestamp <= ' . $this->dbw->timestamp( $mwTimestamp ),
+                                               'rev_timestamp <= ' .
+                                                       $this->dbw->addQuotes( $this->dbw->timestamp( $mwTimestamp ) ),
                                                'rev_page' => $this->source->getArticleID()
                                        ],
                                        __METHOD__
@@ -118,7 +119,8 @@ class MergeHistory {
                                $this->timestampLimit = $lasttimestamp;
                        }
 
-                       $this->timeWhere = "rev_timestamp <= {$this->dbw->timestamp( $timeInsert )}";
+                       $this->timeWhere = "rev_timestamp <= " .
+                               $this->dbw->addQuotes( $this->dbw->timestamp( $timeInsert ) );
                } catch ( TimestampException $ex ) {
                        // The timestamp we got is screwed up and merge cannot continue
                        // This should be detected by $this->isValidMerge()
index 863a426..50629ba 100644 (file)
@@ -295,9 +295,6 @@ class OutputPage extends ContextSource {
         */
        private $copyrightUrl;
 
-       /** @var array Profiling data */
-       private $limitReportData = [];
-
        /**
         * Constructor for OutputPage. This should not be called directly.
         * Instead a new RequestContext should be created and it will implicitly create
@@ -1214,8 +1211,8 @@ class OutputPage extends ContextSource {
        /**
         * Add new language links
         *
-        * @param array $newLinkArray Associative array mapping language code to the page
-        *                      name
+        * @param string[] $newLinkArray Array of interwiki-prefixed (non DB key) titles
+        *                               (e.g. 'fr:Test page')
         */
        public function addLanguageLinks( array $newLinkArray ) {
                $this->mLanguageLinks += $newLinkArray;
@@ -1224,8 +1221,8 @@ class OutputPage extends ContextSource {
        /**
         * Reset the language links and add new language links
         *
-        * @param array $newLinkArray Associative array mapping language code to the page
-        *                      name
+        * @param string[] $newLinkArray Array of interwiki-prefixed (non DB key) titles
+        *                               (e.g. 'fr:Test page')
         */
        public function setLanguageLinks( array $newLinkArray ) {
                $this->mLanguageLinks = $newLinkArray;
@@ -1234,7 +1231,7 @@ class OutputPage extends ContextSource {
        /**
         * Get the list of language links
         *
-        * @return array Array of Interwiki Prefixed (non DB key) Titles (e.g. 'fr:Test page')
+        * @return string[] Array of interwiki-prefixed (non DB key) titles (e.g. 'fr:Test page')
         */
        public function getLanguageLinks() {
                return $this->mLanguageLinks;
@@ -1713,7 +1710,6 @@ class OutputPage extends ContextSource {
                $popts->setTidy( $oldTidy );
 
                $this->addParserOutput( $parserOutput );
-
        }
 
        /**
@@ -1776,16 +1772,11 @@ class OutputPage extends ContextSource {
                        }
                }
 
-               // Enable OOUI if requested via ParserOutput
+               // enable OOUI if requested via ParserOutput
                if ( $parserOutput->getEnableOOUI() ) {
                        $this->enableOOUI();
                }
 
-               // Include profiling data
-               if ( !$this->limitReportData ) {
-                       $this->setLimitReportData( $parserOutput->getLimitReportData() );
-               }
-
                // Link flags are ignored for now, but may in the future be
                // used to mark individual language links.
                $linkFlags = [];
@@ -2198,22 +2189,26 @@ class OutputPage extends ContextSource {
                                        # We'll purge the proxy cache explicitly, but require end user agents
                                        # to revalidate against the proxy on each visit.
                                        # Surrogate-Control controls our CDN, Cache-Control downstream caches
-                                       wfDebug( __METHOD__ . ": proxy caching with ESI; {$this->mLastModified} **", 'private' );
+                                       wfDebug( __METHOD__ .
+                                               ": proxy caching with ESI; {$this->mLastModified} **", 'private' );
                                        # start with a shorter timeout for initial testing
                                        # header( 'Surrogate-Control: max-age=2678400+2678400, content="ESI/1.0"');
-                                       $response->header( 'Surrogate-Control: max-age=' . $config->get( 'SquidMaxage' )
-                                               . '+' . $this->mCdnMaxage . ', content="ESI/1.0"' );
+                                       $response->header(
+                                               "Surrogate-Control: max-age={$config->get( 'SquidMaxage' )}" .
+                                               "+{$this->mCdnMaxage}, content=\"ESI/1.0\""
+                                       );
                                        $response->header( 'Cache-Control: s-maxage=0, must-revalidate, max-age=0' );
                                } else {
                                        # We'll purge the proxy cache for anons explicitly, but require end user agents
                                        # to revalidate against the proxy on each visit.
                                        # IMPORTANT! The CDN needs to replace the Cache-Control header with
                                        # Cache-Control: s-maxage=0, must-revalidate, max-age=0
-                                       wfDebug( __METHOD__ . ": local proxy caching; {$this->mLastModified} **", 'private' );
+                                       wfDebug( __METHOD__ .
+                                               ": local proxy caching; {$this->mLastModified} **", 'private' );
                                        # start with a shorter timeout for initial testing
                                        # header( "Cache-Control: s-maxage=2678400, must-revalidate, max-age=0" );
-                                       $response->header( 'Cache-Control: s-maxage=' . $this->mCdnMaxage
-                                               . ', must-revalidate, max-age=0' );
+                                       $response->header( "Cache-Control: " .
+                                               "s-maxage={$this->mCdnMaxage}, must-revalidate, max-age=0" );
                                }
                        } else {
                                # We do want clients to cache if they can, but they *must* check for updates
@@ -2807,8 +2802,8 @@ class OutputPage extends ContextSource {
                        // The spec recommends defining XHTML5's charset using the XML declaration
                        // instead of meta.
                        // Our XML declaration is output by Html::htmlHeader.
-                       // http://www.whatwg.org/html/semantics.html#attr-meta-http-equiv-content-type
-                       // http://www.whatwg.org/html/semantics.html#charset
+                       // https://html.spec.whatwg.org/multipage/semantics.html#attr-meta-http-equiv-content-type
+                       // https://html.spec.whatwg.org/multipage/semantics.html#charset
                        $pieces[] = Html::element( 'meta', [ 'charset' => 'UTF-8' ] );
                }
 
@@ -2963,15 +2958,6 @@ class OutputPage extends ContextSource {
                        }
                }
 
-               if ( $this->limitReportData ) {
-                       $chunks[] = ResourceLoader::makeInlineScript(
-                               ResourceLoader::makeConfigSetScript(
-                                       [ 'wgPageParseReport' => $this->limitReportData ],
-                                       true
-                               )
-                       );
-               }
-
                return self::combineWrappedStrings( $chunks );
        }
 
@@ -3692,7 +3678,7 @@ class OutputPage extends ContextSource {
        public static function transformCssMedia( $media ) {
                global $wgRequest;
 
-               // http://www.w3.org/TR/css3-mediaqueries/#syntax
+               // https://www.w3.org/TR/css3-mediaqueries/#syntax
                $screenMediaQueryRegex = '/^(?:only\s+)?screen\b/i';
 
                // Switch in on-screen display for media testing
@@ -3873,12 +3859,4 @@ class OutputPage extends ContextSource {
                        'mediawiki.widgets.styles',
                ] );
        }
-
-       /**
-        * @param array $data Data from ParserOutput::getLimitReportData()
-        * @since 1.28
-        */
-       public function setLimitReportData( array $data ) {
-               $this->limitReportData = $data;
-       }
 }
index 656ba43..e6e96c7 100644 (file)
@@ -1,4 +1,7 @@
 <?php
+// @codingStandardsIgnoreFile Generic.Arrays.DisallowLongArraySyntax
+// @codingStandardsIgnoreFile Generic.Files.LineLength
+// @codingStandardsIgnoreFile MediaWiki.Usage.DirUsage.FunctionFound
 /**
  * Check PHP Version, as well as for composer dependencies in entry points,
  * and display something vaguely comprehensible in the event of a totally
  *
  * @file
  */
-
-/**
- * Check php version and that external dependencies are installed, and
- * display an informative error if either condition is not satisfied.
- *
- * @note Since we can't rely on anything, the minimum PHP versions and MW current
- * version are hardcoded here
- */
-function wfEntryPointCheck( $entryPoint ) {
-       $mwVersion = '1.29';
-       $minimumVersionPHP = '5.5.9';
-       $phpVersion = PHP_VERSION;
-
-       if ( !function_exists( 'version_compare' )
-               || version_compare( $phpVersion, $minimumVersionPHP ) < 0
-       ) {
-               wfPHPVersionError( $entryPoint, $mwVersion, $minimumVersionPHP, $phpVersion );
-       }
-
-       // @codingStandardsIgnoreStart MediaWiki.Usage.DirUsage.FunctionFound
-       if ( !file_exists( dirname( __FILE__ ) . '/../vendor/autoload.php' ) ) {
-               // @codingStandardsIgnoreEnd
-               wfMissingVendorError( $entryPoint, $mwVersion );
-       }
-
-       // List of functions and their associated PHP extension to check for
-       // @codingStandardsIgnoreStart Generic.Arrays.DisallowLongArraySyntax
-       $extensions = array(
+class PHPVersionCheck {
+       /* @var string The number of the MediaWiki version used */
+       var $mwVersion = '1.29';
+       /* @var string The minimum php version for MediaWiki to run */
+       var $minimumVersionPHP = '5.5.9';
+       var $functionsExtensionsMapping = array(
                'mb_substr'   => 'mbstring',
                'utf8_encode' => 'xml',
                'ctype_digit' => 'ctype',
                'json_decode' => 'json',
                'iconv'       => 'iconv',
        );
-       // List of extensions we're missing
-       $missingExtensions = array();
-       // @codingStandardsIgnoreEnd
 
-       foreach ( $extensions as $function => $extension ) {
-               if ( !function_exists( $function ) ) {
-                       $missingExtensions[] = $extension;
+       /**
+        * @var string Which entry point we are protecting. One of:
+        *   - index.php
+        *   - load.php
+        *   - api.php
+        *   - mw-config/index.php
+        *   - cli
+        */
+       var $entryPoint = null;
+
+       /**
+        * @param string $entryPoint Which entry point we are protecting. One of:
+        *   - index.php
+        *   - load.php
+        *   - api.php
+        *   - mw-config/index.php
+        *   - cli
+        * @return $this
+        */
+       function setEntryPoint( $entryPoint ) {
+               $this->entryPoint = $entryPoint;
+       }
+
+       /**
+        * Returns the version of the installed php implementation.
+        *
+        * @return string
+        */
+       function getPHPImplVersion() {
+               return PHP_VERSION;
+       }
+
+       /**
+        * Displays an error, if the installed php version does not meet the minimum requirement.
+        *
+        * @return $this
+        */
+       function checkRequiredPHPVersion() {
+               if ( !function_exists( 'version_compare' )
+                    || version_compare( $this->getPHPImplVersion(), $this->minimumVersionPHP ) < 0
+               ) {
+                       $shortText = "MediaWiki $this->mwVersion requires at least PHP version"
+                                    . " $this->minimumVersionPHP, you are using PHP {$this->getPHPImplVersion()}.";
+
+                       $longText = "Error: You might be using on older PHP version. \n"
+                                   . "MediaWiki $this->mwVersion needs PHP $this->minimumVersionPHP or higher.\n\n"
+                                   . "Check if you have a newer php executable with a different name, "
+                                   . "such as php5.\n\n";
+
+                       $longHtml = <<<HTML
+                       Please consider <a href="http://www.php.net/downloads.php">upgrading your copy of PHP</a>.
+                       PHP versions less than 5.5.0 are no longer supported by the PHP Group and will not receive
+                       security or bugfix updates.
+               </p>
+               <p>
+                       If for some reason you are unable to upgrade your PHP version, you will need to
+                       <a href="https://www.mediawiki.org/wiki/Download">download</a> an older version
+                       of MediaWiki from our website.  See our
+                       <a href="https://www.mediawiki.org/wiki/Compatibility#PHP">compatibility page</a>
+                       for details of which versions are compatible with prior versions of PHP.
+HTML;
+                       $this->triggerError( 'Supported PHP versions', $shortText, $longText, $longHtml );
                }
        }
 
-       if ( $missingExtensions ) {
-               wfMissingExtensions( $entryPoint, $mwVersion, $missingExtensions );
+       /**
+        * Displays an error, if the vendor/autoload.php file could not be found.
+        *
+        * @return $this
+        */
+       function checkVendorExistence() {
+               if ( !file_exists( dirname( __FILE__ ) . '/../vendor/autoload.php' ) ) {
+                       $shortText = "Installing some external dependencies (e.g. via composer) is required.";
+
+                       $longText = "Error: You are missing some external dependencies. \n"
+                                   . "MediaWiki now also has some external dependencies that need to be installed\n"
+                                   . "via composer or from a separate git repo. Please see\n"
+                                   . "https://www.mediawiki.org/wiki/Download_from_Git#Fetch_external_libraries\n"
+                                   . "for help on installing the required components.";
+
+                       $longHtml = <<<HTML
+               MediaWiki now also has some external dependencies that need to be installed via
+               composer or from a separate git repo. Please see
+               <a href="https://www.mediawiki.org/wiki/Download_from_Git#Fetch_external_libraries">mediawiki.org</a>
+               for help on installing the required components.
+HTML;
+
+                       $this->triggerError( 'External dependencies', $shortText, $longText, $longHtml );
+               }
        }
-}
 
-/**
- * Display something vaguely comprehensible in the event of a totally unrecoverable error.
- * Does not assume access to *anything*; no globals, no autoloader, no database, no localisation.
- * Safe for PHP4 (and putting this here means that WebStart.php and GlobalSettings.php
- * no longer need to be).
- *
- * Calling this function kills execution immediately.
- *
- * @param string $type Which entry point we are protecting. One of:
- *   - index.php
- *   - load.php
- *   - api.php
- *   - mw-config/index.php
- *   - cli
- * @param string $mwVersion The number of the MediaWiki version used
- * @param string $title HTML code to be put within an <h2> tag
- * @param string $shortText
- * @param string $longText
- * @param string $longHtml
- */
-function wfGenericError( $type, $mwVersion, $title, $shortText, $longText, $longHtml ) {
-       $protocol = isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0';
+       /**
+        * Displays an error, if a PHP extension does not exist.
+        *
+        * @return $this
+        */
+       function checkExtensionExistence() {
+               $missingExtensions = array();
+               foreach ( $this->functionsExtensionsMapping as $function => $extension ) {
+                       if ( !function_exists( $function ) ) {
+                               $missingExtensions[] = $extension;
+                       }
+               }
+
+               if ( $missingExtensions ) {
+                       $shortText = "Installing some PHP extensions is required.";
+
+                       $missingExtText = '';
+                       $missingExtHtml = '';
+                       $baseUrl = 'https://secure.php.net';
+                       foreach ( $missingExtensions as $ext ) {
+                               $missingExtText .= " * $ext <$baseUrl/$ext>\n";
+                               $missingExtHtml .= "<li><b>$ext</b> "
+                                                  . "(<a href=\"$baseUrl/$ext\">more information</a>)</li>";
+                       }
+
+                       $cliText = "Error: Missing one or more required components of PHP.\n"
+                                  . "You are missing a required extension to PHP that MediaWiki needs.\n"
+                                  . "Please install:\n" . $missingExtText;
+
+                       $longHtml = <<<HTML
+               You are missing a required extension to PHP that MediaWiki
+               requires to run. Please install:
+               <ul>
+               $missingExtHtml
+               </ul>
+HTML;
+
+                       $this->triggerError( 'Required components', $shortText, $cliText, $longHtml );
+               }
+       }
+
+       /**
+        * Output headers that prevents error pages to be cached.
+        */
+       function outputHTMLHeader() {
+               $protocol = isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0';
 
-       if ( $type == 'cli' ) {
-               $finalOutput = $longText;
-       } else {
                header( "$protocol 500 MediaWiki configuration Error" );
                // Don't cache error pages!  They cause no end of trouble...
                header( 'Cache-control: none' );
                header( 'Pragma: no-cache' );
+       }
 
-               if ( $type == 'index.php' || $type == 'mw-config/index.php' ) {
-                       $pathinfo = pathinfo( $_SERVER['SCRIPT_NAME'] );
-                       if ( $type == 'mw-config/index.php' ) {
-                               $dirname = dirname( $pathinfo['dirname'] );
-                       } else {
-                               $dirname = $pathinfo['dirname'];
-                       }
-                       $encLogo = htmlspecialchars(
-                               str_replace( '//', '/', $dirname . '/' ) .
-                               'resources/assets/mediawiki.png'
-                       );
-                       $shortHtml = htmlspecialchars( $shortText );
+       /**
+        * Returns an error page, which is suitable for output to the end user via a web browser.
+        *
+        * @param $title
+        * @param $longHtml
+        * @param $shortText
+        * @return string
+        */
+       function getIndexErrorOutput( $title, $longHtml, $shortText ) {
+               $pathinfo = pathinfo( $_SERVER['SCRIPT_NAME'] );
+               if ( $this->entryPoint == 'mw-config/index.php' ) {
+                       $dirname = dirname( $pathinfo['dirname'] );
+               } else {
+                       $dirname = $pathinfo['dirname'];
+               }
+               $encLogo =
+                       htmlspecialchars( str_replace( '//', '/', $dirname . '/' ) .
+                                         'resources/assets/mediawiki.png' );
+               $shortHtml = htmlspecialchars( $shortText );
 
-                       header( 'Content-type: text/html; charset=UTF-8' );
+               header( 'Content-type: text/html; charset=UTF-8' );
 
-                       $finalOutput = <<<HTML
+               $finalOutput = <<<HTML
 <!DOCTYPE html>
 <html lang="en" dir="ltr">
        <head>
                <meta charset="UTF-8" />
-               <title>MediaWiki {$mwVersion}</title>
+               <title>MediaWiki {$this->mwVersion}</title>
                <style media='screen'>
                        body {
                                color: #000;
@@ -144,7 +231,7 @@ function wfGenericError( $type, $mwVersion, $title, $shortText, $longText, $long
        </head>
        <body>
                <img src="{$encLogo}" alt='The MediaWiki logo' />
-               <h1>MediaWiki {$mwVersion} internal error</h1>
+               <h1>MediaWiki {$this->mwVersion} internal error</h1>
                <div class='error'>
                <p>
                        {$shortHtml}
@@ -157,105 +244,59 @@ function wfGenericError( $type, $mwVersion, $title, $shortText, $longText, $long
        </body>
 </html>
 HTML;
-               // Handle everything that's not index.php
-               } else {
-                       // So nothing thinks this is JS or CSS
-                       $finalOutput = ( $type == 'load.php' ) ? "/* $shortText */" : $shortText;
-               }
-       }
-       echo "$finalOutput\n";
-       die( 1 );
-}
-
-/**
- * Display an error for the minimum PHP version requirement not being satisfied.
- *
- * @param string $type See wfGenericError
- * @param string $mwVersion See wfGenericError
- * @param string $minimumVersionPHP The minimum PHP version supported by MediaWiki
- * @param string $phpVersion The current PHP version
- */
-function wfPHPVersionError( $type, $mwVersion, $minimumVersionPHP, $phpVersion ) {
-       $shortText = "MediaWiki $mwVersion requires at least "
-               . "PHP version $minimumVersionPHP, you are using PHP $phpVersion.";
-
-       $longText = "Error: You might be using on older PHP version. \n"
-               . "MediaWiki $mwVersion needs PHP $minimumVersionPHP or higher.\n\n"
-               . "Check if you have a newer php executable with a different name, such as php5.\n\n";
-
-       $longHtml = <<<HTML
-                       Please consider <a href="http://www.php.net/downloads.php">upgrading your copy of PHP</a>.
-                       PHP versions less than 5.5.0 are no longer supported by the PHP Group and will not receive
-                       security or bugfix updates.
-               </p>
-               <p>
-                       If for some reason you are unable to upgrade your PHP version, you will need to
-                       <a href="https://www.mediawiki.org/wiki/Download">download</a> an older version
-                       of MediaWiki from our website.  See our
-                       <a href="https://www.mediawiki.org/wiki/Compatibility#PHP">compatibility page</a>
-                       for details of which versions are compatible with prior versions of PHP.
-HTML;
-       wfGenericError( $type, $mwVersion, 'Supported PHP versions', $shortText, $longText, $longHtml );
-}
-
-/**
- * Display an error for the vendor/autoload.php file not being found.
- *
- * @param string $type See wfGenericError
- * @param string $mwVersion See wfGenericError
- */
-function wfMissingVendorError( $type, $mwVersion ) {
-       $shortText = "Installing some external dependencies (e.g. via composer) is required.";
 
-       $longText = "Error: You are missing some external dependencies. \n"
-               . "MediaWiki now also has some external dependencies that need to be installed\n"
-               . "via composer or from a separate git repo. Please see\n"
-               . "https://www.mediawiki.org/wiki/Download_from_Git#Fetch_external_libraries\n"
-               . "for help on installing the required components.";
+               return $finalOutput;
+       }
 
-       // @codingStandardsIgnoreStart Generic.Files.LineLength
-       $longHtml = <<<HTML
-               MediaWiki now also has some external dependencies that need to be installed via
-               composer or from a separate git repo. Please see
-               <a href="https://www.mediawiki.org/wiki/Download_from_Git#Fetch_external_libraries">mediawiki.org</a>
-               for help on installing the required components.
-HTML;
-       // @codingStandardsIgnoreEnd
+       /**
+        * Display something vaguely comprehensible in the event of a totally unrecoverable error.
+        * Does not assume access to *anything*; no globals, no autoloader, no database, no localisation.
+        * Safe for PHP4 (and putting this here means that WebStart.php and GlobalSettings.php
+        * no longer need to be).
+        *
+        * Calling this function kills execution immediately.
+        *
+        * @param string $title HTML code to be put within an <h2> tag
+        * @param string $shortText
+        * @param string $longText
+        * @param string $longHtml
+        */
+       function triggerError( $title, $shortText, $longText, $longHtml ) {
+               switch ( $this->entryPoint ) {
+                       case 'cli':
+                               $finalOutput = $longText;
+                               break;
+                       case 'index.php':
+                       case 'mw-config/index.php':
+                               $this->outputHTMLHeader();
+                               $finalOutput = $this->getIndexErrorOutput( $title, $longHtml, $shortText );
+                               break;
+                       case 'load.php':
+                               $this->outputHTMLHeader();
+                               $finalOutput = "/* $shortText */";
+                               break;
+                       default:
+                               $this->outputHTMLHeader();
+                               // Handle everything that's not index.php
+                               $finalOutput = $shortText;
+               }
 
-       wfGenericError( $type, $mwVersion, 'External dependencies', $shortText, $longText, $longHtml );
+               echo "$finalOutput\n";
+               die( 1 );
+       }
 }
 
 /**
- * Display an error for a PHP extension not existing.
+ * Check php version and that external dependencies are installed, and
+ * display an informative error if either condition is not satisfied.
  *
- * @param string $type See wfGenericError
- * @param string $mwVersion See wfGenericError
- * @param array $missingExts The extensions we're missing
+ * @note Since we can't rely on anything, the minimum PHP versions and MW current
+ * version are hardcoded here
  */
-function wfMissingExtensions( $type, $mwVersion, $missingExts ) {
-       $shortText = "Installing some PHP extensions is required.";
-
-       $missingExtText = '';
-       $missingExtHtml = '';
-       $baseUrl = 'https://secure.php.net';
-       foreach ( $missingExts as $ext ) {
-               $missingExtText .= " * $ext <$baseUrl/$ext>\n";
-               $missingExtHtml .= "<li><b>$ext</b> "
-                       . "(<a href=\"$baseUrl/$ext\">more information</a>)</li>";
-       }
-
-       $cliText = "Error: Missing one or more required components of PHP.\n"
-               . "You are missing a required extension to PHP that MediaWiki needs.\n"
-               . "Please install:\n" . $missingExtText;
-
-       $longHtml = <<<HTML
-               You are missing a required extension to PHP that MediaWiki
-               requires to run. Please install:
-               <ul>
-               $missingExtHtml
-               </ul>
-HTML;
-
-       wfGenericError( $type, $mwVersion, 'Required components', $shortText,
-               $cliText, $longHtml );
+function wfEntryPointCheck( $entryPoint ) {
+       $phpVersionCheck = new PHPVersionCheck();
+       $phpVersionCheck->setEntryPoint( $entryPoint );
+       $phpVersionCheck->checkRequiredPHPVersion();
+       $phpVersionCheck->checkVendorExistence();
+       $phpVersionCheck->checkExtensionExistence();
 }
index 9f8c06b..d86b19a 100644 (file)
@@ -861,7 +861,6 @@ class Preferences {
                        'section' => 'editing/preview',
                        'label-message' => 'tog-uselivepreview',
                ];
-
        }
 
        /**
@@ -1614,7 +1613,6 @@ class PreferencesForm extends HTMLForm {
         * @return string
         */
        function getButtons() {
-
                $attrs = [ 'id' => 'mw-prefs-restoreprefs' ];
 
                if ( !$this->getModifiedUser()->isAllowedAny( 'editmyprivateinfo', 'editmyoptions' ) ) {
index 8f337f9..b812191 100644 (file)
@@ -87,6 +87,7 @@ class Revision implements IDBAccessObject {
        const DELETED_USER = 4;
        const DELETED_RESTRICTED = 8;
        const SUPPRESSED_USER = 12; // convenience
+       const SUPPRESSED_ALL = 15; // convenience
 
        // Audience options for accessors
        const FOR_PUBLIC = 1;
index 4069658..44e4e3e 100644 (file)
@@ -41,7 +41,7 @@ class Sanitizer {
 
        /**
         * Acceptable tag name charset from HTML5 parsing spec
-        * http://www.w3.org/TR/html5/syntax.html#tag-open-state
+        * https://www.w3.org/TR/html5/syntax.html#tag-open-state
         */
        const ELEMENT_BITS_REGEX = '!^(/?)([A-Za-z][^\t\n\v />\0]*+)([^>]*?)(/?>)([^<]*)$!';
 
@@ -58,7 +58,7 @@ class Sanitizer {
 
        /**
         * List of all named character entities defined in HTML 4.01
-        * http://www.w3.org/TR/html4/sgml/entities.html
+        * https://www.w3.org/TR/html4/sgml/entities.html
         * As well as &apos; which is only defined starting in XHTML1.
         */
        private static $htmlEntities = [
@@ -333,7 +333,7 @@ class Sanitizer {
        /**
         * Regular expression to match HTML/XML attribute pairs within a tag.
         * Allows some... latitude. Based on,
-        * http://www.w3.org/TR/html5/syntax.html#before-attribute-value-state
+        * https://www.w3.org/TR/html5/syntax.html#before-attribute-value-state
         * Used in Sanitizer::fixTagAttributes and Sanitizer::decodeTagAttributes
         * @return string
         */
@@ -1149,11 +1149,11 @@ class Sanitizer {
         * ambiguous if it's part of something that looks like a percent escape
         * (which don't work reliably in fragments cross-browser).
         *
-        * @see http://www.w3.org/TR/html401/types.html#type-name Valid characters
+        * @see https://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
+        * @see https://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
+        * @see https://www.w3.org/TR/html5/dom.html#the-id-attribute
         *   HTML5 definition of id attribute
         *
         * @param string $id Id to escape
@@ -1239,7 +1239,7 @@ class Sanitizer {
         *
         * @todo For extra validity, input should be validated UTF-8.
         *
-        * @see http://www.w3.org/TR/CSS21/syndata.html Valid characters/format
+        * @see https://www.w3.org/TR/CSS21/syndata.html Valid characters/format
         *
         * @param string $class
         * @return string
@@ -1352,7 +1352,7 @@ class Sanitizer {
                } elseif ( !isset( $set[2] ) ) {
                        # In XHTML, attributes must have a value so return an empty string.
                        # See "Empty attribute syntax",
-                       # http://www.w3.org/TR/html5/syntax.html#syntax-attribute-name
+                       # https://www.w3.org/TR/html5/syntax.html#syntax-attribute-name
                        return "";
                } else {
                        throw new MWException( "Tag conditions not met. This should never happen and is a bug." );
@@ -1622,7 +1622,7 @@ class Sanitizer {
 
                        # RDFa
                        # These attributes are specified in section 9 of
-                       # http://www.w3.org/TR/2008/REC-rdfa-syntax-20081014
+                       # https://www.w3.org/TR/2008/REC-rdfa-syntax-20081014
                        'about',
                        'property',
                        'resource',
@@ -1630,7 +1630,7 @@ class Sanitizer {
                        'typeof',
 
                        # Microdata. These are specified by
-                       # http://www.whatwg.org/html/microdata.html#the-microdata-model
+                       # https://html.spec.whatwg.org/multipage/microdata.html#the-microdata-model
                        'itemid',
                        'itemprop',
                        'itemref',
@@ -1654,7 +1654,7 @@ class Sanitizer {
                ];
 
                # Numbers refer to sections in HTML 4.01 standard describing the element.
-               # See: http://www.w3.org/TR/html4/
+               # See: https://www.w3.org/TR/html4/
                $whitelist = [
                        # 7.5.4
                        'div'        => $block,
@@ -1701,7 +1701,7 @@ class Sanitizer {
                        # 9.3.2
                        'br'         => array_merge( $common, [ 'clear' ] ),
 
-                       # http://www.whatwg.org/html/text-level-semantics.html#the-wbr-element
+                       # https://www.w3.org/TR/html5/text-level-semantics.html#the-wbr-element
                        'wbr'        => $common,
 
                        # 9.3.4
@@ -1776,7 +1776,7 @@ class Sanitizer {
                        'hr'         => array_merge( $common, [ 'width' ] ),
 
                        # HTML Ruby annotation text module, simple ruby only.
-                       # http://www.whatwg.org/html/text-level-semantics.html#the-ruby-element
+                       # https://www.w3.org/TR/html5/text-level-semantics.html#the-ruby-element
                        'ruby'       => $common,
                        # rbc
                        'rb'         => $common,
@@ -1786,14 +1786,14 @@ class Sanitizer {
 
                        # MathML root element, where used for extensions
                        # 'title' may not be 100% valid here; it's XHTML
-                       # http://www.w3.org/TR/REC-MathML/
+                       # https://www.w3.org/TR/REC-MathML/
                        'math'       => [ 'class', 'style', 'id', 'title' ],
 
                        # HTML 5 section 4.6
                        'bdi' => $common,
 
                        # HTML5 elements, defined by:
-                       # http://www.whatwg.org/html/
+                       # https://html.spec.whatwg.org/multipage/semantics.html#the-data-element
                        'data' => array_merge( $common, [ 'value' ] ),
                        'time' => array_merge( $common, [ 'datetime' ] ),
                        'mark' => $common,
index a071ff7..c2197a6 100644 (file)
@@ -230,6 +230,11 @@ return [
                );
        },
 
+       'Parser' => function( MediaWikiServices $services ) {
+               $conf = $services->getMainConfig()->get( 'ParserConf' );
+               return ObjectFactory::constructClassInstance( $conf['class'], [ $conf ] );
+       },
+
        'LinkCache' => function( MediaWikiServices $services ) {
                return new LinkCache(
                        $services->getTitleFormatter(),
index 7cda14c..357c76d 100644 (file)
@@ -818,7 +818,9 @@ $wgOut = RequestContext::getMain()->getOutput(); // BackCompat
 /**
  * @var Parser $wgParser
  */
-$wgParser = new StubObject( 'wgParser', $wgParserConf['class'], [ $wgParserConf ] );
+$wgParser = new StubObject( 'wgParser', function () {
+       return MediaWikiServices::getInstance()->getParser();
+} );
 
 /**
  * @var Title $wgTitle
index 213572b..3c51bae 100644 (file)
@@ -1412,7 +1412,6 @@ class Title implements LinkTarget {
                        $fragment,
                        $this->getInterwiki()
                );
-
        }
 
        /**
@@ -2926,7 +2925,6 @@ class Title implements LinkTarget {
 
                        # Cycle through all the restrictions.
                        foreach ( $rows as $row ) {
-
                                // Don't take care of restrictions types that aren't allowed
                                if ( !in_array( $row->pr_type, $restrictionTypes ) ) {
                                        continue;
@@ -4600,7 +4598,6 @@ class Title implements LinkTarget {
                        : $wgExemptFromUserRobotsControl;
 
                return !in_array( $this->mNamespace, $bannedNamespaces );
-
        }
 
        /**
index 8497224..0c3d52a 100644 (file)
@@ -50,10 +50,24 @@ class WatchedItemQueryService {
         */
        private $loadBalancer;
 
+       /** @var WatchedItemQueryServiceExtension[]|null */
+       private $extensions = null;
+
        public function __construct( LoadBalancer $loadBalancer ) {
                $this->loadBalancer = $loadBalancer;
        }
 
+       /**
+        * @return WatchedItemQueryServiceExtension[]
+        */
+       private function getExtensions() {
+               if ( $this->extensions === null ) {
+                       $this->extensions = [];
+                       Hooks::run( 'WatchedItemQueryServiceExtensions', [ &$this->extensions, $this ] );
+               }
+               return $this->extensions;
+       }
+
        /**
         * @return IDatabase
         * @throws MWException
@@ -84,9 +98,6 @@ class WatchedItemQueryService {
         *                                 timestamp to start enumerating from
         *        'end'                 => string (format accepted by wfTimestamp) requires 'dir' option,
         *                                 timestamp to end enumerating
-        *        'startFrom'           => [ string $rcTimestamp, int $rcId ] requires 'dir' option,
-        *                                 return items starting from the RecentChange specified by this,
-        *                                 $rcTimestamp should be in the format accepted by wfTimestamp
         *        'watchlistOwner'      => User user whose watchlist items should be listed if different
         *                                 than the one specified with $user param,
         *                                 requires 'watchlistOwnerToken' option
@@ -97,6 +108,7 @@ class WatchedItemQueryService {
         *                                 generator ('rc_cur_id' or 'rc_this_oldid') if true, or all
         *                                 id fields ('rc_cur_id', 'rc_this_oldid', 'rc_last_oldid')
         *                                 if false (default)
+        * @param array|null &$startFrom Continuation value: [ string $rcTimestamp, int $rcId ]
         * @return array of pairs ( WatchedItem $watchedItem, string[] $recentChangeInfo ),
         *         where $recentChangeInfo contains the following keys:
         *         - 'rc_id',
@@ -107,7 +119,9 @@ class WatchedItemQueryService {
         *         - 'rc_deleted',
         *         Additional keys could be added by specifying the 'includeFields' option
         */
-       public function getWatchedItemsWithRecentChangeInfo( User $user, array $options = [] ) {
+       public function getWatchedItemsWithRecentChangeInfo(
+               User $user, array $options = [], &$startFrom = null
+       ) {
                $options += [
                        'includeFields' => [],
                        'namespaceIds' => [],
@@ -128,15 +142,19 @@ class WatchedItemQueryService {
                        'must be DIR_OLDER or DIR_NEWER'
                );
                Assert::parameter(
-                       !isset( $options['start'] ) && !isset( $options['end'] ) && !isset( $options['startFrom'] )
+                       !isset( $options['start'] ) && !isset( $options['end'] ) && $startFrom === null
                                || isset( $options['dir'] ),
                        '$options[\'dir\']',
-                       'must be provided when providing any of options: start, end, startFrom'
+                       'must be provided when providing the "start" or "end" options or the $startFrom parameter'
                );
                Assert::parameter(
-                       !isset( $options['startFrom'] )
-                               || ( is_array( $options['startFrom'] ) && count( $options['startFrom'] ) === 2 ),
+                       !isset( $options['startFrom'] ),
                        '$options[\'startFrom\']',
+                       'must not be provided, use $startFrom instead'
+               );
+               Assert::parameter(
+                       !isset( $startFrom ) || ( is_array( $startFrom ) && count( $startFrom ) === 2 ),
+                       '$startFrom',
                        'must be a two-element array'
                );
                if ( array_key_exists( 'watchlistOwner', $options ) ) {
@@ -164,6 +182,21 @@ class WatchedItemQueryService {
                $dbOptions = $this->getWatchedItemsWithRCInfoQueryDbOptions( $options );
                $joinConds = $this->getWatchedItemsWithRCInfoQueryJoinConds( $options );
 
+               if ( $startFrom !== null ) {
+                       $conds[] = $this->getStartFromConds( $db, $options, $startFrom );
+               }
+
+               foreach ( $this->getExtensions() as $extension ) {
+                       $extension->modifyWatchedItemsWithRCInfoQuery(
+                               $user, $options, $db,
+                               $tables,
+                               $fields,
+                               $conds,
+                               $dbOptions,
+                               $joinConds
+                       );
+               }
+
                $res = $db->select(
                        $tables,
                        $fields,
@@ -173,8 +206,15 @@ class WatchedItemQueryService {
                        $joinConds
                );
 
+               $limit = isset( $dbOptions['LIMIT'] ) ? $dbOptions['LIMIT'] : INF;
                $items = [];
+               $startFrom = null;
                foreach ( $res as $row ) {
+                       if ( --$limit <= 0 ) {
+                               $startFrom = [ $row->rc_timestamp, $row->rc_id ];
+                               break;
+                       }
+
                        $items[] = [
                                new WatchedItem(
                                        $user,
@@ -185,6 +225,10 @@ class WatchedItemQueryService {
                        ];
                }
 
+               foreach ( $this->getExtensions() as $extension ) {
+                       $extension->modifyWatchedItemsWithRCInfo( $user, $options, $db, $items, $res, $startFrom );
+               }
+
                return $items;
        }
 
@@ -368,10 +412,6 @@ class WatchedItemQueryService {
                        $conds[] = $deletedPageLogCond;
                }
 
-               if ( array_key_exists( 'startFrom', $options ) ) {
-                       $conds[] = $this->getStartFromConds( $db, $options );
-               }
-
                return $conds;
        }
 
@@ -442,11 +482,13 @@ class WatchedItemQueryService {
 
                if ( isset( $options['start'] ) ) {
                        $after = $options['dir'] === self::DIR_OLDER ? '<=' : '>=';
-                       $conds[] = 'rc_timestamp ' . $after . ' ' . $db->addQuotes( $options['start'] );
+                       $conds[] = 'rc_timestamp ' . $after . ' ' .
+                               $db->addQuotes( $db->timestamp( $options['start'] ) );
                }
                if ( isset( $options['end'] ) ) {
                        $before = $options['dir'] === self::DIR_OLDER ? '>=' : '<=';
-                       $conds[] = 'rc_timestamp ' . $before . ' ' . $db->addQuotes( $options['end'] );
+                       $conds[] = 'rc_timestamp ' . $before . ' ' .
+                               $db->addQuotes( $db->timestamp( $options['end'] ) );
                }
 
                return $conds;
@@ -497,9 +539,9 @@ class WatchedItemQueryService {
                return '';
        }
 
-       private function getStartFromConds( IDatabase $db, array $options ) {
+       private function getStartFromConds( IDatabase $db, array $options, array $startFrom ) {
                $op = $options['dir'] === self::DIR_OLDER ? '<' : '>';
-               list( $rcTimestamp, $rcId ) = $options['startFrom'];
+               list( $rcTimestamp, $rcId ) = $startFrom;
                $rcTimestamp = $db->addQuotes( $db->timestamp( $rcTimestamp ) );
                $rcId = (int)$rcId;
                return $db->makeList(
@@ -581,7 +623,7 @@ class WatchedItemQueryService {
                }
 
                if ( array_key_exists( 'limit', $options ) ) {
-                       $dbOptions['LIMIT'] = (int)$options['limit'];
+                       $dbOptions['LIMIT'] = (int)$options['limit'] + 1;
                }
 
                return $dbOptions;
diff --git a/includes/WatchedItemQueryServiceExtension.php b/includes/WatchedItemQueryServiceExtension.php
new file mode 100644 (file)
index 0000000..8fcf131
--- /dev/null
@@ -0,0 +1,54 @@
+<?php
+
+/**
+ * Extension mechanism for WatchedItemQueryService
+ *
+ * @since 1.29
+ *
+ * @file
+ * @ingroup Watchlist
+ *
+ * @license GNU GPL v2+
+ */
+interface WatchedItemQueryServiceExtension {
+
+       /**
+        * Modify the WatchedItemQueryService::getWatchedItemsWithRecentChangeInfo()
+        * query before it's made.
+        *
+        * @warning Any joins added *must* join on a unique key of the target table
+        *  unless you really know what you're doing.
+        * @param User $user
+        * @param array $options Options from
+        *  WatchedItemQueryService::getWatchedItemsWithRecentChangeInfo()
+        * @param IDatabase $db Database connection being used for the query
+        * @param array &$tables Tables for Database::select()
+        * @param array &$fields Fields for Database::select()
+        * @param array &$conds Conditions for Database::select()
+        * @param array &$dbOptions Options for Database::select()
+        * @param array &$joinConds Join conditions for Database::select()
+        */
+       public function modifyWatchedItemsWithRCInfoQuery( User $user, array $options, IDatabase $db,
+               array &$tables, array &$fields, array &$conds, array &$dbOptions, array &$joinConds
+       );
+
+       /**
+        * Modify the results from WatchedItemQueryService::getWatchedItemsWithRecentChangeInfo()
+        * before they're returned.
+        *
+        * @param User $user
+        * @param array $options Options from
+        *  WatchedItemQueryService::getWatchedItemsWithRecentChangeInfo()
+        * @param IDatabase $db Database connection being used for the query
+        * @param array &$items array of pairs ( WatchedItem $watchedItem, string[] $recentChangeInfo ).
+        *  May be truncated if necessary, in which case $startFrom must be updated.
+        * @param ResultWrapper|bool $res Database query result
+        * @param array|null &$startFrom Continuation value. If you truncate $items, set this to
+        *  [ $recentChangeInfo['rc_timestamp'], $recentChangeInfo['rc_id'] ] from the first item
+        *  removed.
+        */
+       public function modifyWatchedItemsWithRCInfo( User $user, array $options, IDatabase $db,
+               array &$items, $res, &$startFrom
+       );
+
+}
index 6c47cae..cc4779e 100644 (file)
@@ -167,7 +167,7 @@ class WatchedItemStore implements StatsdAwareInterface {
         * @param User $user
         * @param LinkTarget $target
         *
-        * @return WatchedItem|null
+        * @return WatchedItem|false
         */
        private function getCached( User $user, LinkTarget $target ) {
                return $this->cache->get( $this->getCacheKey( $user, $target ) );
@@ -495,7 +495,7 @@ class WatchedItemStore implements StatsdAwareInterface {
 
                $watchedItems = [];
                foreach ( $res as $row ) {
-                       // todo these could all be cached at some point?
+                       // @todo: Should we add these to the process cache?
                        $watchedItems[] = new WatchedItem(
                                $user,
                                new TitleValue( (int)$row->wl_namespace, $row->wl_title ),
@@ -602,6 +602,7 @@ class WatchedItemStore implements StatsdAwareInterface {
                }
 
                $rows = [];
+               $items = [];
                foreach ( $targets as $target ) {
                        $rows[] = [
                                'wl_user' => $user->getId(),
@@ -609,6 +610,11 @@ class WatchedItemStore implements StatsdAwareInterface {
                                'wl_title' => $target->getDBkey(),
                                'wl_notificationtimestamp' => null,
                        ];
+                       $items[] = new WatchedItem(
+                               $user,
+                               $target,
+                               null
+                       );
                        $this->uncache( $user, $target );
                }
 
@@ -618,6 +624,12 @@ class WatchedItemStore implements StatsdAwareInterface {
                        // if there's already an entry for this page
                        $dbw->insert( 'watchlist', $toInsert, __METHOD__, 'IGNORE' );
                }
+               // Update process cache to ensure skin doesn't claim that the current
+               // page is unwatched in the response of action=watch itself (T28292).
+               // This would otherwise be re-queried from a slave by isWatched().
+               foreach ( $items as $item ) {
+                       $this->cache( $item );
+               }
 
                return true;
        }
index 0065135..3ef3bc1 100644 (file)
@@ -113,7 +113,7 @@ class WebRequest {
         */
        public static function getPathInfo( $want = 'all' ) {
                global $wgUsePathInfo;
-               // PATH_INFO is mangled due to http://bugs.php.net/bug.php?id=31892
+               // PATH_INFO is mangled due to https://bugs.php.net/bug.php?id=31892
                // And also by Apache 2.x, double slashes are converted to single slashes.
                // So we will use REQUEST_URI if possible.
                $matches = [];
@@ -175,7 +175,7 @@ class WebRequest {
                } elseif ( $wgUsePathInfo ) {
                        if ( isset( $_SERVER['ORIG_PATH_INFO'] ) && $_SERVER['ORIG_PATH_INFO'] != '' ) {
                                // Mangled PATH_INFO
-                               // http://bugs.php.net/bug.php?id=31892
+                               // https://bugs.php.net/bug.php?id=31892
                                // Also reported when ini_get('cgi.fix_pathinfo')==false
                                $matches['title'] = substr( $_SERVER['ORIG_PATH_INFO'], 1 );
 
@@ -379,7 +379,7 @@ class WebRequest {
         */
        private function getGPCVal( $arr, $name, $default ) {
                # PHP is so nice to not touch input data, except sometimes:
-               # http://us2.php.net/variables.external#language.variables.external.dot-in-names
+               # https://secure.php.net/variables.external#language.variables.external.dot-in-names
                # Work around PHP *feature* to avoid *bugs* elsewhere.
                $name = strtr( $name, '.', '_' );
                if ( isset( $arr[$name] ) ) {
index c741907..916a10c 100644 (file)
@@ -102,7 +102,7 @@ class WebRequestUpload {
 
        /**
         * Return the upload error. See link for explanation
-        * http://www.php.net/manual/en/features.file-upload.errors.php
+        * https://secure.php.net/manual/en/features.file-upload.errors.php
         *
         * @return int One of the UPLOAD_ constants, 0 if non-existent
         */
index b1bd098..4c6b071 100644 (file)
@@ -238,7 +238,6 @@ class Xml {
                        Xml::label( $msg->text(), $attrs['id'] ),
                        Xml::tags( 'select', $attrs, $options )
                ];
-
        }
 
        /**
index 1e1bb39..c1763fa 100644 (file)
@@ -218,7 +218,6 @@ class HistoryAction extends FormlessAction {
                        $pager->getNavigationBar()
                );
                $out->preventClickjacking( $pager->getPreventClickjacking() );
-
        }
 
        /**
index 85ea87c..8df6044 100644 (file)
@@ -1,7 +1,5 @@
 <?php
 /**
- * Mark a revision as patrolled on a page
- *
  * Copyright © 2011 Alexandre Emsenhuber
  *
  * This program is free software; you can redistribute it and/or modify
  *
  * @ingroup Actions
  */
-class MarkpatrolledAction extends FormlessAction {
+class MarkpatrolledAction extends FormAction {
 
        public function getName() {
                return 'markpatrolled';
        }
 
        protected function getDescription() {
+               // Disable default header "subtitle"
                return '';
        }
 
-       public function onView() {
-               $request = $this->getRequest();
+       public function getRestriction() {
+               return 'patrol';
+       }
 
-               $rcId = $request->getInt( 'rcid' );
-               $rc = RecentChange::newFromId( $rcId );
-               if ( is_null( $rc ) ) {
+       protected function getRecentChange( $data = null ) {
+               $rc = null;
+               // Note: This works both on initial GET url and after submitting the form
+               $rcId = $data ? intval( $data['rcid'] ) : $this->getRequest()->getInt( 'rcid' );
+               if ( $rcId ) {
+                       $rc = RecentChange::newFromId( $rcId );
+               }
+               if ( !$rc ) {
                        throw new ErrorPageError( 'markedaspatrollederror', 'markedaspatrollederrortext' );
                }
+               return $rc;
+       }
 
-               $user = $this->getUser();
-               if ( !$user->matchEditToken( $request->getVal( 'token' ), $rcId ) ) {
-                       throw new ErrorPageError( 'sessionfailure-title', 'sessionfailure' );
-               }
+       protected function preText() {
+               $rc = $this->getRecentChange();
+               $title = $rc->getTitle();
+
+               // Based on logentry-patrol-patrol (see PatrolLogFormatter)
+               $revId = $rc->getAttribute( 'rc_this_oldid' );
+               $query = [
+                       'curid' => $rc->getAttribute( 'rc_cur_id' ),
+                       'diff' => $revId,
+                       'oldid' => $rc->getAttribute( 'rc_last_oldid' )
+               ];
+               $revlink = Linker::link( $title, htmlspecialchars( $revId ), [], $query );
+               $pagelink = Linker::link( $title, htmlspecialchars( $title->getPrefixedText() ) );
 
+               return $this->msg( 'confirm-markpatrolled-top' )->params(
+                       $title->getPrefixedText(),
+                       // Provide pre-rendered link as parser would render [[:$1]] as bold non-link
+                       Message::rawParam( $pagelink ),
+                       Message::rawParam( $revlink )
+               )->parse();
+       }
+
+       protected function alterForm( HTMLForm $form ) {
+               $form->addHiddenField( 'rcid', $this->getRequest()->getInt( 'rcid' ) );
+               $form->setTokenSalt( 'patrol' );
+               $form->setSubmitTextMsg( 'confirm-markpatrolled-button' );
+       }
+
+       /**
+        * @return bool|array True for success, false for didn't-try, array of errors on failure
+        */
+       public function onSubmit( $data ) {
+               $user = $this->getUser();
+               $rc = $this->getRecentChange( $data );
                $errors = $rc->doMarkPatrolled( $user );
 
                if ( in_array( [ 'rcpatroldisabled' ], $errors ) ) {
                        throw new ErrorPageError( 'rcpatroldisabled', 'rcpatroldisabledtext' );
                }
 
-               if ( in_array( [ 'hookaborted' ], $errors ) ) {
-                       // The hook itself has handled any output
-                       return;
-               }
-
-               # It would be nice to see where the user had actually come from, but for now just guess
+               // Guess where the user came from
+               // TODO: Would be nice to see where the user actually came from
                if ( $rc->getAttribute( 'rc_type' ) == RC_NEW ) {
                        $returnTo = 'Newpages';
                } elseif ( $rc->getAttribute( 'rc_log_type' ) == 'upload' ) {
@@ -76,18 +108,25 @@ class MarkpatrolledAction extends FormlessAction {
                        $this->getOutput()->setPageTitle( $this->msg( 'markedaspatrollederror' ) );
                        $this->getOutput()->addWikiMsg( 'markedaspatrollederror-noautopatrol' );
                        $this->getOutput()->returnToMain( null, $return );
-
-                       return;
+                       return true;
                }
 
-               if ( count( $errors ) ) {
-                       throw new PermissionsError( 'patrol', $errors );
+               if ( $errors ) {
+                       if ( !in_array( [ 'hookaborted' ], $errors ) ) {
+                               throw new PermissionsError( 'patrol', $errors );
+                       }
+                       // The hook itself has handled any output
+                       return $errors;
                }
 
-               # Inform the user
                $this->getOutput()->setPageTitle( $this->msg( 'markedaspatrolled' ) );
                $this->getOutput()->addWikiMsg( 'markedaspatrolledtext', $rc->getTitle()->getPrefixedText() );
                $this->getOutput()->returnToMain( null, $return );
+               return true;
+       }
+
+       public function onSuccess() {
+               // Required by parent class. Redundant as our onSubmit handles output already.
        }
 
        public function doesWrites() {
index 1a42ccc..6fafebf 100644 (file)
@@ -173,13 +173,7 @@ class ApiAuthManagerHelper {
                $this->module->getMain()->markParamsUsed( array_keys( $data ) );
 
                if ( $sensitive ) {
-                       try {
-                               $this->module->requirePostedParameters( array_keys( $sensitive ), 'noprefix' );
-                       } catch ( UsageException $ex ) {
-                               // Make this a warning for now, upgrade to an error in 1.29.
-                               $this->module->setWarning( $ex->getMessage() );
-                               $this->module->logFeatureUsage( $this->module->getModuleName() . '-params-in-query-string' );
-                       }
+                       $this->module->requirePostedParameters( array_keys( $sensitive ), 'noprefix' );
                }
 
                return AuthenticationRequest::loadRequestsFromSubmission( $reqs, $data );
index c8f4460..ce2f930 100644 (file)
@@ -636,8 +636,8 @@ class ApiMain extends ApiBase {
         * If the parameter and the header do match, the header is checked against $wgCrossSiteAJAXdomains
         * and $wgCrossSiteAJAXdomainExceptions, and if the origin qualifies, the appropriate CORS
         * headers are set.
-        * http://www.w3.org/TR/cors/#resource-requests
-        * http://www.w3.org/TR/cors/#resource-preflight-requests
+        * https://www.w3.org/TR/cors/#resource-requests
+        * https://www.w3.org/TR/cors/#resource-preflight-requests
         *
         * @return bool False if the caller should abort (403 case), true otherwise (all other cases)
         */
@@ -719,7 +719,7 @@ class ApiMain extends ApiBase {
 
                        $response->header( "Access-Control-Allow-Origin: $allowOrigin" );
                        $response->header( "Access-Control-Allow-Credentials: $allowCredentials" );
-                       // http://www.w3.org/TR/resource-timing/#timing-allow-origin
+                       // https://www.w3.org/TR/resource-timing/#timing-allow-origin
                        if ( $allowTiming !== false ) {
                                $response->header( "Timing-Allow-Origin: $allowTiming" );
                        }
@@ -1475,7 +1475,7 @@ class ApiMain extends ApiBase {
                        'ip' => $request->getIP(),
                        'userAgent' => $this->getUserAgent(),
                        'wiki' => wfWikiID(),
-                       'timeSpentBackend' => (int) round( $time * 1000 ),
+                       'timeSpentBackend' => (int)round( $time * 1000 ),
                        'hadError' => $e !== null,
                        'errorCodes' => [],
                        'params' => [],
index 9be5849..0c70a8a 100644 (file)
@@ -92,10 +92,10 @@ class ApiQueryMyStashedFiles extends ApiQueryBase {
                        ];
 
                        if ( isset( $prop['size'] ) ) {
-                               $item['size'] = (int) $row->us_size;
-                               $item['width'] = (int) $row->us_image_width;
-                               $item['height'] = (int) $row->us_image_height;
-                               $item['bits'] = (int) $row->us_image_bits;
+                               $item['size'] = (int)$row->us_size;
+                               $item['width'] = (int)$row->us_image_width;
+                               $item['height'] = (int)$row->us_image_height;
+                               $item['bits'] = (int)$row->us_image_bits;
                        }
 
                        if ( isset( $prop['type'] ) ) {
index 99f722d..0bb7ff8 100644 (file)
@@ -576,7 +576,6 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                ApiResult::setIndexedTagName( $data, 'library' );
 
                return $this->getResult()->addValue( 'query', $property, $data );
-
        }
 
        protected function appendExtensions( $property ) {
index 7a14aac..43eb7e8 100644 (file)
@@ -93,7 +93,7 @@ class ApiQueryTags extends ApiQueryBase {
                        $tag['name'] = $tagName;
 
                        if ( $fld_displayname ) {
-                               $tag['displayname'] = ChangeTags::tagDescription( $tagName );
+                               $tag['displayname'] = ChangeTags::tagDescription( $tagName, $this );
                        }
 
                        if ( $fld_description ) {
index c30f0cf..42ea55d 100644 (file)
@@ -106,13 +106,14 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
                        $options['end'] = $params['end'];
                }
 
+               $startFrom = null;
                if ( !is_null( $params['continue'] ) ) {
                        $cont = explode( '|', $params['continue'] );
                        $this->dieContinueUsageIf( count( $cont ) != 2 );
                        $continueTimestamp = $cont[0];
                        $continueId = (int)$cont[1];
                        $this->dieContinueUsageIf( $continueId != $cont[1] );
-                       $options['startFrom'] = [ $continueTimestamp, $continueId ];
+                       $startFrom = [ $continueTimestamp, $continueId ];
                }
 
                if ( $wlowner !== $user ) {
@@ -169,33 +170,24 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
                        $options['notByUser'] = $params['excludeuser'];
                }
 
-               $options['limit'] = $params['limit'] + 1;
+               $options['limit'] = $params['limit'];
+
+               Hooks::run( 'ApiQueryWatchlistPrepareWatchedItemQueryServiceOptions', [
+                       $this, $params, &$options
+               ] );
 
                $ids = [];
                $count = 0;
                $watchedItemQuery = MediaWikiServices::getInstance()->getWatchedItemQueryService();
-               $items = $watchedItemQuery->getWatchedItemsWithRecentChangeInfo( $wlowner, $options );
+               $items = $watchedItemQuery->getWatchedItemsWithRecentChangeInfo( $wlowner, $options, $startFrom );
 
                foreach ( $items as list ( $watchedItem, $recentChangeInfo ) ) {
                        /** @var WatchedItem $watchedItem */
-                       if ( ++$count > $params['limit'] ) {
-                               // We've reached the one extra which shows that there are
-                               // additional pages to be had. Stop here...
-                               $this->setContinueEnumParameter(
-                                       'continue',
-                                       $recentChangeInfo['rc_timestamp'] . '|' . $recentChangeInfo['rc_id']
-                               );
-                               break;
-                       }
-
                        if ( is_null( $resultPageSet ) ) {
                                $vals = $this->extractOutputData( $watchedItem, $recentChangeInfo );
                                $fit = $this->getResult()->addValue( [ 'query', $this->getModuleName() ], null, $vals );
                                if ( !$fit ) {
-                                       $this->setContinueEnumParameter(
-                                               'continue',
-                                               $recentChangeInfo['rc_timestamp'] . '|' . $recentChangeInfo['rc_id']
-                                       );
+                                       $startFrom = [ $recentChangeInfo['rc_timestamp'], $recentChangeInfo['rc_id'] ];
                                        break;
                                }
                        } else {
@@ -207,6 +199,10 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
                        }
                }
 
+               if ( $startFrom !== null ) {
+                       $this->setContinueEnumParameter( 'continue', implode( '|', $startFrom ) );
+               }
+
                if ( is_null( $resultPageSet ) ) {
                        $this->getResult()->addIndexedTagName(
                                [ 'query', $this->getModuleName() ],
@@ -396,6 +392,10 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
                        $vals['suppressed'] = true;
                }
 
+               Hooks::run( 'ApiQueryWatchlistExtractOutputData', [
+                       $this, $watchedItem, $recentChangeInfo, &$vals
+               ] );
+
                return $vals;
        }
 
index 712217b..4fac37d 100644 (file)
@@ -75,7 +75,7 @@ class ApiRsd extends ApiBase {
         * compatible APIs, by hooking 'ApiRsdServiceApis' and adding more
         * elements to the array.
         *
-        * See http://cyber.law.harvard.edu/blogs/gems/tech/rsd.html for
+        * See https://cyber.harvard.edu/blogs/gems/tech/rsd.html for
         * the base RSD spec, and check WordPress and StatusNet sites for
         * in-production examples listing several blogging and micrblogging
         * APIs.
index 23847dc..7442fd7 100644 (file)
@@ -23,7 +23,8 @@
                        "2axterix2",
                        "Dgstranz",
                        "Copper12",
-                       "Irus"
+                       "Irus",
+                       "Hamilton Abreu"
                ]
        },
        "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Documentación]]\n* [[mw:API:FAQ|Preguntas frecuentes]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Lista de correo]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Anuncios de la API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Errores y peticiones]\n</div>\n<strong>Estado:</strong> Todas las características que se muestran en esta página deberían funcionar, pero la API aún se encuentra en desarrollo activo y puede cambiar en cualquier momento. Suscríbete a [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ la lista de correo de mediawiki-api-announce] para estar al día de las actualizaciones.\n\n<strong>Solicitudes erróneas:</strong> Cuando se envían solicitudes erróneas a la API, se envía una cabecera HTTP con la clave \"MediaWiki-API-Error\". El valor de la cabecera y el código de error devuelto tomarán el mismo valor. Para más información, véase [[mw:API:Errors_and_warnings|API: Errores y advertencias]].\n\n<strong>Pruebas:</strong> para facilitar las pruebas de solicitudes a la API, consulta [[Special:ApiSandbox]].",
        "apihelp-options-param-resetkinds": "Lista de tipos de opciones a restablecer cuando la opción <var>$1reset</var> esté establecida.",
        "apihelp-options-param-change": "Lista de cambios con el formato name=value (por ejemplo: skin=vector). El valor no puede contener caracteres de barras verticales. Si no se da ningún valor (ni siquiera un signo de igual), por ejemplo: optionname|otheroption|..., la opción se restablecerá a sus valores predeterminados.",
        "apihelp-options-param-optionname": "El nombre de la opción que debe establecerse en el valor dado por <var>$1optionvalue</var>.",
-       "apihelp-options-param-optionvalue": "El valor de la opción especificada por <var>$1optionname</var>, puede contener barras verticales.",
+       "apihelp-options-param-optionvalue": "El valor de la opción especificada por <var>$1optionname</var>.",
        "apihelp-options-example-reset": "Restablecer todas las preferencias",
        "apihelp-options-example-change": "Cambiar las preferencias <kbd>skin</kbd> y <kbd>hideminor</kbd>.",
        "apihelp-options-example-complex": "Restablecer todas las preferencias y establecer <kbd>skin</kbd> y <kbd>nickname</kbd>.",
        "apihelp-query+alldeletedrevisions-param-user": "Listar solo las revisiones de este usuario.",
        "apihelp-query+alldeletedrevisions-param-excludeuser": "No listar las revisiones de este usuario.",
        "apihelp-query+alldeletedrevisions-param-namespace": "Listar solo las páginas en este espacio de nombres.",
+       "apihelp-query+alldeletedrevisions-param-generatetitles": "Cuando se utiliza como generador, generar títulos en lugar de identificadores de revisión.",
        "apihelp-query+alldeletedrevisions-example-user": "Listar las últimas 50 contribuciones borradas del usuario <kbd>Example</kbd>.",
        "apihelp-query+alldeletedrevisions-example-ns-main": "Listar las primeras 50 revisiones borradas en el espacio de nombres principal.",
        "apihelp-query+allfileusages-description": "Listar todos los usos del archivo, incluyendo los que no existen.",
        "apihelp-query+alltransclusions-paramvalue-prop-title": "Añade el título de la transclusión.",
        "apihelp-query+alltransclusions-param-namespace": "El espacio de nombres que enumerar.",
        "apihelp-query+alltransclusions-param-limit": "Número de elementos que se desea obtener.",
+       "apihelp-query+alltransclusions-param-dir": "La dirección en que ordenar la lista.",
        "apihelp-query+alltransclusions-example-unique": "Listar títulos transcluidos de forma única.",
        "apihelp-query+alltransclusions-example-unique-generator": "Obtiene todos los títulos transcluidos, marcando los que faltan.",
        "apihelp-query+alltransclusions-example-generator": "Obtiene las páginas que contienen las transclusiones.",
        "apihelp-query+allusers-description": "Enumerar todos los usuarios registrados.",
        "apihelp-query+allusers-param-prefix": "Buscar todos los usuarios que empiecen con este valor.",
+       "apihelp-query+allusers-param-dir": "Dirección de ordenamiento.",
        "apihelp-query+allusers-param-group": "Incluir solo usuarios en los grupos dados.",
        "apihelp-query+allusers-param-excludegroup": "Excluir a los usuarios en estos grupos",
        "apihelp-query+allusers-param-rights": "Sólo se incluyen a los usuarios con los derechos cedidos. No incluye los derechos concedidos por la implícita o auto-promoverse grupos como *, usuario, o autoconfirmed.",
        "apihelp-query+allusers-param-activeusers": "Solo listar usuarios activos en {{PLURAL:$1|el último día|los $1 últimos días}}.",
        "apihelp-query+allusers-param-attachedwiki": "Con <kbd>$1prop=centralids</kbd>, indicar también si el usuario está conectado con el wiki identificado por el ID.",
        "apihelp-query+allusers-example-Y": "Listar usuarios que empiecen por <kbd>Y</kbd>.",
+       "apihelp-query+authmanagerinfo-description": "Recuperar información sobre el estado de autenticación actual.",
        "apihelp-query+authmanagerinfo-example-login": "Captura de las solicitudes que puede ser utilizadas al comienzo de inicio de sesión.",
        "apihelp-query+backlinks-description": "Encuentra todas las páginas que enlazan a la página dada.",
        "apihelp-query+backlinks-param-pageid": "Identificador de página que buscar. No puede usarse junto con <var>$1title</var>",
        "apihelp-query+backlinks-param-namespace": "El espacio de nombres que enumerar.",
+       "apihelp-query+backlinks-param-dir": "La dirección en que ordenar la lista.",
        "apihelp-query+backlinks-param-filterredir": "Cómo filtrar redirecciones. Si se establece a <kbd>nonredirects</kbd> cuando está activo <var>$1redirect</var>, esto sólo se aplica al segundo nivel.",
        "apihelp-query+backlinks-param-limit": "Cuántas páginas en total se devolverán. Si está activo <var>$1redirect</var>, el límite aplica a cada nivel por separado (lo que significa que se pueden devolver hasta 2 * <var>$1limit</var> resultados).",
        "apihelp-query+backlinks-example-simple": "Mostrar enlaces a <kbd>Main page</kbd>.",
        "apihelp-query+categories-paramvalue-prop-timestamp": "Añade la marca de tiempo del momento en que se añadió la categoría.",
        "apihelp-query+categories-param-show": "Qué tipo de categorías mostrar.",
        "apihelp-query+categories-param-limit": "Cuántas categorías se devolverán.",
+       "apihelp-query+categories-param-dir": "La dirección en que ordenar la lista.",
+       "apihelp-query+categories-example-simple": "Obtener una lista de categorías a las que pertenece la página <kbd>Albert Einstein</kbd>.",
        "apihelp-query+categories-example-generator": "Obtener información acerca de todas las categorías utilizadas en la página <kbd>Albert Einstein</kbd>.",
        "apihelp-query+categoryinfo-description": "Devuelve información acerca de las categorías dadas.",
        "apihelp-query+categoryinfo-example-simple": "Obtener información acerca de <kbd>Category:Foo</kbd> y <kbd>Category:Bar</kbd>",
        "apihelp-query+deletedrevs-param-limit": "La cantidad máxima de revisiones que listar.",
        "apihelp-query+deletedrevs-example-mode3-talk": "Listar las primeras 50 páginas en el espacio de nombres {{ns:talk}} (modo 3).",
        "apihelp-query+disabled-description": "Se ha desactivado el módulo de consulta.",
+       "apihelp-query+duplicatefiles-param-dir": "La dirección en que ordenar la lista.",
+       "apihelp-query+duplicatefiles-param-localonly": "Buscar solo archivos en el repositorio local.",
        "apihelp-query+duplicatefiles-example-simple": "Buscar duplicados de [[:File:Alber Einstein Head.jpg]].",
        "apihelp-query+duplicatefiles-example-generated": "Buscar duplicados en todos los archivos.",
        "apihelp-query+embeddedin-description": "Encuentra todas las páginas que transcluyen el título dado.",
        "apihelp-query+embeddedin-param-title": "Título a buscar. No puede usarse en conjunto con $1pageid.",
+       "apihelp-query+embeddedin-param-dir": "La dirección en que ordenar la lista.",
        "apihelp-query+embeddedin-param-filterredir": "Cómo filtrar las redirecciones.",
        "apihelp-query+embeddedin-param-limit": "Cuántas páginas se devolverán.",
        "apihelp-query+extlinks-param-limit": "Cuántos enlaces se devolverán.",
        "apihelp-query+filearchive-param-from": "El título de imagen para comenzar la enumeración",
        "apihelp-query+filearchive-param-to": "El título de imagen para detener la enumeración.",
        "apihelp-query+filearchive-param-prefix": "Buscar todos los títulos de las imágenes que comiencen con este valor.",
+       "apihelp-query+filearchive-param-dir": "La dirección en que ordenar la lista.",
        "apihelp-query+filearchive-param-prop": "Qué información de imagen se obtendrá:",
        "apihelp-query+filearchive-paramvalue-prop-timestamp": "Añade la marca de tiempo de la versión subida.",
        "apihelp-query+filearchive-paramvalue-prop-user": "Agrega el usuario que subió la versión de la imagen.",
        "apihelp-query+imageinfo-example-dated": "Obtener información sobre las versiones de [[:File:Test.jpg]] a partir de 2008.",
        "apihelp-query+images-description": "Devuelve todos los archivos contenidos en las páginas dadas.",
        "apihelp-query+images-param-limit": "Cuántos archivos se devolverán.",
+       "apihelp-query+images-param-dir": "La dirección en que ordenar la lista.",
        "apihelp-query+images-example-simple": "Obtener una lista de los archivos usados en la [[Main Page|Portada]].",
        "apihelp-query+imageusage-param-title": "Título a buscar. No puede usarse en conjunto con $1pageid.",
        "apihelp-query+imageusage-param-pageid": "ID de página a buscar. No puede usarse con $1title.",
        "apihelp-query+imageusage-param-namespace": "El espacio de nombres que enumerar.",
+       "apihelp-query+imageusage-param-dir": "La dirección en que ordenar la lista.",
        "apihelp-query+imageusage-example-simple": "Mostrar las páginas que usan [[:File:Albert Einstein Head.jpg]].",
        "apihelp-query+imageusage-example-generator": "Obtener información sobre las páginas que empleen [[:File:Albert Einstein Head.jpg]].",
        "apihelp-query+info-description": "Obtener información básica de la página.",
        "apihelp-query+iwbacklinks-param-limit": "Cuántas páginas se devolverán.",
        "apihelp-query+iwbacklinks-param-prop": "Qué propiedades se obtendrán:",
        "apihelp-query+iwbacklinks-paramvalue-prop-iwtitle": "Añade el título del interwiki.",
+       "apihelp-query+iwbacklinks-param-dir": "La dirección en que ordenar la lista.",
        "apihelp-query+iwbacklinks-example-simple": "Obtener las páginas enlazadas a [[wikibooks:Test]]",
        "apihelp-query+iwlinks-description": "Devuelve todos los enlaces interwiki de las páginas dadas.",
        "apihelp-query+iwlinks-param-prop": "Qué propiedades adicionales obtener para cada enlace interlingüe:",
        "apihelp-query+iwlinks-paramvalue-prop-url": "Añade el URL completo.",
        "apihelp-query+iwlinks-param-limit": "Cuántos enlaces interwiki se desea devolver.",
        "apihelp-query+iwlinks-param-prefix": "Devolver únicamente enlaces interwiki con este prefijo.",
+       "apihelp-query+iwlinks-param-dir": "La dirección en que ordenar la lista.",
        "apihelp-query+langbacklinks-param-lang": "Idioma del enlace de idioma.",
        "apihelp-query+langbacklinks-param-limit": "Cuántas páginas en total se devolverán.",
        "apihelp-query+langbacklinks-param-prop": "Qué propiedades se obtendrán:",
        "apihelp-query+langbacklinks-paramvalue-prop-lllang": "Agrega el código de idioma del enlace de idioma.",
        "apihelp-query+langbacklinks-paramvalue-prop-lltitle": "Añade el título del enlace de idioma.",
+       "apihelp-query+langbacklinks-param-dir": "La dirección en que ordenar la lista.",
        "apihelp-query+langbacklinks-example-simple": "Obtener las páginas enlazadas a [[:fr:Test]]",
        "apihelp-query+langbacklinks-example-generator": "Obtener información acerca de las páginas enlazadas a [[:fr:Test]].",
        "apihelp-query+langlinks-param-url": "Obtener la URL completa o no (no se puede usar con <var>$1prop</var>).",
        "apihelp-query+langlinks-paramvalue-prop-url": "Añade el URL completo.",
        "apihelp-query+langlinks-paramvalue-prop-autonym": "Añade el nombre del idioma nativo.",
        "apihelp-query+langlinks-param-lang": "Devolver solo enlaces de idioma con este código de idioma.",
+       "apihelp-query+langlinks-param-dir": "La dirección en que ordenar la lista.",
        "apihelp-query+links-param-limit": "Cuántos enlaces se devolverán.",
+       "apihelp-query+links-param-dir": "La dirección en que ordenar la lista.",
        "apihelp-query+linkshere-param-prop": "Qué propiedades se obtendrán:",
        "apihelp-query+linkshere-paramvalue-prop-pageid": "Identificador de cada página.",
        "apihelp-query+linkshere-paramvalue-prop-title": "Título de cada página.",
        "apihelp-query+tags-paramvalue-prop-active": "Si la etiqueta aún se sigue aplicando.",
        "apihelp-query+templates-description": "Devuelve todas las páginas transcluidas en las páginas dadas.",
        "apihelp-query+templates-param-limit": "Cuántas plantillas se devolverán.",
+       "apihelp-query+templates-param-dir": "La dirección en que ordenar la lista.",
        "apihelp-query+transcludedin-description": "Encuentra todas las páginas que transcluyan las páginas dadas.",
        "apihelp-query+transcludedin-param-prop": "Qué propiedades se obtendrán:",
        "apihelp-query+transcludedin-paramvalue-prop-pageid": "Identificador de cada página.",
        "apihelp-query+userinfo-paramvalue-prop-editcount": "Añade el número de ediciones del usuario actual.",
        "apihelp-query+userinfo-paramvalue-prop-ratelimits": "Lista todos los límites de velocidad aplicados al usuario actual.",
        "apihelp-query+userinfo-paramvalue-prop-realname": "Añade el nombre real del usuario.",
+       "apihelp-query+userinfo-paramvalue-prop-email": "Añade la dirección de correo electrónico del usuario y la fecha de autenticación por correo.",
        "apihelp-query+userinfo-paramvalue-prop-registrationdate": "Añade la fecha de registro del usuario.",
        "apihelp-query+userinfo-example-simple": "Obtener información sobre el usuario actual.",
        "apihelp-query+userinfo-example-data": "Obtener información adicional sobre el usuario actual.",
index 6843c90..84dad2c 100644 (file)
@@ -62,7 +62,7 @@
        "apihelp-checktoken-description": "Vérifier la validité d'un jeton de <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>.",
        "apihelp-checktoken-param-type": "Type de jeton testé",
        "apihelp-checktoken-param-token": "Jeton à tester.",
-       "apihelp-checktoken-param-maxtokenage": "Temps maximum autorisé pour le jeton, en secondes",
+       "apihelp-checktoken-param-maxtokenage": "Temps maximum autorisé pour l'utilisation du jeton, en secondes",
        "apihelp-checktoken-example-simple": "Tester la validité d'un jeton de <kbd>csrf</kbd>.",
        "apihelp-clearhasmsg-description": "Efface le drapeau <code>hasmsg</code> pour l’utilisateur courant.",
        "apihelp-clearhasmsg-example-1": "Effacer le drapeau <code>hasmsg</code> pour l’utilisateur courant",
@@ -84,7 +84,7 @@
        "apihelp-createaccount-param-password": "Mot de passe (ignoré si <var>$1mailpassword</var> est défini).",
        "apihelp-createaccount-param-domain": "Domaine pour l’authentification externe (facultatif).",
        "apihelp-createaccount-param-token": "Jeton de création de compte obtenu à la première requête.",
-       "apihelp-createaccount-param-email": "Adresse de courriel de l’utilisateur (facultatif).",
+       "apihelp-createaccount-param-email": "Adresse courriel de l’utilisateur (facultatif).",
        "apihelp-createaccount-param-realname": "Vrai nom de l’utilisateur (facultatif).",
        "apihelp-createaccount-param-mailpassword": "S’il est fixé à une valeur quelconque, un mot de passe aléatoire sera envoyé par courriel à l’utilisateur.",
        "apihelp-createaccount-param-reason": "Motif facultatif de création du compte à mettre dans les journaux.",
        "apihelp-import-example-import": "Importer [[meta:Help:ParserFunctions]] vers l’espace de noms 100 avec tout l’historique.",
        "apihelp-linkaccount-description": "Lier un compte d’un fournisseur tiers à l’utilisateur actuel.",
        "apihelp-linkaccount-example-link": "Commencer le processus de liaison d’un compte depuis <kbd>Exemple</kbd>.",
-       "apihelp-login-description": "Se connecter et obtenir les cookies d’authentification.\n\nCette action ne devrait être utilisée qu’en lien avec [[Special:BotPasswords]] ; l’utiliser pour la connexion du compte principal est obsolète et peut échouer sans avertissement. Pour se connecter sans problème au compte principal, utiliser <kbd>[[Special:ApiHelp/clientlogin|action=clientlogin]]</kbd>.",
-       "apihelp-login-description-nobotpasswords": "Se connecter et obtenir les cookies d’authentification.\n\nCette action est obsolète et peut échouer sans prévenir. Pour se connecter sans problème, utiliser <kbd>[[Special:ApiHelp/clientlogin|action=clientlogin]]</kbd>.",
+       "apihelp-login-description": "Se connecter et obtenir les témoins d’authentification.\n\nCette action ne devrait être utilisée qu’en lien avec [[Special:BotPasswords]] ; l’utiliser pour la connexion du compte principal est désuet et peut échouer sans avertissement. Pour se connecter sans problème au compte principal, utiliser <kbd>[[Special:ApiHelp/clientlogin|action=clientlogin]]</kbd>.",
+       "apihelp-login-description-nobotpasswords": "Se connecter et obtenir les témoins d’authentification.\n\nCette action est désuète et peut échouer sans prévenir. Pour se connecter sans problème, utiliser <kbd>[[Special:ApiHelp/clientlogin|action=clientlogin]]</kbd>.",
        "apihelp-login-param-name": "Nom d’utilisateur.",
        "apihelp-login-param-password": "Mot de passe.",
        "apihelp-login-param-domain": "Domaine (facultatif).",
index 6d90fb5..902221a 100644 (file)
@@ -10,7 +10,8 @@
                        "Toliño",
                        "Umherirrender",
                        "Amire80",
-                       "Macofe"
+                       "Macofe",
+                       "Hamilton Abreu"
                ]
        },
        "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Documentación]]\n* [[mw:API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Lista de discusión]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Anuncios da API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Erros e solicitudes]\n</div>\n<strong>Estado:</strong> Tódalas funcionalidades mostradas nesta páxina deberían estar funcionanado, pero a API aínda está desenrolo, e pode ser modificada en calquera momento. Apúntese na [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ lista de discusión mediawiki-api-announce] para estar informado acerca das actualizacións.\n\n<strong>Solicitudes incorrectas:</strong> Cando se envían solicitudes incorrectas á API, envíase unha cabeceira HTTP coa chave \"MediaWiki-API-Error\" e, a seguir, tanto o valor da cabeceira como o código de erro retornado serán definidos co mesmo valor. Para máis información, consulte [[mw:API:Errors_and_warnings|API: Erros e avisos]].\n\n<strong>Test:</strong> Para facilitar as probas das peticións da API, consulte [[Special:ApiSandbox]].",
        "apihelp-query+allfileusages-param-dir": "Dirección na cal listar.",
        "apihelp-query+allfileusages-example-B": "Lista títulos de ficheiro, incluíndo os   eliminados, cos IDs de páxina dos que proveñen, comezando en <kbd>B</kbd>.",
        "apihelp-query+allfileusages-example-unique": "Listar títulos únicos de ficheiros.",
-       "apihelp-query+allfileusages-example-unique-generator": "Obter todos os títulos de ficheiro, marcando os eliminados.",
+       "apihelp-query+allfileusages-example-unique-generator": "Obter todos os títulos de ficheiro, marcando os que faltan.",
        "apihelp-query+allfileusages-example-generator": "Obtén as páxinas que conteñen os ficheiros.",
        "apihelp-query+allimages-description": "Enumerar tódalas imaxes secuencialmente.",
        "apihelp-query+allimages-param-sort": "Propiedade pola que ordenar.",
        "apihelp-query+tags-paramvalue-prop-active": "Se a etiqueta aínda está a ser usada.",
        "apihelp-query+tags-example-simple": "Listar as marcas dispoñibles",
        "apihelp-query+templates-description": "Devolve todas as páxinas incluídas na páxina indicada.",
-       "apihelp-query+templates-param-namespace": "Mostrar modelos só neste espazo de nomes.",
+       "apihelp-query+templates-param-namespace": "Mostrar os modelos só nestes espazos de nomes.",
        "apihelp-query+templates-param-limit": "Número de modelos a devolver.",
        "apihelp-query+templates-param-templates": "Listar só eses modelos. Útil para verificar se unha páxina concreta ten un modelo determinado.",
        "apihelp-query+templates-param-dir": "Dirección na cal listar.",
index 3985dc1..f85ea9f 100644 (file)
        "apihelp-query+exturlusage-param-protocol": "URLのプロトコル。このパラメータが空であり、かつ<var>$1query</var> が設定されている場合, protocol は <kbd>http</kbd> となります。すべての外部リンクを一覧表示するためにはこのパラメータと <var>$1query</var> の両方を空にしてください。",
        "apihelp-query+exturlusage-param-query": "プロトコルを除いた検索文字列。[[Special:LinkSearch]] も参照してください。すべての外部リンクを一覧表示するには空欄にしてください。",
        "apihelp-query+exturlusage-param-namespace": "列挙するページ名前空間。",
+       "apihelp-query+exturlusage-param-limit": "返すページの数。",
        "apihelp-query+exturlusage-example-simple": "<kbd>http://www.mediawiki.org</kbd> にリンクしているページを一覧表示する。",
        "apihelp-query+filearchive-description": "削除されたファイルをすべて順に列挙します。",
        "apihelp-query+filearchive-param-from": "列挙の始点となる画像のページ名。",
        "apihelp-query+fileusage-param-prop": "取得するプロパティ:",
        "apihelp-query+fileusage-paramvalue-prop-pageid": "各ページのページID。",
        "apihelp-query+fileusage-paramvalue-prop-title": "各ページのページ名。",
+       "apihelp-query+fileusage-paramvalue-prop-redirect": "ページがリダイレクトである場合マークします。",
+       "apihelp-query+fileusage-param-namespace": "この名前空間に含まれるページのみを一覧表示します。",
        "apihelp-query+fileusage-example-simple": "[[:File:Example.jpg]] を使用しているページの一覧を取得する。",
        "apihelp-query+fileusage-example-generator": "[[:File:Example.jpg]] を使用しているページの情報を取得する。",
        "apihelp-query+imageinfo-param-prop": "取得するファイル情報:",
index 938c098..ea169a4 100644 (file)
        "apihelp-block-description": "Blokuoti vartotoją.",
        "apihelp-block-param-reason": "Blokavimo priežastis.",
        "apihelp-block-param-nocreate": "Neleisti kurti paskyrų.",
+       "apihelp-compare-param-fromtitle": "Pirmas pavadinimas palyginimui.",
+       "apihelp-compare-param-fromid": "Pirmojo lyginamo puslapio ID.",
+       "apihelp-compare-param-totitle": "Antrasis pavadinimas palyginimui.",
+       "apihelp-compare-param-toid": "Antrojo lyginamo puslapio ID.",
+       "apihelp-createaccount-description": "Kurti naują vartotojo paskyrą.",
        "apihelp-createaccount-param-name": "Naudotojo vardas.",
+       "apihelp-createaccount-param-email": "Vartotojo el. pašto adresas (nebūtina).",
        "apihelp-createaccount-param-realname": "Vardas (nebūtina).",
        "apihelp-delete-description": "Ištrinti puslapį.",
+       "apihelp-delete-param-watch": "Pridėti puslapį prie dabartinio vartotojo stebimųjų sąrašo.",
+       "apihelp-delete-param-unwatch": "Pašalinti puslapį iš dabartinio vartotojo stebimųjų sąrašo.",
        "apihelp-delete-example-simple": "Ištrinti <kbd>Main Page</kbd>.",
        "apihelp-delete-example-reason": "Ištrinti <kbd>Main Page</kbd> su priežastimi <kbd>Preparing for move</kbd>.",
        "apihelp-disabled-description": "Šis modulis buvo išjungtas.",
        "apihelp-edit-description": "Kurti ir redaguoti puslapius.",
+       "apihelp-edit-param-title": "Redaguotino puslapio pavadinimas. Negali būti naudojamas kartu su <var>$1pageid</var>.",
+       "apihelp-edit-param-pageid": "Redaguotino puslapio ID. Negali būti naudojamas kartu su <var>$1title</var>.",
+       "apihelp-edit-param-section": "Sekcijos numeris. <kbd>0</kbd> - viršutinei sekcijai, <kbd>new</kbd> - naujai sekcijai.",
        "apihelp-edit-param-sectiontitle": "Naujo skyriaus pavadinimas.",
        "apihelp-edit-param-text": "Puslapio turinys.",
+       "apihelp-edit-param-summary": "Keitimo santrauka. Taip pat sekcijos pavadinimas, kai $1section=new ir $1sectiontitle yra nenustatytas.",
        "apihelp-edit-param-minor": "Smulkus pakeitimas.",
        "apihelp-edit-param-notminor": "Nesmulkus pakeitimas.",
+       "apihelp-edit-param-bot": "Pažymėti šį pakeitimą kaip roboto pakeitimą.",
        "apihelp-edit-param-createonly": "Neredaguoti puslapio jei jis jau egzistuoja.",
+       "apihelp-edit-param-nocreate": "Parodyti klaidą, jei puslapis neegzistuoja.",
        "apihelp-edit-param-watch": "Pridėti puslapį į dabartinio vartotojo stebimųjų sąrašą.",
        "apihelp-edit-param-unwatch": "Pašalinti puslapį iš dabartinio vartotojo stebimųjų sąrašo.",
        "apihelp-edit-param-redirect": "Automatiškai išspręsti peradresavimus.",
+       "apihelp-edit-param-contentmodel": "Naujam turiniui taikomas turinio modelis.",
        "apihelp-edit-example-edit": "Redaguoti puslapį.",
        "apihelp-emailuser-description": "Siųsti el. laišką naudotojui.",
        "apihelp-emailuser-param-target": "El. laiško gavėjas.",
+       "apihelp-emailuser-param-subject": "Temos antraštė.",
+       "apihelp-emailuser-param-ccme": "Siųsti šio laiško kopiją man.",
+       "apihelp-emailuser-example-email": "Siųsti el. pašto vartotojui <kbd>WikiSysop</kbd> su tekstu <kbd>Content</kbd>.",
        "apihelp-expandtemplates-param-title": "Puslapio pavadinimas.",
+       "apihelp-feedcontributions-description": "Gražina vartotojo įnašų srautą.",
        "apihelp-feedcontributions-param-feedformat": "Srauto formatas.",
        "apihelp-feedcontributions-param-year": "Nuo metų (ir anksčiau).",
        "apihelp-feedcontributions-param-month": "Nuo mėnesio (ir anksčiau).",
        "apihelp-feedcontributions-param-tagfilter": "Filtruoti įnašus, kurie turi šias žymes.",
        "apihelp-feedcontributions-param-deletedonly": "Rodyti tik ištrintus įnašus.",
+       "apihelp-feedcontributions-param-toponly": "Rodyti tik keitimus, kurie yra paskutiniai pakeitimai.",
+       "apihelp-feedcontributions-param-newonly": "Rodyti tik keitimus, kurie yra puslapio sukūrimai.",
        "apihelp-feedcontributions-param-hideminor": "Slėpti nedidelius pakeitimus.",
+       "apihelp-feedcontributions-param-showsizediff": "Rodyti dydžio skirtumą tarp keitimų.",
+       "apihelp-feedcontributions-example-simple": "Gražinti įnašus vartotojui <kbd>Example</kbd>.",
+       "apihelp-feedrecentchanges-description": "Gražina naujausių pakeitimų srautą.",
        "apihelp-feedrecentchanges-param-feedformat": "Srauto formatas.",
+       "apihelp-feedrecentchanges-param-limit": "Maksimalus grąžinamų rezultatų skaičius.",
        "apihelp-feedrecentchanges-param-from": "Rodyti pakeitimus nuo tada.",
        "apihelp-feedrecentchanges-param-hideminor": "Slėpti smulkius pakeitimus.",
        "apihelp-feedrecentchanges-param-hidebots": "Slėpti robotų pakeitimus.",
        "apihelp-feedrecentchanges-param-hideanons": "Slėpti vartotojų anonimų pakeitimus.",
        "apihelp-feedrecentchanges-param-hideliu": "Slėpti užsiregistravusių vartotojų pakeitimus.",
        "apihelp-feedrecentchanges-param-hidemyself": "Slėpti pakeitimus, atliktus dabartinio vartotojo.",
+       "apihelp-feedrecentchanges-param-hidecategorization": "Slėpti kategorijos narystės pakeitimus.",
        "apihelp-feedrecentchanges-param-tagfilter": "Filtruoti pagal žymę.",
        "apihelp-feedrecentchanges-param-target": "Rodyti tik keitimus puslapiuose, pasiekiamuose iš šio puslapio.",
+       "apihelp-feedrecentchanges-param-showlinkedto": "Vietoj to, rodyti pakeitimus puslapyje, susietame su pasirinktu puslapiu.",
+       "apihelp-feedrecentchanges-param-categories": "Rodyti pakeitimus tik puslapiuose, esančiuose visuose šiuose kategorijose.",
+       "apihelp-feedrecentchanges-param-categories_any": "Vietoj to, rodyti tik pakeitimus puslapiuse, esančiuose bet kurioje iš kategorijų.",
        "apihelp-feedrecentchanges-example-simple": "Parodyti naujausius keitimus.",
+       "apihelp-feedrecentchanges-example-30days": "Rodyti naujausius pakeitimus per 30 dienų.",
+       "apihelp-feedwatchlist-description": "Gražina stebimųjų sąrašo srautą.",
        "apihelp-feedwatchlist-param-feedformat": "Srauto formatas.",
+       "apihelp-feedwatchlist-example-default": "Rodyti stebimųjų sąrašo srautą.",
+       "apihelp-feedwatchlist-example-all6hrs": "Rodyti visus pakeitimus stebimuose puslapiuose per paskutines 6 valandas.",
        "apihelp-filerevert-param-comment": "Įkėlimo komentaras.",
+       "apihelp-help-description": "Rodyti pagalbą pasirinktiems moduliams.",
+       "apihelp-help-example-main": "Pagalba pagrindiniam moduliui.",
        "apihelp-help-example-recursive": "Visa pagalba viename puslapyje.",
        "apihelp-help-example-help": "Pačio pagalbos modulio pagalba.",
        "apihelp-imagerotate-description": "Pasukti viena ar daugiau paveikslėlių.",
        "apihelp-imagerotate-param-rotation": "Kiek laipsnių pasukti paveikslėlį pagal laikrodžio rodyklę.",
+       "apihelp-imagerotate-example-simple": "Pasukti <kbd>File:Example.png</kbd> <kbd>90</kbd> laipsnių.",
        "apihelp-imagerotate-example-generator": "Pasukti visus paveikslėlius <kbd>Category:Flip</kbd> <kbd>180</kbd> laipsnių.",
        "apihelp-import-param-xml": "XML failas įkeltas.",
        "apihelp-login-param-name": "Vartotojo vardas.",
        "apihelp-query+allcategories-param-limit": "Kiek kategorijų gražinti.",
        "apihelp-query+allcategories-paramvalue-prop-size": "Prideda puslapių kategorijoje skaičių.",
        "apihelp-query+alldeletedrevisions-example-user": "Sąrašas paskutinių 50 ištrintų indėlių pagal vartotoją\n<kbd>Pavyzdys</kbd>.",
+       "apihelp-query+allfileusages-paramvalue-prop-title": "Prideda failo pavadinimą.",
+       "apihelp-query+allfileusages-param-limit": "Kiek iš viso gražinti objektų.",
+       "apihelp-query+allfileusages-example-generator": "Gauti puslapius, kuriuose yra failai.",
+       "apihelp-query+allimages-param-limit": "Kiek iš viso gražinti paveikslėlių.",
+       "apihelp-query+allimages-example-B": "Rodyti failų sąrašą, pradedant raide <kbd>B</kbd>.",
+       "apihelp-query+allimages-example-recent": "Rodyti neseniai įkeltų failų sąrašą, panašu į [[Special:NewFiles]].",
+       "apihelp-query+allimages-example-mimetypes": "Rodyti sąrašą failų su MIME tipu <kbd>image/png</kbd> arba <kbd>image/gif</kbd>",
+       "apihelp-query+allimages-example-generator": "Rodyti informaciją apie 4 failus, pradedant raide <kbd>T</kbd>.",
+       "apihelp-query+alllinks-param-prop": "Kokią informaciją įtraukti:",
        "apihelp-query+alllinks-paramvalue-prop-title": "Prideda nuorodos pavadinimą.",
        "apihelp-query+alllinks-param-limit": "Kiek objektų iš viso gražinti.",
        "apihelp-query+allmessages-param-lang": "Gražinti pranešimus šia kalba.",
+       "apihelp-query+allmessages-param-from": "Gražinti pranešimus, pradedant šiuo pranešimu.",
+       "apihelp-query+allmessages-param-to": "Gražinti pranešimus, baigiant šiuo pranešimu.",
        "apihelp-query+allrevisions-param-namespace": "Rodyti puslapius tik šioje vardų srityje.",
+       "apihelp-query+mystashedfiles-param-limit": "Kiek gauti failų.",
+       "apihelp-query+allusers-param-prop": "Kokią informaciją įtraukti:",
+       "apihelp-query+allusers-paramvalue-prop-implicitgroups": "Nurodo visas grupes, kuriuose vartotojas yra automatiškai.",
+       "apihelp-query+allusers-paramvalue-prop-rights": "Nurodo teises, kurias turi vartotojas.",
+       "apihelp-query+allusers-paramvalue-prop-editcount": "Prideda vartotojo pakeitimų skaičių.",
+       "apihelp-query+allusers-paramvalue-prop-registration": "Prideda laiko žymą, nurodančia kada vartotojas prisiregistravo, jei prieinama (gali būti tuščias).",
+       "apihelp-query+allusers-param-limit": "Kiek viso gražinti vartotojų vardų.",
+       "apihelp-query+allusers-param-witheditsonly": "Nurodyti tik vartotojus, kurie atliko keitimus.",
+       "apihelp-query+allusers-param-activeusers": "Nurodyti tik vartotojus, kurie buvo aktyvus per {{PLURAL:$1|paskutinę dieną|paskutines $1 dienas}}.",
+       "apihelp-query+allusers-example-Y": "Nurodyti vartotojus, pradedant nuo <kbd>Y</kbd>.",
+       "apihelp-query+backlinks-description": "Rasti visus puslapius, kurie nukreipia į pateiktą puslapį.",
        "apihelp-query+backlinks-example-simple": "Rodyti nuorodas <kbd>Pagrindinis puslapis</kbd>.",
+       "apihelp-query+blocks-description": "Nurodyti visus užblokuotus vartotojus ir IP adresus.",
+       "apihelp-query+blocks-param-limit": "Maksimalus nurodomų blokavimų skaičius.",
        "apihelp-query+blocks-paramvalue-prop-id": "Prideda bloko ID.",
        "apihelp-query+blocks-paramvalue-prop-user": "Prideda užblokuoto vartotojo vardą.",
        "apihelp-query+blocks-paramvalue-prop-userid": "Prideda užblokuoto vartotojo ID.",
        "apihelp-query+blocks-paramvalue-prop-expiry": "Prideda blokavimo pabaigos laiko žymes.",
        "apihelp-query+blocks-paramvalue-prop-reason": "Prideda blokavimo priežastį.",
        "apihelp-query+blocks-paramvalue-prop-range": "Prideda blokavimo paveiktų IP adresų diapazoną.",
+       "apihelp-query+blocks-example-simple": "Nurodyti blokavimus.",
+       "apihelp-query+blocks-example-users": "Nurodo vartotojų <kbd>Alice</kbd> ir <kbd>Bob</kbd> blokavimus.",
+       "apihelp-query+categories-description": "Nurodo visas kategorijas, kurioms priklauso puslapiai.",
+       "apihelp-query+categories-param-show": "Kokias kategorijas rodyti.",
+       "apihelp-query+categories-param-limit": "Kiek kategorijų gražinti.",
+       "apihelp-query+categories-param-categories": "Nurodyti tik šias kategorijas. Naudinga, kai norima patikrinti ar tam tikras puslapis yra tam tikroje kategorijoje.",
+       "apihelp-query+categories-example-simple": "Gauti sąrašą kategorijų, kurioms priklauso puslapis <kbd>Albert Einstein</kbd>.",
+       "apihelp-query+categories-example-generator": "Gauti informaciją apie visas kategorijas, panaudotas <kbd>Albert Einstein</kbd> puslapyje.",
+       "apihelp-query+categoryinfo-description": "Gražina informaciją apie pateiktas kategorijas.",
+       "apihelp-query+categoryinfo-example-simple": "Gauti informaciją apie <kbd>Category:Foo</kbd> ir <kbd>Category:Bar</kbd>.",
+       "apihelp-query+categorymembers-description": "Nurodyti visus puslapius pateiktoje kategorijoje.",
+       "apihelp-query+categorymembers-paramvalue-prop-ids": "Prideda puslapio ID.",
+       "apihelp-query+categorymembers-param-limit": "Maksimalus grąžinamų puslapių skaičius.",
+       "apihelp-query+categorymembers-param-startsortkey": "Vietoj to, naudoti $1starthexsortkey",
+       "apihelp-query+categorymembers-param-endsortkey": "Vietoj to, naudoti $1endhexsortkey",
+       "apihelp-query+categorymembers-example-simple": "Gauti pirmus 10 puslapiu iš <kbd>Category:Physics</kbd>.",
+       "apihelp-query+categorymembers-example-generator": "Gauti puslapių informaciją apie pirmus 10 puslapių iš <kbd>Category:Physics</kbd>.",
+       "apihelp-query+deletedrevs-paraminfo-modes": "{{PLURAL:$1|Režimas|Režimai}}: $2",
+       "apihelp-query+duplicatefiles-param-limit": "Kiek pasikartojančių failų gražinti.",
+       "apihelp-query+duplicatefiles-example-simple": "Ieškoti [[:File:Albert Einstein Head.jpg]] dublikatų.",
+       "apihelp-query+duplicatefiles-example-generated": "Ieškoti pasikartojančių visuose failuose.",
+       "apihelp-query+embeddedin-param-title": "Pavadinimas paieškai. Negali būti naudojamas kartu su $1pageid.",
+       "apihelp-query+embeddedin-param-pageid": "Puslapio ID paieškai. Negali būti naudojamas kartu su $1title.",
+       "apihelp-query+embeddedin-param-limit": "Kiek puslapių iš viso gražinti.",
+       "apihelp-query+extlinks-param-limit": "Kiek nuorodų grąžinti.",
+       "apihelp-query+extlinks-example-simple": "Gauti sąrašą <kbd>Main Page</kbd> išorinių nuorodų.",
+       "apihelp-query+exturlusage-param-prop": "Kokią informaciją įtraukti:",
+       "apihelp-query+exturlusage-paramvalue-prop-ids": "Prideda puslapio ID.",
+       "apihelp-query+exturlusage-paramvalue-prop-url": "Prideda URL, panaudota puslapyje.",
+       "apihelp-query+exturlusage-param-limit": "Kiek puslapių gražinti.",
+       "apihelp-query+exturlusage-example-simple": "Rodyti puslapius, nurodančius į <kbd>http://www.mediawiki.org</kbd>.",
+       "apihelp-query+filearchive-param-prop": "Kokią paveikslėlio informaciją gauti:",
+       "apihelp-query+filearchive-paramvalue-prop-timestamp": "Prideda laiko žymę įkeltai versijai.",
+       "apihelp-query+filearchive-paramvalue-prop-user": "Prideda vartotoją, kuris įkėlė paveikslėlio versiją.",
+       "apihelp-query+filearchive-paramvalue-prop-size": "Prideda paveikslėlio dydžio informaciją baitais ir aukštį, plotį ir puslapių skaičių (jei taikoma).",
+       "apihelp-query+filearchive-paramvalue-prop-mime": "Prideda paveikslėlio MIME.",
+       "apihelp-query+filearchive-paramvalue-prop-mediatype": "Prideda paveikslėlio medijos tipą.",
+       "apihelp-query+filearchive-example-simple": "Rodyti visų ištrintų failų sąrašą.",
+       "apihelp-query+fileusage-param-prop": "Kurias savybes gauti:",
+       "apihelp-query+fileusage-paramvalue-prop-pageid": "Kiekvieno puslapio ID.",
+       "apihelp-query+fileusage-paramvalue-prop-title": "Kiekvieno puslapio pavadinimas.",
+       "apihelp-query+fileusage-paramvalue-prop-redirect": "Pažymėti jei puslapis yra peradresavimas.",
+       "apihelp-query+fileusage-param-limit": "Kiek gražinti.",
+       "apihelp-query+fileusage-example-simple": "Gauti sąrašą puslapių, kurie naudoja [[:File:Example.jpg]].",
+       "apihelp-query+fileusage-example-generator": "Gauti informaciją apie puslapius, kurie naudoja [[:File:Example.jpg]].",
+       "apihelp-query+imageinfo-description": "Gražina failo informaciją ir įkėlimų istoriją.",
+       "apihelp-query+imageinfo-param-prop": "Kurią failo informaciją gauti:",
+       "apihelp-query+imageinfo-paramvalue-prop-timestamp": "Prideda laiko žymę įkeltai versijai.",
+       "apihelp-query+imageinfo-paramvalue-prop-user": "Prideda vartotoją, kuris įkėlę kiekvieną failo versiją.",
+       "apihelp-query+imageinfo-paramvalue-prop-userid": "Prideda vartotojo ID, kuris įkėlė kiekvieną failo versiją.",
+       "apihelp-query+imageinfo-paramvalue-prop-comment": "Versijos komentaras.",
+       "apihelp-query+imageinfo-paramvalue-prop-mime": "Prideda MIME failo tipą.",
+       "apihelp-query+imageinfo-paramvalue-prop-mediatype": "Prideda failo medijos tipą.",
+       "apihelp-query+imageinfo-param-urlheight": "Panašu į $1urlwidth.",
+       "apihelp-query+images-param-limit": "Kiek failų gražinti.",
+       "apihelp-query+images-param-images": "Nurodyti tik šiuos failus. Naudinga, kai norima patikrinti ar tam tikras puslapis turi tam tikrą failą.",
+       "apihelp-query+images-example-simple": "Gauti sąrašą failų, kurie naudojami [[Main Page]].",
+       "apihelp-query+images-example-generator": "Gauti informaciją apie failus, kurie yra naudojami [[Main Page]].",
+       "apihelp-query+imageusage-description": "Rasti visus puslapius, kurie naudoja duotą paveikslėlio pavadinimą.",
+       "apihelp-query+info-description": "Gauti pagrindinę puslapio informaciją.",
+       "apihelp-query+info-param-prop": "Kokias papildomas savybes gauti:",
+       "apihelp-query+info-paramvalue-prop-protection": "Nurodyti kiekvieno puslapio apsaugos lygį.",
+       "apihelp-query+info-paramvalue-prop-watched": "Kiekvieno puslapio stebėjimo būsena.",
+       "apihelp-query+info-paramvalue-prop-watchers": "Stebėtojų skaičius, jei leidžiama.",
+       "apihelp-query+info-paramvalue-prop-readable": "Ar vartotojas gali skaityti šį puslapį.",
+       "apihelp-query+info-paramvalue-prop-preload": "Pateikia tekstą, gražinta EditFormPreloadText.",
+       "apihelp-query+info-example-simple": "Gauti informaciją apie puslapį <kbd>Main Page</kbd>.",
+       "apihelp-query+info-example-protection": "Gauti bendrą ir apsaugos informaciją apie <kbd>Main Page</kbd> puslapį.",
+       "apihelp-query+iwbacklinks-param-prop": "Kurias savybes gauti:",
+       "apihelp-query+iwbacklinks-example-simple": "Gauti puslapius, nurodančius į [[wikibooks:Test]].",
+       "apihelp-query+iwbacklinks-example-generator": "Gauti informaciją apie puslapius, nurodančius į [[wikibooks:Test]].",
+       "apihelp-query+iwlinks-paramvalue-prop-url": "Prideda visą URL.",
+       "apihelp-query+langbacklinks-param-lang": "Kalbos nuorodos kalba.",
+       "apihelp-query+langbacklinks-param-limit": "Kiek puslapių iš viso gražinti.",
+       "apihelp-query+langbacklinks-param-prop": "Kurias savybes gauti:",
+       "apihelp-query+langbacklinks-example-simple": "Gauti puslapius, nurodančius į [[:fr:Test]].",
+       "apihelp-query+langbacklinks-example-generator": "Gauti informaciją apie puslapius, nurodančius į [[:fr:Test]].",
+       "apihelp-query+langlinks-param-url": "Ar gauti visą URL (negali būti naudojamas su <var>$1prop</var>).",
+       "apihelp-query+langlinks-paramvalue-prop-url": "Prideda visą URL.",
+       "apihelp-query+links-param-limit": "Kiek nuorodų grąžinti.",
+       "apihelp-query+links-example-simple": "Gauti nuorodas iš puslapio <kbd>Main Page</kbd>",
+       "apihelp-query+links-example-generator": "Gauti informaciją apie puslapių nuorodas puslapyje <kbd>Main Page</kbd>.",
+       "apihelp-query+linkshere-description": "Rasti visus puslapius, kurie nurodo į pateiktus puslapius.",
+       "apihelp-query+linkshere-param-prop": "Kurias savybes gauti:",
+       "apihelp-query+linkshere-paramvalue-prop-pageid": "Kiekvieno puslapio ID.",
+       "apihelp-query+linkshere-paramvalue-prop-title": "Kiekvieno puslapio pavadinimas.",
+       "apihelp-query+linkshere-paramvalue-prop-redirect": "Pažymėti jei puslapis yra peradresavimas.",
+       "apihelp-query+linkshere-param-limit": "Kiek gražinti.",
+       "apihelp-query+linkshere-param-show": "Rodyti tik elementus, atitinkančius šiuos kriterijus:\n;redirect:Rodyti tik nukreipimus.\n;!redirect:Rodyti tik ne nukreipimus.",
+       "apihelp-query+linkshere-example-simple": "Gauti sąrašą puslapių, kurie nurodo į [[Main Page]].",
+       "apihelp-query+linkshere-example-generator": "Gauti informaciją apie puslapius, kurie nurodo į [[Main Page]].",
+       "apihelp-query+logevents-description": "Gauti įvykius iš žurnalų.",
+       "apihelp-query+logevents-param-prop": "Kurias savybes gauti:",
+       "apihelp-query+logevents-paramvalue-prop-ids": "Prideda žurnalo įvykio ID.",
+       "apihelp-query+logevents-paramvalue-prop-type": "Prideda žurnalo įvykio tipą.",
        "apihelp-query+watchlist-paramvalue-type-external": "Išoriniai keitimai.",
        "apihelp-query+watchlist-paramvalue-type-new": "Puslapio sukūrimai.",
        "apihelp-stashedit-param-title": "Puslapio pavadinimas buvo redaguotas.",
index 4b99320..89e2b21 100644 (file)
@@ -13,7 +13,8 @@
                        "Rangekill",
                        "Robin van der Vliet",
                        "Edoderoo",
-                       "Lemondoge"
+                       "Lemondoge",
+                       "Hex"
                ]
        },
        "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Documentatie]]\n* [[mw:API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api E-maillijst]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API-aankondigingen]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Bugs & verzoeken]\n</div>\n<strong>Status:</strong> Alle functies die op deze pagina worden weergegeven horen te werken. Aan de API wordt actief gewerkt, en deze kan gewijzigd worden. Abonneer u op  de [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ e-maillijst mediawiki-api-announce] voor meldingen over aanpassingen.\n\n<strong>Foutieve verzoeken:</strong> als de API foutieve verzoeken ontvangt, wordt er geantwoord met een HTTP-header met de sleutel \"MediaWiki-API-Error\" en daarna worden de waarde van de header en de foutcode op dezelfde waarde ingesteld. Zie [[mw:API:Errors_and_warnings|API: Errors and warnings]] voor meer informatie.\n\n<strong>Testen:</strong> u kunt [[Special:ApiSandbox|eenvoudig API-verzoeken testen]].",
        "apihelp-options-description": "Voorkeuren van de huidige gebruiker wijzigen.\n\nAlleen opties die zijn geregistreerd in core of in een van de geïnstalleerde uitbreidingen, of opties met de toetsen aangeduid met <code>userjs-</code> (bedoeld om te worden gebruikt door gebruikersscripts), kunnen worden ingesteld.",
        "apihelp-options-param-reset": "Zet de voorkeuren terug naar de standaard van de website.",
        "apihelp-options-param-resetkinds": "Lijst van de optiestypes die opnieuw ingesteld worden wanneer de optie <var>$1reset</var> is ingesteld.",
-       "apihelp-options-param-change": "Lijst van wijzigingen, opgemaakt als <kbd>naam=waarde</kbd> (bijvoorbeeld <kbd>skin=vector</kbd>). De waarde kan geen sluistekens bevatten. Als er geen waarde wordt opgegeven (zelfs niet een is-gelijk teken), bijvoorbeeld, <kbd>optienaam|otheroption|...</kbd>, wordt de optie ingesteld op de standaardwaarde.",
+       "apihelp-options-param-change": "Lijst van wijzigingen, opgemaakt als <kbd>naam=waarde</kbd> (bijvoorbeeld <kbd>skin=vector</kbd>). Als er geen waarde wordt opgegeven (zelfs niet een is-gelijk teken), bijvoorbeeld <kbd>optienaam|andereoptie|...</kbd>, dan wordt de optie ingesteld op de standaardwaarde. Als een opgegeven waarde een sluisteken bevat (<kbd>|</kbd>), gebruik dan het [[Special:ApiHelp/main#main/datatypes|alternatieve scheidingsteken tussen meerdere waardes]] voor een juiste werking.",
        "apihelp-options-param-optionname": "De naam van de optie die moet worden ingesteld op de waarde gegeven door <var>$1optiewaarde</var>.",
-       "apihelp-options-param-optionvalue": "De waarde voor de optie opgegeven door <var>$1optienaam</var>, kan sluistekens (verticale streepjes) bevatten.",
+       "apihelp-options-param-optionvalue": "De waarde voor de optie opgegeven door <var>$1optionname</var>.",
        "apihelp-options-example-reset": "Alle voorkeuren opnieuw instellen.",
        "apihelp-options-example-change": "Voorkeuren wijzigen voor <kbd>skin</kbd> en <kbd>hideminor</kbd>.",
        "apihelp-parse-paramvalue-prop-categorieshtml": "Vraagt een HTML-versie van de categorieën op.",
diff --git a/includes/api/i18n/nso.json b/includes/api/i18n/nso.json
new file mode 100644 (file)
index 0000000..42b30bb
--- /dev/null
@@ -0,0 +1,9 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Mohau"
+               ]
+       },
+       "apihelp-createaccount-param-name": "Leina la mošomši.",
+       "apihelp-login-example-login": "Tsena."
+}
index 6e85779..7ecfebe 100644 (file)
@@ -28,7 +28,7 @@
        "apihelp-edit-param-text": "Contengut de la pagina.",
        "apihelp-edit-param-minor": "Modificacion menora.",
        "apihelp-edit-param-notminor": "Modificacion pas menora.",
-       "apihelp-edit-param-bot": "Marcar aquesta modificacion coma robòt.",
+       "apihelp-edit-param-bot": "Marcar aquesta modificacion coma efectuada per un robòt.",
        "apihelp-edit-example-edit": "Modificar una pagina",
        "apihelp-edit-example-prepend": "Prefixar una pagina per <kbd>_&#95;NOTOC_&#95;</kbd>",
        "apihelp-emailuser-description": "Mandar un corrièr electronic un l’utilizaire.",
index b79f65f..4c31ca8 100644 (file)
        "apihelp-options-description": "Zmienia preferencje bieżącego użytkownika.\n\nMożna ustawiać tylko opcje zarejestrowane w rdzeniu, w zainstalowanych rozszerzeniach lub z kluczami o prefiksie <code>userjs-</code> (do wykorzystywania przez skrypty użytkowników).",
        "apihelp-options-param-reset": "Resetuj preferencje do domyślnych.",
        "apihelp-options-param-resetkinds": "Lista typów opcji do zresetowania, jeżeli ustawiono opcję <var>$1reset</var>.",
-       "apihelp-options-param-change": "Lista zmian, w formacie nazwa=wartość (np. skin=vector). Wartość nie może zawierać znaku pionowej kreski. Jeżeli nie zostanie podana wartość (a nawet znak równości), np., optionname|otheroption|..., to opcja zostanie zresetowana do jej wartości domyślnej.",
+       "apihelp-options-param-change": "Lista zmian, w formacie nazwa=wartość (np. skin=vector).  Jeżeli nie zostanie podana wartość (nawet znak równości), np., optionname|otheroption|..., to opcja zostanie zresetowana do jej wartości domyślnej. Jeżeli jakakolwiek podawana wartość zawiera znak pionowej kreski (<kbd>|</kbd>), użyj [[Special:ApiHelp/main#main/datatypes|alternatywnego separatora wielu wartości]] aby operacja się powiodła.",
        "apihelp-options-param-optionname": "Nazwa opcji, która powinna być ustawiona na wartość <var>$1optionvalue</var>.",
-       "apihelp-options-param-optionvalue": "Wartość opcji, określona w <var>$1optionname</var>, może zawierać znaki pionowej kreski.",
+       "apihelp-options-param-optionvalue": "Wartość opcji, określona w <var>$1optionname</var>.",
        "apihelp-options-example-reset": "Resetuj wszystkie preferencje.",
        "apihelp-options-example-change": "Zmień preferencje <kbd>skin</kbd> (skórka) i <kbd>hideminor</kbd> (ukryj drobne edycje).",
        "apihelp-options-example-complex": "Zresetuj wszystkie preferencje, a następnie ustaw <kbd>skin</kbd> i <kbd>nickname</kbd>.",
        "apihelp-purge-example-simple": "Wyczyść strony <kbd>Main Page</kbd> i <kbd>API</kbd>.",
        "apihelp-purge-example-generator": "Przeczyść pierwsze 10 stron w przestrzeni głównej.",
        "apihelp-query+allcategories-description": "Emuluj wszystkie kategorie.",
+       "apihelp-query+allcategories-param-from": "Kategoria, od której rozpocząć wyliczanie.",
+       "apihelp-query+allcategories-param-to": "Kategoria, na której zakończyć wyliczanie.",
        "apihelp-query+allcategories-param-dir": "Kierunek sortowania.",
        "apihelp-query+allcategories-param-limit": "Liczba kategorii do zwórcenia.",
        "apihelp-query+allcategories-param-prop": "Jakie właściwości otrzymać:",
        "apihelp-query+alldeletedrevisions-description": "Wymień wszystkie usunięte wersje użytkownika lub z przestrzeni nazw.",
        "apihelp-query+alldeletedrevisions-paraminfo-useronly": "Może być użyte tylko z <var>$3user</var>.",
        "apihelp-query+alldeletedrevisions-paraminfo-nonuseronly": "Nie może być używane z <var>$3user</var>.",
+       "apihelp-query+alldeletedrevisions-param-start": "Znacznik czasu, od którego rozpocząć wyliczanie.",
+       "apihelp-query+alldeletedrevisions-param-end": "Znacznik czasu, na którym zakończyć wyliczanie.",
        "apihelp-query+alldeletedrevisions-param-from": "Zacznij nasłuchiwanie na tym tytule.",
        "apihelp-query+alldeletedrevisions-param-to": "Skończ nasłuchiwanie na tym tytule.",
        "apihelp-query+alldeletedrevisions-param-prefix": "Szukaj tytułów stron zaczynających się na tę wartość.",
        "apihelp-query+alldeletedrevisions-example-user": "Wymień ostatnie 50 usuniętych edycji przez użytkownika <kbd>Example</kbd>.",
        "apihelp-query+alldeletedrevisions-example-ns-main": "Wymień ostatnie 50 usuniętych edycji z przestrzeni głównej.",
        "apihelp-query+allfileusages-description": "Lista wykorzystania pliku, także dla nieistniejących.",
+       "apihelp-query+allfileusages-param-from": "Nazwa pliku, od którego rozpocząć wyliczanie.",
+       "apihelp-query+allfileusages-param-to": "Nazwa pliku, na którym zakończyć wyliczanie.",
        "apihelp-query+allfileusages-param-prop": "Jakie informacje dołączyć:",
        "apihelp-query+allfileusages-paramvalue-prop-title": "Dodaje tytuł pliku.",
        "apihelp-query+allfileusages-param-limit": "Łączna liczba obiektów do zwrócenia.",
        "apihelp-query+allfileusages-example-unique": "Lista unikatowych tytułów plików.",
        "apihelp-query+allimages-param-sort": "Sortowanie według właściwości.",
+       "apihelp-query+allimages-param-minsize": "Ogranicz do obrazków, mających co najmniej taką liczbę bajtów.",
+       "apihelp-query+allimages-param-maxsize": "Ogranicz do obrazków, mających co najwyżej taką liczbę bajtów.",
+       "apihelp-query+allimages-example-B": "Pokaz listę plików rozpoczynających się na literę <kbd>B</kbd>.",
        "apihelp-query+allimages-example-recent": "Pokaż listę ostatnio przesłanych plików, podobnie do [[Special:NewFiles]].",
        "apihelp-query+allimages-example-mimetypes": "Pokaż listę plików z typem MIME <kbd>image/png</kbd> lub <kbd>image/gif</kbd>",
+       "apihelp-query+allimages-example-generator": "Pokaż informacje o 4 plikach rozpoczynających się na literę <kbd>T</kbd>.",
+       "apihelp-query+alllinks-param-from": "Nazwa linku, od którego rozpocząć wyliczanie.",
+       "apihelp-query+alllinks-param-to": "Nazwa linku, na którym zakończyć wyliczanie.",
        "apihelp-query+alllinks-param-prop": "Jakie informacje dołączyć:",
        "apihelp-query+alllinks-paramvalue-prop-title": "Dodaje tytuł linku.",
        "apihelp-query+alllinks-param-namespace": "Przestrzeń nazw do emulacji.",
        "apihelp-query+alllinks-example-unique": "Lista unikatowych tytułów plików.",
        "apihelp-query+allmessages-param-prop": "Właściwości do odczytu.",
        "apihelp-query+allmessages-param-prefix": "Zwróć wiadomości z tym prefixem.",
+       "apihelp-query+allmessages-example-ipb": "Pokaż wiadomości rozpoczynające się od <kbd>ipb-</kbd>.",
+       "apihelp-query+allmessages-example-de": "Pokaż wiadomości <kbd>august</kbd> i <kbd>mainpage</kbd> w języku niemieckim.",
+       "apihelp-query+allpages-param-from": "Tytuł strony, od której rozpocząć wyliczanie.",
+       "apihelp-query+allpages-param-to": "Tytuł strony, na której zakończyć wyliczanie.",
+       "apihelp-query+allpages-param-minsize": "Ogranicz do stron, mających co najmniej taką liczbę bajtów.",
+       "apihelp-query+allpages-param-maxsize": "Ogranicz do stron, mających co najwyżej taką liczbę bajtów.",
        "apihelp-query+allpages-param-prtype": "Ogranicz tylko do zabezpieczonych stron.",
        "apihelp-query+allpages-param-limit": "Liczba stron do zwrócenia.",
        "apihelp-query+allpages-example-B": "Pokaż listę stron rozpoczynających się na literę <kbd>B</kbd>.",
+       "apihelp-query+allpages-example-generator": "Pokaż informacje o 4 stronach rozpoczynających się na literę <kbd>T</kbd>.",
+       "apihelp-query+allpages-example-generator-revisions": "Pokaż zawartość pierwszych dwóch nieprzekierowujących stron, zaczynających się na <kbd>Re</kbd>.",
        "apihelp-query+allredirects-description": "Lista wszystkich przekierowań do przestrzeni nazw.",
+       "apihelp-query+allredirects-param-from": "Nazwa przekierowania, od którego rozpocząć wyliczanie.",
+       "apihelp-query+allredirects-param-to": "Nazwa przekierowania, na którym zakończyć wyliczanie.",
        "apihelp-query+allredirects-param-prop": "Jakie informacje dołączyć:",
        "apihelp-query+allredirects-paramvalue-prop-title": "Dodaje tytuł przekierowania.",
        "apihelp-query+allredirects-param-namespace": "Przestrzeń nazw do emulacji.",
        "apihelp-query+allredirects-param-limit": "Łączna liczba obiektów do zwrócenia.",
        "apihelp-query+allrevisions-description": "Wyświetl wszystkie wersje.",
+       "apihelp-query+allrevisions-param-start": "Znacznik czasu, od którego rozpocząć wyliczanie.",
+       "apihelp-query+allrevisions-param-end": "Znacznik czasu, na którym zakończyć wyliczanie.",
        "apihelp-query+allrevisions-param-user": "Wyświetl wersje tylko tego użytkownika.",
        "apihelp-query+allrevisions-param-excludeuser": "Nie wyświetlaj wersji tego użytkownika.",
        "apihelp-query+allrevisions-param-namespace": "Wyświetl tylko strony w przestrzeni głównej.",
        "apihelp-query+allrevisions-example-ns-main": "Wyświetl pierwsze 50 wersji w przestrzeni głównej.",
+       "apihelp-query+mystashedfiles-param-limit": "Liczba plików do pobrania.",
        "apihelp-query+alltransclusions-param-prop": "Jakie informacje dołączyć:",
        "apihelp-query+alltransclusions-param-namespace": "Przestrzeń nazw do emulacji.",
+       "apihelp-query+alltransclusions-param-limit": "Łączna liczba elementów do zwrócenia.",
+       "apihelp-query+allusers-param-from": "Nazwa użytkownika, od którego rozpocząć wyliczanie.",
+       "apihelp-query+allusers-param-to": "Nazwa użytkownika, na którym zakończyć wyliczanie.",
+       "apihelp-query+allusers-param-prefix": "Wyszukaj wszystkich użytkowników, których nazwy zaczynają się od tej wartości.",
        "apihelp-query+allusers-param-dir": "Kierunek sortowania.",
        "apihelp-query+allusers-param-prop": "Jakie informacje dołączyć:",
+       "apihelp-query+allusers-paramvalue-prop-rights": "Wyświetla uprawnienia, które posiada użytkownik.",
+       "apihelp-query+allusers-paramvalue-prop-editcount": "Dodaje liczbę edycji użytkownika.",
+       "apihelp-query+allusers-param-limit": "Łączna liczba nazw użytkowników do zwrócenia.",
        "apihelp-query+allusers-param-witheditsonly": "Tylko użytkownicy, którzy edytowali.",
+       "apihelp-query+allusers-param-activeusers": "Wyświetl tylko użytkowników, aktywnych w ciągu {{PLURAL:$1|ostatniego dnia|ostatnich $1 dni}}.",
+       "apihelp-query+allusers-example-Y": "Wyświetl użytkowników zaczynających się na <kbd>Y</kbd>.",
        "apihelp-query+backlinks-description": "Znajdź wszystkie strony, które linkują do danej strony.",
        "apihelp-query+backlinks-param-namespace": "Przestrzeń nazw do emulacji.",
        "apihelp-query+backlinks-example-simple": "Pokazuj linki do <kbd>Main page</kbd>.",
+       "apihelp-query+blocks-param-start": "Znacznik czasu, od którego rozpocząć wyliczanie.",
+       "apihelp-query+blocks-param-end": "Znacznik czasu, na którym zakończyć wyliczanie.",
        "apihelp-query+blocks-param-ids": "Lista zablokowanych ID do wylistowania (opcjonalne).",
        "apihelp-query+blocks-param-users": "Lista użytkowników do wyszukania (opcjonalne).",
        "apihelp-query+blocks-param-limit": "Maksymalna liczba blokad do wylistowania.",
+       "apihelp-query+blocks-paramvalue-prop-reason": "Dodaje powód zablokowania.",
        "apihelp-query+blocks-example-simple": "Listuj blokady.",
        "apihelp-query+categories-param-limit": "Liczba kategorii do zwrócenia.",
        "apihelp-query+categorymembers-description": "Wszystkie strony w danej kategorii.",
        "apihelp-query+categorymembers-paramvalue-prop-type": "Doda informacje o typie strony w kategorii (<samp>page</samp> (strona), <samp>subcat</samp> (podkategoria) lub <samp>file</samp> (plik)).",
        "apihelp-query+categorymembers-param-limit": "Maksymalna liczba zwracanych wyników.",
        "apihelp-query+categorymembers-param-sort": "Sortowanie według właściwości.",
+       "apihelp-query+categorymembers-param-dir": "W jakim kierunku sortować.",
        "apihelp-query+deletedrevisions-param-tag": "Pokazuj tylko zmiany oznaczone tym tagiem.",
        "apihelp-query+deletedrevisions-param-user": "Pokazuj tylko zmiany dokonane przez tego użytkownika.",
        "apihelp-query+deletedrevisions-param-excludeuser": "Nie pokazuj zmian dokonanych przez tego użytkownika.",
        "apihelp-query+deletedrevs-paraminfo-modes": "{{PLURAL:$1|Tryb|Tryby}}: $2",
+       "apihelp-query+deletedrevs-param-start": "Znacznik czasu, od którego rozpocząć wyliczanie.",
+       "apihelp-query+deletedrevs-param-end": "Znacznik czasu, na którym zakończyć wyliczanie.",
        "apihelp-query+deletedrevs-param-unique": "Liatuj tylko jedną edycję dla każdej strony.",
        "apihelp-query+deletedrevs-param-tag": "Pokazuj tylko zmiany oznaczone tym tagiem.",
        "apihelp-query+deletedrevs-param-user": "Listuj tylko zmiany dokonane przez tego użytkownika.",
        "apihelp-query+deletedrevs-param-excludeuser": "Nie listuj zmian dokonanych przez tego użytkownika.",
        "apihelp-query+deletedrevs-param-namespace": "Listuj tylko strony z tej przestrzeni nazw.",
        "apihelp-query+deletedrevs-param-limit": "Maksymalna liczba zmian do wylistowania.",
+       "apihelp-query+disabled-description": "Ten moduł zapytań został wyłączony.",
        "apihelp-query+duplicatefiles-example-generated": "Szukaj duplikatów wszystkich plików.",
        "apihelp-query+embeddedin-param-filterredir": "Jaki filtrować przekierowania.",
+       "apihelp-query+embeddedin-param-limit": "Łączna liczba stron do zwrócenia.",
        "apihelp-query+extlinks-param-limit": "Liczba linków do zwrócenia.",
        "apihelp-query+exturlusage-param-prop": "Jakie informacje dołączyć:",
+       "apihelp-query+exturlusage-paramvalue-prop-ids": "Dodaje ID strony.",
+       "apihelp-query+exturlusage-paramvalue-prop-title": "Dodaje tytuł i identyfikator przestrzeni nazw strony.",
+       "apihelp-query+exturlusage-paramvalue-prop-url": "Dodaje adres URL, używany na stronie.",
        "apihelp-query+exturlusage-param-limit": "Liczba stron do zwrócenia.",
        "apihelp-query+filearchive-paramvalue-prop-dimensions": "Alias rozmiaru.",
+       "apihelp-query+filearchive-paramvalue-prop-description": "Dodaje opis wersji obrazka.",
        "apihelp-query+filearchive-example-simple": "Pokaż listę wszystkich usuniętych plików.",
        "apihelp-query+filerepoinfo-example-simple": "Uzyskaj informacje na temat repozytoriów plików.",
+       "apihelp-query+fileusage-description": "Znajdź wszystkie strony, które używają danych plików.",
        "apihelp-query+fileusage-paramvalue-prop-title": "Nazwa każdej strony.",
+       "apihelp-query+fileusage-paramvalue-prop-redirect": "Oznacz, jeśli strona jest przekierowaniem.",
        "apihelp-query+fileusage-param-limit": "Ilość do zwrócenia.",
        "apihelp-query+imageinfo-description": "Zwraca informacje o pliku i historię przesyłania.",
        "apihelp-query+imageinfo-paramvalue-prop-canonicaltitle": "Dodaje kanoniczny tytuł pliku.",
        "apihelp-query+imageinfo-paramvalue-prop-mime": "Dodaje typ MIME pliku.",
        "apihelp-query+imageinfo-param-urlheight": "Podobne do $1urlwidth.",
        "apihelp-query+images-param-limit": "Liczba plików do zwrócenia.",
+       "apihelp-query+imageusage-example-simple": "Pokaż strony, które korzystają z [[:File:Albert Einstein Head.jpg]].",
        "apihelp-query+info-description": "Pokaż podstawowe informacje o stronie.",
        "apihelp-query+info-paramvalue-prop-watchers": "Liczba obserwujących, jeśli jest to dozwolone.",
        "apihelp-query+info-paramvalue-prop-readable": "Czy użytkownik może przeczytać tę stronę.",
        "apihelp-query+iwbacklinks-paramvalue-prop-iwprefix": "Dodaje prefiks interwiki.",
        "apihelp-query+iwbacklinks-paramvalue-prop-iwtitle": "Dodaje tytuł interwiki.",
        "apihelp-query+iwlinks-paramvalue-prop-url": "Dodaje pełny adres URL.",
+       "apihelp-query+iwlinks-param-limit": "Łączna liczba linków interwiki do zwrócenia.",
+       "apihelp-query+langbacklinks-param-limit": "Łączna liczba stron do zwrócenia.",
        "apihelp-query+langbacklinks-paramvalue-prop-lllang": "Dodaje kod języka linku językowego.",
        "apihelp-query+langbacklinks-paramvalue-prop-lltitle": "Dodaje tytuł linku językowego.",
        "apihelp-query+langlinks-paramvalue-prop-url": "Dodaje pełny adres URL.",
        "apihelp-query+links-param-limit": "Liczba linków do zwrócenia.",
        "apihelp-query+linkshere-description": "Znajdź wszystkie strony, które linkują do danych stron.",
        "apihelp-query+linkshere-paramvalue-prop-title": "Nazwa każdej strony.",
+       "apihelp-query+linkshere-paramvalue-prop-redirect": "Oznacz, jeśli strona jest przekierowaniem.",
        "apihelp-query+linkshere-param-limit": "Liczba do zwrócenia.",
        "apihelp-query+logevents-description": "Pobierz eventy z logu.",
        "apihelp-query+logevents-example-simple": "Lista ostatnich zarejestrowanych zdarzeń.",
        "apihelp-query+pageswithprop-param-prop": "Jakie informacje dołączyć:",
+       "apihelp-query+pageswithprop-paramvalue-prop-ids": "Doda ID strony.",
        "apihelp-query+pageswithprop-example-generator": "Pobierz dodatkowe informacje o pierwszych 10 stronach wykorzystując <code>_&#95;NOTOC_&#95;</code>.",
        "apihelp-query+prefixsearch-param-search": "Wyszukaj tekst.",
        "apihelp-query+prefixsearch-param-namespace": "Przestrzenie nazw do przeszukania.",
        "apihelp-query+protectedtitles-param-namespace": "Listuj tylko strony z tych przestrzeni nazw.",
        "apihelp-query+protectedtitles-param-limit": "Łączna liczba stron do zwrócenia.",
        "apihelp-query+protectedtitles-example-simple": "Lista chronionych nagłówków",
+       "apihelp-query+querypage-param-limit": "Liczba zwracanych wyników.",
+       "apihelp-query+random-param-namespace": "Zwraca strony tylko w tych przestrzeniach nazw.",
        "apihelp-query+recentchanges-param-user": "Listuj tylko zmiany dokonane przez tego użytkownika.",
        "apihelp-query+recentchanges-param-excludeuser": "Nie listuj zmian dokonanych przez tego użytkownika.",
        "apihelp-query+recentchanges-param-tag": "Pokazuj tylko zmiany oznaczone tym tagiem.",
        "apihelp-query+search-param-info": "Które metadane zwrócić.",
        "apihelp-query+search-paramvalue-prop-size": "Dodaje rozmiar strony w bajtach.",
        "apihelp-query+search-paramvalue-prop-wordcount": "Dodaje liczbę słów na stronie.",
+       "apihelp-query+search-paramvalue-prop-redirecttitle": "Dodaje tytuł pasującego przekierowania.",
        "apihelp-query+search-param-limit": "Łączna liczba stron do zwrócenia.",
        "apihelp-query+search-param-interwiki": "Dołączaj wyniki wyszukiwań interwiki w wyszukiwarce, jeśli możliwe.",
        "apihelp-query+search-example-simple": "Szukaj <kbd>meaning</kbd>.",
+       "apihelp-query+siteinfo-paramvalue-prop-general": "Ogólne informacje o systemie.",
        "apihelp-query+siteinfo-paramvalue-prop-namespaces": "Lista zarejestrowanych przestrzeni nazw i ich nazwy kanoniczne.",
        "apihelp-query+siteinfo-paramvalue-prop-namespacealiases": "Lista zarejestrowanych aliasów przestrzeni nazw.",
+       "apihelp-query+siteinfo-param-numberingroup": "Wyświetla liczbę użytkowników w grupach użytkowników.",
        "apihelp-query+siteinfo-example-simple": "Pobierz informacje o stronie.",
        "apihelp-query+stashimageinfo-param-sessionkey": "Alias dla $1filekey, dla kompatybilności wstecznej.",
        "apihelp-query+tags-description": "Lista zmian tagów.",
        "apihelp-query+tags-param-limit": "Maksymalna liczba tagów do wyświetlenia.",
        "apihelp-query+tags-paramvalue-prop-name": "Dodaje nazwę znacznika.",
+       "apihelp-query+tags-paramvalue-prop-displayname": "Dodaje komunikat systemowy dla znacznika.",
        "apihelp-query+tags-paramvalue-prop-description": "Dodaje opis znacznika.",
+       "apihelp-query+tags-paramvalue-prop-active": "Czy znacznik jest nadal stosowany.",
        "apihelp-query+tags-example-simple": "Lista dostęnych tagów.",
        "apihelp-query+templates-description": "Zwraca wszystkie strony osadzone w danych stronach.",
        "apihelp-query+templates-param-limit": "Ile szablonów zwrócić?",
+       "apihelp-query+transcludedin-paramvalue-prop-title": "Nazwa każdej strony.",
+       "apihelp-query+transcludedin-paramvalue-prop-redirect": "Oznacz, jeśli strona jest przekierowaniem.",
        "apihelp-query+transcludedin-param-limit": "Ile zwrócić.",
        "apihelp-query+userinfo-description": "Pobierz informacje o aktualnym użytkowniku.",
+       "apihelp-query+userinfo-param-prop": "Jakie informacje dołączyć:",
+       "apihelp-query+userinfo-paramvalue-prop-groups": "Wyświetla wszystkie grupy, do których należy bieżący użytkownik.",
+       "apihelp-query+userinfo-paramvalue-prop-rights": "Wyświetla wszystkie uprawnienia, które ma bieżący użytkownik.",
        "apihelp-query+userinfo-paramvalue-prop-registrationdate": "Dodaje datę rejestracji użytkownika.",
+       "apihelp-query+userinfo-example-simple": "Pobierz informacje o aktualnym użytkowniku.",
        "apihelp-query+userinfo-example-data": "Pobierz dodatkowe informacje o aktualnym użytkowniku.",
+       "apihelp-query+users-description": "Pobierz informacje o liście użytkowników.",
+       "apihelp-query+users-param-prop": "Jakie informacje dołączyć:",
+       "apihelp-query+users-paramvalue-prop-groups": "Wyświetla wszystkie grupy, do których należy każdy z użytkowników.",
+       "apihelp-query+users-paramvalue-prop-rights": "Wyświetla wszystkie uprawnienia, które ma każdy z użytkowników.",
+       "apihelp-query+users-param-users": "Lista użytkowników, o których chcesz pobrać informacje.",
        "apihelp-query+watchlist-param-excludeuser": "Nie wyświetlaj zmian wykonanych przez tego użytkownika.",
        "apihelp-query+watchlist-paramvalue-prop-title": "Dodaje tytuł strony.",
        "apihelp-query+watchlist-paramvalue-prop-user": "Dodaje użytkownika, który wykonał edycję.",
        "apihelp-unblock-param-reason": "Powód odblokowania.",
        "apihelp-undelete-param-reason": "Powód przywracania.",
        "apihelp-upload-param-filename": "Nazwa pliku docelowego.",
+       "apihelp-upload-param-watch": "Obserwuj stronę.",
+       "apihelp-upload-param-ignorewarnings": "Ignoruj wszystkie ostrzeżenia.",
+       "apihelp-upload-param-file": "Zawartość pliku.",
        "apihelp-userrights-param-user": "Nazwa użytkownika.",
        "apihelp-userrights-param-add": "Dodaj użytkownika do tych grup.",
        "apihelp-userrights-param-reason": "Powód zmiany.",
index 49a66d7..26cc5ec 100644 (file)
                        "Hamilton Abreu"
                ]
        },
-       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Documentação]]\n* [[mw:API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Lista de discussão]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Anúncios da API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Erros e solicitações]\n</div>\n<strong>Estado:</strong> Todas as funcionalidades mostradas nesta página deveriam estar a funcionar, mas a API ainda está em desenvolvimento ativo, e pode ser alterada a qualquer momento. Inscreva-se na [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ lista de discussão mediawiki-api-announce] para ser informado acerca das atualizações.\n\n<strong>Pedidos incorretos:</strong> Quando são enviados pedidos incorretos à API, um cabeçalho de HTTP será enviado com a chave \"MediaWiki-API-Error\" e, em seguida, tanto o valor do cabeçalho quanto o código de erro retornado serão definidos com o mesmo valor. Para mais informação, consulte [[mw:API:Errors_and_warnings|API: Errors and warnings]].\n\n<strong>Testes:</strong> Para facilitar os testes de pedidos à API, consulte [[Special:ApiSandbox]].",
-       "apihelp-main-param-action": "Qual acção a executar.",
-       "apihelp-main-param-format": "O formato de saída.",
-       "apihelp-main-param-origin": "Ao aceder à API usando um pedido AJAX entre domínios (CORS), coloque aqui o domínio de origem. Isto tem de ser incluído em todas as verificações prévias, e portanto tem de fazer parte do URI do pedido (e não do conteúdo do POST).\n\nPara pedidos autenticados, este valor tem de corresponder de forma exata a um dos cabeçalhos <code>Origin</code>, portanto tem de ser algo como <kbd>https://en.wikipedia.org</kbd> ou <kbd>https://meta.wikimedia.org</kbd>. Se este parâmetro não for igual ao cabeçalho <code>Origin</code>, será devolvida a resposta 403. Se este parâmetro for igual ao cabeçalho <code>Origin</code> e a origem for permitida (<i>white-listed</i>) os cabeçalhos <code>Access-Control-Allow-Origin</code> e <code>Access-Control-Allow-Credentials</code> serão preenchidos.\n\nPara pedidos não autenticados, especifique o valor <kbd>*</kbd>. Isto fará com que o cabeçalho <code>Access-Control-Allow-Origin</code>\nseja preenchido, mas <code>Access-Control-Allow-Credentials</code> terá o valor <code>false</code> e todos os dados específicos do utilizador serão restringidos.",
+       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Documentação]]\n* [[mw:API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Lista de discussão]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Anúncios da API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Erros e pedidos]\n</div>\n<strong>Estado:</strong> Todas as funcionalidades mostradas nesta página devem ter o comportamento documentado mas a API ainda está em desenvolvimento ativo e pode ser alterada a qualquer momento. Inscreva-se na [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ lista de discussão mediawiki-api-announce] para ser informado acerca das atualizações.\n\n<strong>Pedidos incorretos:</strong> Quando são enviados pedidos incorretos à API, será devolvido um cabeçalho HTTP com a chave \"MediaWiki-API-Error\" e depois tanto o valor desse cabeçalho como o código de erro devolvido serão definidos com o mesmo valor. Para mais informação, consulte [[mw:API:Errors_and_warnings|API:Erros e avisos]].\n\n<strong>Testes:</strong> Para testar facilmente pedidos à API, visite [[Special:ApiSandbox|Testes da API]].",
+       "apihelp-main-param-action": "A operação a ser realizada.",
+       "apihelp-main-param-format": "O formato do resultado.",
+       "apihelp-main-param-maxlag": "O atraso máximo pode ser usado quando o MediaWiki é instalado num <i>cluster</i> de bases de dados replicadas. Para impedir que as operações causem ainda mais atrasos de replicação do <i>site</i>, este parâmetro pode fazer o cliente aguardar até que o atraso de replicação seja inferior ao valor especificado. Caso o atraso atual exceda esse valor, o código de erro <samp>maxlag</samp> é devolvido com uma mensagem como <samp>À espera do servidor $host: $lag segundos de atraso</samp>.<br />Consulte [[mw:Manual:Maxlag_parameter|Manual: Parâmetro maxlag]] para mais informações.",
+       "apihelp-main-param-smaxage": "Definir no cabeçalho HTTP <code>s-maxage</code> de controlo da <i>cache</i> este número de segundos. Os erros nunca são armazenados na <i>cache</i>.",
+       "apihelp-main-param-maxage": "Definir no cabeçalho HTTP <code>max-age</code> de controlo da <i>cache</i> este número de segundos. Os erros nunca são armazenados na <i>cache</i>.",
+       "apihelp-main-param-assert": "Se definido com o valor <kbd>user</kbd>, verificar que o utilizador está autenticado. Se definido com o valor <kbd>bot</kbd>, verificar que o utilizador tem o privilégio de conta robô.",
+       "apihelp-main-param-assertuser": "Verificar que o utilizador atual é o utilizador nomeado.",
+       "apihelp-main-param-requestid": "Qualquer valor fornecido aqui será incluído na resposta. Pode ser usado para distinguir pedidos.",
+       "apihelp-main-param-servedby": "Incluir o nome do servidor que serviu o pedido nos resultados.",
+       "apihelp-main-param-curtimestamp": "Incluir a data e hora atuais no resultado.",
+       "apihelp-main-param-origin": "Ao aceder à API usando um pedido AJAX entre domínios (CORS), coloque aqui o domínio de origem. Isto tem de ser incluído em todas as verificações prévias e, portanto, tem de fazer parte do URI do pedido (e não do conteúdo do POST).\n\nPara pedidos autenticados, este valor tem de corresponder de forma exata a um dos cabeçalhos <code>Origin</code>, portanto tem de ser algo como <kbd>https://en.wikipedia.org</kbd> ou <kbd>https://meta.wikimedia.org</kbd>. Se este parâmetro não for igual ao cabeçalho <code>Origin</code>, será devolvida a resposta 403. Se este parâmetro for igual ao cabeçalho <code>Origin</code> e a origem for permitida (<i>white-listed</i>) os cabeçalhos <code>Access-Control-Allow-Origin</code> e <code>Access-Control-Allow-Credentials</code> serão preenchidos.\n\nPara pedidos não autenticados, especifique o valor <kbd>*</kbd>. Isto fará com que o cabeçalho <code>Access-Control-Allow-Origin</code>\nseja preenchido, mas <code>Access-Control-Allow-Credentials</code> terá o valor <code>false</code> e o acesso a todos os dados específicos do utilizador está restringido.",
+       "apihelp-main-param-uselang": "Língua a usar nas traduções de mensagens. <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> com <kbd>siprop=languages</kbd> devolve uma lista de códigos de língua, ou especifique <kbd>user</kbd> para usar a língua nas preferências do utilizador atual, ou especifique <kbd>content</kbd> para usar a língua de conteúdo desta wiki.",
        "apihelp-block-description": "Bloquear um utilizador.",
-       "apihelp-block-param-user": "Nome de utilizador(a), endereço ou gama de IP que pretende bloquear.",
-       "apihelp-block-param-reason": "Motivo do bloqueio.",
-       "apihelp-block-param-nocreate": "Impedir criação de contas.",
-       "apihelp-createaccount-description": "Criar uma nova conta.",
-       "apihelp-createaccount-param-name": "Nome de utilizador(a).",
+       "apihelp-block-param-user": "O nome de utilizador, endereço IP ou gama de endereços IP a serem bloqueados.",
+       "apihelp-block-param-expiry": "O período de expiração. Pode ser relativo (p. ex. <kbd>5 meses</kbd> ou <kbd>2 semanas</kbd>) ou absoluto (p. ex. <kbd>2014-09-18T12:34:56Z</kbd>). Se definido como <kbd>infinite</kbd>, <kbd>indefinite</kbd> ou <kbd>never</kbd>, o bloqueio nunca expirará.",
+       "apihelp-block-param-reason": "O motivo do bloqueio.",
+       "apihelp-block-param-anononly": "Bloquear só utilizadores anónimos (isto é, impedir edições anónimas a partir deste endereço IP)",
+       "apihelp-block-param-nocreate": "Impedir a criação de contas.",
+       "apihelp-block-param-autoblock": "Bloquear automaticamente o último endereço IP usado e quaisquer outros endereços IP subsequentes a partir do quais o utilizador tente iniciar uma sessão.",
+       "apihelp-block-param-noemail": "Impedir o utilizador de enviar correio eletrónico através da wiki. (Requer o privilégio <code>blockemail</code>).",
+       "apihelp-block-param-hidename": "Ocultar o nome do utilizador do registo de bloqueios. (Requer o privilégio <code>hideuser</code>).",
+       "apihelp-block-param-allowusertalk": "Permitir que o utilizador edite a sua própria página de discussão (depende de <var>[[mw:Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]</var>).",
+       "apihelp-block-param-reblock": "Se o utilizador já está bloqueado, sobrescrever o bloco existente.",
+       "apihelp-block-param-watchuser": "Vigiar as páginas de utilizador e de discussão, do utilizador ou do endereço IP.",
+       "apihelp-block-example-ip-simple": "Bloquear o endereço IP <kbd>192.0.2.5</kbd> por três dias com o motivo <kbd>First strike</kbd>.",
+       "apihelp-block-example-user-complex": "Bloquear o utilizador <kbd>Vandal</kbd> indefinidamente com o motivo <kbd>Vandalism</kbd>, e impedir a criação de nova conta e o envio de correio eletrónico.",
+       "apihelp-changeauthenticationdata-description": "Alterar os dados de autenticação do utilizador atual.",
+       "apihelp-changeauthenticationdata-example-password": "Tentar alterar a palavra-passe do utilizador atual para <kbd>ExamplePassword</kbd>.",
+       "apihelp-checktoken-description": "Verificar a validade de uma chave a partir de <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>.",
+       "apihelp-checktoken-param-type": "Tipo de chave que está a ser testado.",
+       "apihelp-checktoken-param-token": "Chave a testar.",
+       "apihelp-checktoken-param-maxtokenage": "Validade máxima da chave, em segundos.",
+       "apihelp-checktoken-example-simple": "Testar a validade de uma chave <kbd>csrf</kbd>.",
+       "apihelp-clearhasmsg-description": "Limpa a indicação <code>hasmsg</code> do utilizador atual.",
+       "apihelp-clearhasmsg-example-1": "Limpar a indicação <code>hasmsg</code> do utilizador atual.",
+       "apihelp-clientlogin-description": "Entrar na wiki usando o processo interativo.",
+       "apihelp-clientlogin-example-login": "Inicia o processo de entrada na wiki com o utilizador <kbd>Example</kbd> e a palavra-passe <kbd>ExamplePassword</kbd>.",
+       "apihelp-clientlogin-example-login2": "Continuar o processo de autenticação após uma resposta  <samp>UI</samp> para autenticação de dois fatores, fornecendo uma <var>OATHToken</var> de <kbd>987654</kbd>.",
+       "apihelp-compare-description": "Obter a diferença entre 2 páginas.\n\nTêm de ser passados um número de revisão, um título de página ou um identificador de página para o \"from\" e o \"to\".",
+       "apihelp-compare-param-fromtitle": "Primeiro título a comparar.",
+       "apihelp-compare-param-fromid": "Primeiro identificador de página a comparar.",
+       "apihelp-compare-param-fromrev": "Primeira revisão a comparar.",
+       "apihelp-compare-param-totitle": "Segundo título a comparar.",
+       "apihelp-compare-param-toid": "Segundo identificador de página a comparar.",
+       "apihelp-compare-param-torev": "Segunda revisão a comparar.",
+       "apihelp-compare-example-1": "Criar uma lista de diferenças entre as revisões 1 e 2.",
+       "apihelp-createaccount-description": "Criar uma conta nova.",
+       "apihelp-createaccount-param-preservestate": "Se <kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd> devolveu o valor verdadeiro para <samp>hasprimarypreservedstate</samp>, pedidos marcados como <samp>primary-required</samp> devem ser omitidos. Se devolveu um valor não vazio em <samp>preservedusername</samp>, esse nome de utilizador tem de ser usado no parâmetro <var>username</var>.",
+       "apihelp-createaccount-example-create": "Iniciar o processo de criação do utilizador <kbd>Example</kbd> com a palavra-passe <kbd>ExamplePassword</kbd>.",
+       "apihelp-createaccount-param-name": "Nome de utilizador.",
+       "apihelp-createaccount-param-password": "Palavra-passe (ignorada se <var>$1mailpassword</var> está definida).",
+       "apihelp-createaccount-param-domain": "Domínio para autenticação externa (opcional).",
+       "apihelp-createaccount-param-token": "Chave de criação da conta, obtida no primeiro pedido.",
        "apihelp-createaccount-param-email": "Endereço de correio eletrónico do utilizador (opcional).",
        "apihelp-createaccount-param-realname": "Nome verdadeiro do utilizador (opcional).",
+       "apihelp-createaccount-param-mailpassword": "Se qualquer valor estiver definido, uma palavra-passe aleatória será enviada por correio eletrónico ao utilizador.",
+       "apihelp-createaccount-param-reason": "Motivo opcional de criação da conta, para ser colocado nos registos.",
+       "apihelp-createaccount-param-language": "Código da língua a definir como padrão para o utilizador (opcional, por omissão é a língua de conteúdo).",
+       "apihelp-createaccount-example-pass": "Criar o utilizador <kbd>testuser</kbd> com a palavra-passe <kbd>test123</kbd>.",
+       "apihelp-createaccount-example-mail": "Criar o utilizador <kbd>testmailuser</kbd> e enviar por correio eletrónico uma palavra-passe gerada aleatoriamente.",
+       "apihelp-cspreport-description": "Usado por '' browsers'' para reportar violações da norma \"Content Security Policy\". Este módulo nunca deve ser usado, exceto quando utilizado automaticamente por um ''browser'' compatível com a CSP.",
+       "apihelp-cspreport-param-reportonly": "Marcar como sendo um relatório vindo de uma norma de monitorização e não de uma norma exigida.",
+       "apihelp-cspreport-param-source": "Aquilo que gerou o cabeçalho CSP que desencadeou este relatório.",
        "apihelp-delete-description": "Eliminar uma página.",
-       "apihelp-delete-param-watch": "Adicionar a página à lista de vigiadas do utilizador atual.",
-       "apihelp-delete-param-unwatch": "Remover a página da lista de vigiadas do utilizador atual.",
+       "apihelp-delete-param-title": "Título da página a eliminar. Não pode ser usado em conjunto com <var>$1pageid</var>.",
+       "apihelp-delete-param-pageid": "Identificador da página a eliminar. Não pode ser usado em conjunto com <var>$1title</var>.",
+       "apihelp-delete-param-reason": "Motivo para a eliminação. Se não for definido, será usado um motivo gerado automaticamente.",
+       "apihelp-delete-param-tags": "Etiquetas de modificação a aplicar à entrada no registo de eliminações.",
+       "apihelp-delete-param-watch": "Adicionar a página às páginas vigiadas do utilizador atual.",
+       "apihelp-delete-param-watchlist": "Adicionar ou remover incondicionalmente a página da lista de páginas vigiadas do utilizador atual, usar as preferências ou não alterar o estado de vigilância.",
+       "apihelp-delete-param-unwatch": "Remover a página das páginas vigiadas do utilizador atual.",
+       "apihelp-delete-param-oldimage": "O nome da imagem antiga a ser eliminada, tal como fornecido por [[Special:ApiHelp/query+imageinfo|action=query&prop=imageinfo&iiprop=archivename]].",
        "apihelp-delete-example-simple": "Eliminar <kbd>Main Page</kbd>.",
+       "apihelp-delete-example-reason": "Eliminar <kbd>Main Page</kbd> com o motivo <kbd>Preparing for move</kbd>.",
        "apihelp-disabled-description": "O módulo foi desativado.",
        "apihelp-edit-description": "Criar e editar páginas.",
-       "apihelp-edit-param-sectiontitle": "Título para uma nova seção.",
+       "apihelp-edit-param-title": "Título da página a ser editada. Não pode ser usado em conjunto com <var>$1pageid</var>.",
+       "apihelp-edit-param-pageid": "Identificador da página a ser editada. Não pode ser usado em conjunto com <var>$1title</var>.",
+       "apihelp-edit-param-section": "Número da secção. <kbd>0</kbd> para a secção de topo, <kbd>new</kbd> para uma secção nova.",
+       "apihelp-edit-param-sectiontitle": "Título para uma nova secção.",
        "apihelp-edit-param-text": "Conteúdo da página.",
+       "apihelp-edit-param-summary": "Resumo da edição. Também é o título da secção quando $1section=new e $1sectiontitle não está definido.",
+       "apihelp-edit-param-tags": "Etiquetas de modificação a aplicar à revisão.",
        "apihelp-edit-param-minor": "Edição menor.",
-       "apihelp-edit-param-bot": "Marcar esta edição como robô.",
-       "apihelp-edit-example-edit": "Editar uma página",
-       "apihelp-emailuser-description": "Enviar correio eletrónico a utilizador.",
+       "apihelp-edit-param-notminor": "Edição não menor.",
+       "apihelp-edit-param-bot": "Marcar esta edição como edição de robô.",
+       "apihelp-edit-param-basetimestamp": "Data e hora da revisão de base, usada para detetar conflitos de edição. Pode ser obtida usando [[Special:ApiHelp/query+revisions|action=query&prop=revisions&rvprop=timestamp]].",
+       "apihelp-edit-param-starttimestamp": "Data e hora de início do processo de edição, usada para detetar conflitos de edição. Pode-se obter um valor apropriado usando <var>[[Special:ApiHelp/main|curtimestamp]]</var> ao iniciar o processo de edição (por exemplo, ao carregar o conteúdo da página para edição).",
+       "apihelp-edit-param-recreate": "Ignorar todos os erros acerca da página ter sido eliminada entretanto.",
+       "apihelp-edit-param-createonly": "Não editar a página se ela já existe.",
+       "apihelp-edit-param-nocreate": "Gerar um erro se a página não existe.",
+       "apihelp-edit-param-watch": "Adicionar a página às páginas vigiadas do utilizador atual.",
+       "apihelp-edit-param-unwatch": "Remover a página da lista de páginas vigiadas do utilizador atual.",
+       "apihelp-edit-param-watchlist": "Adicionar ou remover incondicionalmente a página da lista de páginas vigiadas do utilizador atual, usar as preferências ou não alterar o estado de vigilância.",
+       "apihelp-edit-param-md5": "A chave MD5 do parâmetro $1text, ou os parâmetros $1prependtext e $1appendtext concatenados. Se estiver definido, a edição não será realizada a menos que a chave seja correta.",
+       "apihelp-edit-param-prependtext": "Adicionar este texto ao início da página. Substitui $1text.",
+       "apihelp-edit-param-appendtext": "Adicionar este texto ao fim da página. Substitui $1text.\n\nPara acrescentar uma nova secção no fim da página, usar $1section=new em vez deste parâmetro.",
+       "apihelp-edit-param-undo": "Desfazer esta revisão. Substitui $1text, $1prependtext e $1appendtext.",
+       "apihelp-edit-param-undoafter": "Desfazer todas as revisões desde $1undo até esta. Se não for definido, desfazer só uma revisão.",
+       "apihelp-edit-param-redirect": "Resolver automaticamente redirecionamentos.",
+       "apihelp-edit-param-contentformat": "Formato para seriação do conteúdo, usado para o texto de entrada.",
+       "apihelp-edit-param-contentmodel": "Modelo de conteúdo do novo conteúdo.",
+       "apihelp-edit-param-token": "A chave deve ser sempre enviada como último parâmetro, ou pelo menos após o parâmetro $1text.",
+       "apihelp-edit-example-edit": "Editar uma página.",
+       "apihelp-edit-example-prepend": "Acrescentar <kbd>_&#95;NOTOC_&#95;</kbd> ao início de uma página.",
+       "apihelp-edit-example-undo": "Desfazer desde a revisão 13579 até à 13585 com resumo automático.",
+       "apihelp-emailuser-description": "Enviar correio eletrónico a um utilizador.",
+       "apihelp-emailuser-param-target": "Utilizador a quem enviar correio eletrónico.",
        "apihelp-emailuser-param-subject": "Assunto.",
        "apihelp-emailuser-param-text": "Texto.",
-       "apihelp-emailuser-param-ccme": "Enviar-me uma cópia desta mensagem de correio eletrónico.",
-       "apihelp-expandtemplates-description": "Expande todas as predefinições em notação wiki.",
+       "apihelp-emailuser-param-ccme": "Enviar-me uma cópia desta mensagem.",
+       "apihelp-emailuser-example-email": "Enviar uma mensagem de correio ao utilizador <kbd>WikiSysop</kbd> com o texto <kbd>Content</kbd>.",
+       "apihelp-expandtemplates-description": "Expande todas as predefinições incluídas num texto em notação wiki.",
        "apihelp-expandtemplates-param-title": "Título da página.",
-       "apihelp-expandtemplates-example-simple": "Expandir a notação wiki <kbd><nowiki>{{Project:Sandbox}}</nowiki></kbd>.",
-       "apihelp-feedcontributions-param-feedformat": "O formato do feed.",
-       "apihelp-feedcontributions-param-deletedonly": "Mostrar apenas contribuições eliminadas.",
+       "apihelp-expandtemplates-param-text": "Texto em notação wiki a converter.",
+       "apihelp-expandtemplates-param-revid": "Identificador da revisão, para <nowiki>{{REVISIONID}}</nowiki> e variáveis semelhantes.",
+       "apihelp-expandtemplates-param-prop": "As informações que devem ser obtidas:\n\nNote que se não for selecionado nenhum valor, o resultado irá conter texto em notação wiki mas a saída estará num formato obsoleto.",
+       "apihelp-expandtemplates-paramvalue-prop-wikitext": "O texto em notação wiki expandido.",
+       "apihelp-expandtemplates-paramvalue-prop-categories": "Quaisquer categorias existentes na entrada que não estão representadas no texto em notação wiki de saída.",
+       "apihelp-expandtemplates-paramvalue-prop-properties": "Propriedades da página, definidas por palavras mágicas expandidas, no texto em notação wiki.",
+       "apihelp-expandtemplates-paramvalue-prop-volatile": "Indica se o resultado é volátil e não deve ser reutilizado noutra parte da página.",
+       "apihelp-expandtemplates-paramvalue-prop-ttl": "O período máximo a partir do qual os armazenamentos do resultado na <i>cache</i> devem ser invalidados.",
+       "apihelp-expandtemplates-paramvalue-prop-modules": "Quaisquer módulos ResourceLoader que as funções do analisador sintático solicitaram que fossem adicionados ao resultado de saída. Um dos valores <kbd>jsconfigvars</kbd> ou <kbd>encodedjsconfigvars</kbd> tem de ser solicitado em conjunto com o valor <kbd>modules</kbd>.",
+       "apihelp-expandtemplates-paramvalue-prop-jsconfigvars": "Devolve as variáveis de configuração JavaScript específicas desta página.",
+       "apihelp-expandtemplates-paramvalue-prop-encodedjsconfigvars": "Devolve as variáveis de configuração JavaScript específicas da página, no formato de uma ''string'' JSON.",
+       "apihelp-expandtemplates-paramvalue-prop-parsetree": "A árvore de análise sintática em XML do texto de entrada.",
+       "apihelp-expandtemplates-param-includecomments": "Indica se devem ser incluídos comentários HTML no resultado.",
+       "apihelp-expandtemplates-param-generatexml": "Gerar a árvore de análise sintática em XML (substituído por $1prop=parsetree).",
+       "apihelp-expandtemplates-example-simple": "Expandir o texto em notação wiki <kbd><nowiki>{{Project:Sandbox}}</nowiki></kbd>.",
+       "apihelp-feedcontributions-description": "Devolve um ''feed'' das contribuições do utilizador.",
+       "apihelp-feedcontributions-param-feedformat": "O formato do ''feed''.",
+       "apihelp-feedcontributions-param-user": "Os utilizadores dos quais serão obtidas as contribuições.",
+       "apihelp-feedcontributions-param-namespace": "O espaço nominal pelo qual as contribuições serão filtradas.",
+       "apihelp-feedcontributions-param-year": "Desde o ano.",
+       "apihelp-feedcontributions-param-month": "Desde o mês.",
+       "apihelp-feedcontributions-param-tagfilter": "Filtrar as contribuições que têm estas etiquetas.",
+       "apihelp-feedcontributions-param-deletedonly": "Mostrar apenas as contribuições eliminadas.",
        "apihelp-feedcontributions-param-toponly": "Mostrar apenas as edições mais recentes.",
+       "apihelp-feedcontributions-param-newonly": "Mostrar apenas as edições que são criações de páginas.",
        "apihelp-feedcontributions-param-hideminor": "Ocultar edições menores.",
        "apihelp-feedcontributions-param-showsizediff": "Mostrar diferença de tamanho entre edições.",
-       "apihelp-feedrecentchanges-param-feedformat": "O formato do feed.",
-       "apihelp-feedrecentchanges-param-limit": "Número máximo de resultados a apresentar.",
+       "apihelp-feedcontributions-example-simple": "Devolver as contribuições do utilizador <kbd>Example</kbd>.",
+       "apihelp-feedrecentchanges-description": "Devolve um ''feed'' das mudanças recentes.",
+       "apihelp-feedrecentchanges-param-feedformat": "O formato do ''feed''.",
+       "apihelp-feedrecentchanges-param-namespace": "O espaço nominal ao qual os resultados serão limitados.",
+       "apihelp-feedrecentchanges-param-invert": "Todos os espaços nominais exceto o selecionado.",
+       "apihelp-feedrecentchanges-param-associated": "Incluir o espaço nominal associado (de discussão ou principal).",
+       "apihelp-feedrecentchanges-param-days": "Dias aos quais limitar os resultados.",
+       "apihelp-feedrecentchanges-param-limit": "O número máximo de resultados a serem devolvidos.",
        "apihelp-feedrecentchanges-param-from": "Mostrar alterações desde então.",
        "apihelp-feedrecentchanges-param-hideminor": "Ocultar edições menores.",
-       "apihelp-feedrecentchanges-param-hidebots": "Ocultar alterações feitas por robôs.",
-       "apihelp-feedrecentchanges-param-hidepatrolled": "Ocultar alterações patrulhadas.",
-       "apihelp-feedrecentchanges-param-hidemyself": "Ocultar alterações feitas pelo utilizador atual.",
+       "apihelp-feedrecentchanges-param-hidebots": "Ocultar mudanças feitas por robôs.",
+       "apihelp-feedrecentchanges-param-hideanons": "Ocultar mudanças feitas por utilizadores anónimos.",
+       "apihelp-feedrecentchanges-param-hideliu": "Ocultar mudanças feitas por utilizadores registados.",
+       "apihelp-feedrecentchanges-param-hidepatrolled": "Ocultar mudanças patrulhadas.",
+       "apihelp-feedrecentchanges-param-hidemyself": "Ocultar mudanças feitas pelo utilizador atual.",
+       "apihelp-feedrecentchanges-param-hidecategorization": "Ocultar mudanças de pertença a categorias.",
+       "apihelp-feedrecentchanges-param-tagfilter": "Filtrar por etiqueta.",
        "apihelp-feedrecentchanges-param-target": "Mostrar apenas mudanças em páginas afluentes a esta.",
-       "apihelp-feedrecentchanges-example-simple": "Mostrar mudanças recentes",
-       "apihelp-help-example-main": "Ajuda para o módulo principal",
-       "apihelp-help-example-recursive": "Toda a ajuda numa página",
-       "apihelp-login-param-name": "Nome de utilizador(a).",
+       "apihelp-feedrecentchanges-param-showlinkedto": "Mostrar mudanças em páginas com ligações para a página selecionada.",
+       "apihelp-feedrecentchanges-param-categories": "Mostrar apenas mudanças nas páginas que estão em todas estas categorias.",
+       "apihelp-feedrecentchanges-param-categories_any": "Mostrar mudanças nas páginas que estão em qualquer uma destas categorias.",
+       "apihelp-feedrecentchanges-example-simple": "Mostrar mudanças recentes.",
+       "apihelp-feedrecentchanges-example-30days": "Mostrar as mudanças recentes de 30 dias.",
+       "apihelp-feedwatchlist-description": "Devolve um ''feed'' das páginas vigiadas.",
+       "apihelp-feedwatchlist-param-feedformat": "O formato do ''feed''.",
+       "apihelp-feedwatchlist-param-hours": "Mostrar as mudanças recentes desde há este número de horas.",
+       "apihelp-feedwatchlist-param-linktosections": "Ligar diretamente às secções alteradas, se possível.",
+       "apihelp-feedwatchlist-example-default": "Mostrar o ''feed'' das páginas vigiadas.",
+       "apihelp-feedwatchlist-example-all6hrs": "Mostrar todas as mudanças às páginas vigiadas nas últimas 6 horas.",
+       "apihelp-filerevert-description": "Reverter um ficheiro para uma versão antiga.",
+       "apihelp-filerevert-param-filename": "Nome do ficheiro de destino, sem o prefixo File:.",
+       "apihelp-filerevert-param-comment": "Comentário do carregamento.",
+       "apihelp-filerevert-param-archivename": "Nome de arquivo da revisão para a qual o ficheiro será revertido.",
+       "apihelp-filerevert-example-revert": "Reverter <kbd>Wiki.png</kbd> para a revisão de <kbd>2011-03-05T15:27:40Z</kbd>.",
+       "apihelp-help-description": "Apresentar ajuda para os módulos especificados.",
+       "apihelp-help-param-modules": "Módulos para os quais apresentar ajuda (valores dos parâmetros <var>action</var> e <var>format</var>, ou <kbd>main</kbd>). Pode-se especificar submódulos com um <kbd>+</kbd>.",
+       "apihelp-help-param-submodules": "Incluir ajuda para submódulos do módulo nomeado.",
+       "apihelp-help-param-recursivesubmodules": "Incluir ajuda para os submódulos de forma recursiva.",
+       "apihelp-help-param-helpformat": "Formato de saída da ajuda.",
+       "apihelp-help-param-wrap": "Envolver a saída numa estrutura padrão de resposta da API.",
+       "apihelp-help-param-toc": "Incluir uma tabela de conteúdo na saída HTML.",
+       "apihelp-help-example-main": "Ajuda para o módulo principal.",
+       "apihelp-help-example-submodules": "Ajuda para <kbd>action=query</kbd> e todos os respetivos submódulos.",
+       "apihelp-help-example-recursive": "Toda a ajuda numa página.",
+       "apihelp-help-example-help": "Ajuda para o próprio módulo de ajuda.",
+       "apihelp-help-example-query": "Ajuda para dois submódulos de consulta.",
+       "apihelp-imagerotate-description": "Rodar uma ou mais imagens.",
+       "apihelp-imagerotate-param-rotation": "Graus de rotação da imagem no sentido horário.",
+       "apihelp-imagerotate-example-simple": "Rodar <kbd>File:Example.png</kbd> <kbd>90</kbd> graus.",
+       "apihelp-imagerotate-example-generator": "Rodar todas as imagens na categoria <kbd>Category:Flip</kbd> em <kbd>180</kbd> graus.",
+       "apihelp-import-description": "Importar uma página de outra wiki ou de um ficheiro XML.\n\nNote que o POST do HTTP tem de ser feito como um carregamento de ficheiro (isto é, com multipart/form-data como Content-Type) ao enviar um ficheiro para o parâmetro <var>xml</var>.",
+       "apihelp-import-param-summary": "Resumo da importação para a entrada do registo.",
+       "apihelp-import-param-xml": "Ficheiro XML carregado.",
+       "apihelp-import-param-interwikisource": "Para importações interwikis: a wiki de onde importar.",
+       "apihelp-import-param-interwikipage": "Para importações interwikis: a página a importar.",
+       "apihelp-import-param-fullhistory": "Para importações interwikis: importar o historial completo, não apenas a versão atual.",
+       "apihelp-import-param-templates": "Para importações interwikis: importar também todas as predefinições incluídas.",
+       "apihelp-import-param-namespace": "Importar para este espaço nominal. Não pode ser usado em conjunto com <var>$1rootpage</var>.",
+       "apihelp-import-param-rootpage": "Importar como subpágina desta página. Não pode ser usado em conjunto com <var>$1namespace</var>.",
+       "apihelp-import-example-import": "Importar [[meta:Help:ParserFunctions]] para o espaço nominal 100 com o historial completo.",
+       "apihelp-linkaccount-description": "Ligar uma conta de um fornecedor terceiro ao utilizador atual.",
+       "apihelp-linkaccount-example-link": "Iniciar o processo de ligação a uma conta do fornecedor <kbd>Example</kbd>.",
+       "apihelp-login-description": "Entrar e obter <i>cookies</i> de autenticação.\n\nEsta operação só deve ser usada em combinação com [[Special:BotPasswords]]; a sua utilização para entrar com a conta principal é obsoleta e poderá falhar sem aviso. Para entrar com a conta principal de forma segura, use <kbd>[[Special:ApiHelp/clientlogin|action=clientlogin]]</kbd>.",
+       "apihelp-login-description-nobotpasswords": "Entrar e obter <i>cookies</i> de autenticação.\n\nEsta operação é obsoleta e poderá falhar sem aviso. Para entrar de forma segura, use <kbd>[[Special:ApiHelp/clientlogin|action=clientlogin]]</kbd>.",
+       "apihelp-login-param-name": "Nome de utilizador.",
        "apihelp-login-param-password": "Palavra-passe.",
        "apihelp-login-param-domain": "Domínio (opcional).",
-       "apihelp-login-example-login": "Entrar",
-       "apihelp-logout-description": "Terminar e limpar dados de sessão.",
-       "apihelp-managetags-description": "Executar tarefas de gestão relacionadas com alteração de etiquetas.",
+       "apihelp-login-param-token": "Chave de início de sessão obtida no primeiro pedido.",
+       "apihelp-login-example-gettoken": "Obter uma chave de início de sessão.",
+       "apihelp-login-example-login": "Entrar.",
+       "apihelp-logout-description": "Terminar a sessão e limpar os dados da sessão.",
+       "apihelp-logout-example-logout": "Terminar a sessão do utilizador atual.",
+       "apihelp-managetags-description": "Executar tarefas de gestão relacionadas com a alteração de etiquetas.",
+       "apihelp-managetags-param-operation": "A operação que será realizada:\n;create:Criar uma nova etiqueta de modificação para uso manual.\n;delete:Remover da base de dados uma etiqueta de modificação, incluindo remover a etiqueta de todas as revisões, entradas nas mudanças recentes e entradas do registo onde ela é utilizada.\n;activate:Ativar uma etiqueta de modificação, permitindo que os utilizadores a apliquem manualmente.\n;deactivate:Desativar uma etiqueta de modificação, impedindo que os utilizadores a apliquem manualmente.",
+       "apihelp-managetags-param-tag": "Etiqueta a ser criada, eliminada, ativada ou desativada. Para criar uma etiqueta ela não pode existir. Para eliminar uma etiqueta, ela tem de existir. Para ativar uma etiqueta, ela tem de existir e não estar a ser utilizada por nenhuma extensão. Para desativar uma etiqueta, ela tem de estar ativa e definida manualmente.",
        "apihelp-managetags-param-reason": "Um motivo, opcional, para a criação, eliminação, ativação ou desativação da etiqueta.",
+       "apihelp-managetags-param-ignorewarnings": "Indica se devem ser ignorados todos os avisos gerados durante a operação.",
+       "apihelp-managetags-example-create": "Criar uma etiqueta com o nome <kbd>spam</kbd> e o motivo <kbd>For use in edit patrolling</kbd>",
+       "apihelp-managetags-example-delete": "Eliminar a etiqueta <kbd>vandlaism</kbd> com o motivo <kbd>Misspelt</kbd>",
+       "apihelp-managetags-example-activate": "Ativar uma etiqueta com o nome <kbd>spam</kbd> e o motivo <kbd>For use in edit patrolling</kbd>",
+       "apihelp-managetags-example-deactivate": "Desativar uma etiqueta com o nome <kbd>spam</kbd> e o motivo <kbd>No longer required</kbd>",
+       "apihelp-mergehistory-description": "Fundir o historial de páginas.",
+       "apihelp-mergehistory-param-from": "Título da página cujo historial será fundido. Não pode ser usado em conjunto com <var>$1fromid</var>.",
+       "apihelp-mergehistory-param-fromid": "Identificador da página cujo historial será fundido. Não pode ser usado em conjunto com <var>$1from</var>.",
+       "apihelp-mergehistory-param-to": "Título da página à qual o historial será fundido. Não pode ser usado em conjunto com <var>$1toid</var>.",
+       "apihelp-mergehistory-param-toid": "Identificador da página à qual o historial será fundido. Não pode ser usado em conjunto com <var>$1to</var>.",
+       "apihelp-mergehistory-param-timestamp": "Data e hora até a qual as revisões serão movidas do historial da página de origem para o historial das páginas de destino. Se omitido, todo o historial da página de origem será fundido com a página de destino.",
+       "apihelp-mergehistory-param-reason": "Motivo para fundir o historial.",
+       "apihelp-mergehistory-example-merge": "Fundir todo o historial da página <kbd>Oldpage</kbd> com o da página <kbd>Newpage</kbd>.",
+       "apihelp-mergehistory-example-merge-timestamp": "Fundir as revisões de <kbd>Oldpage</kbd> até à data e hora <kbd>2015-12-31T04:37:41Z</kbd> com <kbd>Newpage</kbd>.",
        "apihelp-move-description": "Mover uma página.",
+       "apihelp-move-param-from": "Título da página cujo nome será alterado. Não pode ser usado em conjunto com <var>$1fromid</var>.",
+       "apihelp-move-param-fromid": "Identificador da página cujo nome será alterado. Não pode ser usado em conjunto com <var>$1from</var>.",
+       "apihelp-move-param-to": "Novo título da página.",
+       "apihelp-move-param-reason": "Motivo para a alteração do nome.",
+       "apihelp-move-param-movetalk": "Alterar o nome da página de discussão, se esta existir.",
+       "apihelp-move-param-movesubpages": "Alterar o nome das subpáginas, se estas existirem.",
        "apihelp-move-param-noredirect": "Não criar um redirecionamento.",
+       "apihelp-move-param-watch": "Adicionar a página e o redirecionamento às páginas vigiadas do utilizador atual.",
+       "apihelp-move-param-unwatch": "Remover a página e o redirecionamento das páginas vigiadas do utilizador atual.",
+       "apihelp-move-param-watchlist": "Adicionar ou remover incondicionalmente a página da lista de páginas vigiadas do utilizador atual, usar as preferências ou não alterar o estado de vigilância.",
        "apihelp-move-param-ignorewarnings": "Ignorar quaisquer avisos.",
-       "apihelp-opensearch-param-limit": "Número máximo de resultados a apresentar.",
-       "apihelp-options-param-reset": "Reiniciar preferências para os padrões do sítio.",
-       "apihelp-options-example-reset": "Reiniciar todas as preferências",
-       "apihelp-parse-param-section": "Apenas analisar o conteúdo desta secção.\n\nQuando <kbd>nova</kbd>, analise <var>$1text</var> e <var>$1sectiontitle</var> como se fosse adicionar uma nova secção da página.\n\n<kbd>novo</kbd> só é permitido quando especifica <var>text</var>.",
-       "apihelp-patrol-description": "Patrulhar uma página ou edição.",
-       "apihelp-patrol-example-rcid": "Patrulhar uma mudança recente",
-       "apihelp-patrol-example-revid": "Patrulhar uma edição",
-       "apihelp-protect-example-protect": "Proteger uma página",
+       "apihelp-move-example-move": "Mover <kbd>Badtitle</kbd> para <kbd>Goodtitle</kbd> sem deixar um redirecionamento.",
+       "apihelp-opensearch-description": "Pesquisar a wiki usando o protocolo OpenSearch.",
+       "apihelp-opensearch-param-search": "Texto a pesquisar.",
+       "apihelp-opensearch-param-limit": "O número máximo de resultados a serem devolvidos.",
+       "apihelp-opensearch-param-namespace": "Espaços nominais a pesquisar.",
+       "apihelp-opensearch-param-suggest": "Não fazer nada se <var>[[mw:Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]]</var> for falso.",
+       "apihelp-opensearch-param-redirects": "Como tratar redirecionamentos:\n;return:Devolver o próprio redirecionamento.\n;resolve:Devolver a página de destino. Pode devolver menos de $1limit resultados.\nPor razões históricas, o valor por omissão é \"return\" para o formato $1format=json e \"resolve\" para outros formatos.",
+       "apihelp-opensearch-param-format": "O formato do resultado.",
+       "apihelp-opensearch-param-warningsaserror": "Se forem gerados avisos com <kbd>format=json</kbd>, devolver um erro da API em vez de ignorá-los.",
+       "apihelp-opensearch-example-te": "Encontrar as páginas que começam por <kbd>Te</kbd>.",
+       "apihelp-options-description": "Alterar as preferências do utilizador atual.\n\nSó podem ser definidas as opções que estão registadas no núcleo do MediaWiki ou numa das extensões instaladas, ou opções cuja chave tem o prefixo <code>userjs-</code> (que são supostas ser usadas por ''scripts'' de utilizador).",
+       "apihelp-options-param-reset": "Reiniciar preferências para os valores por omissão do site.",
+       "apihelp-options-param-resetkinds": "Lista dos tipos de opções a reiniciar quando a opção <var>$1reset</var> está definida.",
+       "apihelp-options-param-change": "Listas das alterações, na forma nome=valor (isto é, skin=vector). Se não for fornecido nenhum valor (nem sequer um sinal de igualdade), por exemplo, nomedaopção|outraopção|..., a opção será reiniciada para o seu valor por omissão. Se qualquer dos valores passados contém uma barra vertical (<kbd>|</kbd>), use um [[Special:ApiHelp/main#main/datatypes|separador alternativo para valores múltiplos]] de forma a obter o comportamento correto.",
+       "apihelp-options-param-optionname": "O nome da opção que deve ser configurada com o valor dado por <var>$1optionvalue</var>.",
+       "apihelp-options-param-optionvalue": "O valor para a opção especificada por <var>$1optionname</var>.",
+       "apihelp-options-example-reset": "Reiniciar todas as preferências.",
+       "apihelp-options-example-change": "Alterar as preferências <kbd>skin</kbd> e <kbd>hideminor</kbd>.",
+       "apihelp-options-example-complex": "Reiniciar todas as preferências e depois definir <kbd>skin</kbd> e <kbd>nickname</kbd>.",
+       "apihelp-paraminfo-description": "Obter informação sobre os módulos da API.",
+       "apihelp-paraminfo-param-modules": "Lista dos nomes dos módulos (valores dos parâmetros <var>action</var> e <var>format</var>, ou <kbd>main</kbd>). Podem ser especificados submódulos com <kbd>+</kbd>, ou todos os submódulos com <kbd>+*</kbd>, ou todos os submódulos de forma recursiva com <kbd>+**</kbd>.",
+       "apihelp-paraminfo-param-helpformat": "Formato dos textos de ajuda.",
+       "apihelp-paraminfo-param-querymodules": "Lista de nomes dos módulos a consultar (valores dos parâmetros <var>prop</var>, <var>meta</var> ou <var>list</var>). Usar <kbd>$1modules=query+foo</kbd> em vez de <kbd>$1querymodules=foo</kbd>.",
+       "apihelp-paraminfo-param-mainmodule": "Obter também informação sobre o módulo principal (do nível de topo). Em vez de usá-lo, usar <kbd>$1modules=main</kbd>.",
+       "apihelp-paraminfo-param-pagesetmodule": "Obter também informação sobre o módulo pageset (fornecendo titles= e restantes).",
+       "apihelp-paraminfo-param-formatmodules": "Lista de nomes de módulos de formato (valor do parâmetro <var>format</var>). Em vez de usá-lo, use <var>$1modules</var>.",
+       "apihelp-paraminfo-example-1": "Mostrar informação para <kbd>[[Special:ApiHelp/parse|action=parse]]</kbd>, <kbd>[[Special:ApiHelp/jsonfm|format=jsonfm]]</kbd>, <kbd>[[Special:ApiHelp/query+allpages|action=query&list=allpages]]</kbd> e <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd>.",
+       "apihelp-paraminfo-example-2": "Mostrar informação de todos os módulos de <kbd>[[Special:ApiHelp/query|action=query]]</kbd>.",
+       "apihelp-parse-description": "Faz a análise sintática do conteúdo e devolve o resultado da análise.\n\nConsulte os vários módulos disponíveis no parâmetro prop de <kbd>[[Special:ApiHelp/query|action=query]]</kbd> para obter informação da versão atual de uma página.\n\nHá várias formas de especificar o texto a analisar:\n# Especificar uma página ou revisão, usando <var>$1page</var>, <var>$1pageid</var> ou <var>$1oldid</var>.\n# Especificar o conteúdo de forma explícita, usando <var>$1text</var>, <var>$1title</var> e <var>$1contentmodel</var>.\n# Especificar só um resumo a analisar. <var>$1prop</var> deve receber o valor vazio.",
+       "apihelp-parse-param-title": "Título da página à qual o texto pertence. Se omitido, é preciso especificar <var>$1contentmodel</var> e deve usar [[API]] como título.",
+       "apihelp-parse-param-text": "Texto a analisar. Usar <var>$1title</var> ou <var>$1contentmodel</var> para controlar o modelo de conteúdo.",
+       "apihelp-parse-param-summary": "Resumo a analisar.",
+       "apihelp-parse-param-page": "Analisar o conteúdo desta página. Não pode ser usado em conjunto com <var>$1text</var> e <var>$1title</var>.",
+       "apihelp-parse-param-pageid": "Analisar o conteúdo desta página. Substitui <var>$1page</var>.",
+       "apihelp-parse-param-redirects": "Se <var>$1page</var> ou <var>$1pageid</var> estiverem definidos para um redirecionamento, resolvê-lo.",
+       "apihelp-parse-param-oldid": "Analisar o conteúdo desta revisão. Substitui <var>$1page</var> e <var>$1pageid</var>.",
+       "apihelp-parse-param-prop": "As informações que devem ser obtidas:",
+       "apihelp-parse-paramvalue-prop-text": "Fornece o texto analisado, de um texto com notação wiki.",
+       "apihelp-parse-paramvalue-prop-langlinks": "Fornece os links interlínguas do texto analisado.",
+       "apihelp-parse-paramvalue-prop-categories": "Fornece as categorias do texto analisado.",
+       "apihelp-parse-paramvalue-prop-categorieshtml": "Fornece a versão HTML das categorias.",
+       "apihelp-parse-paramvalue-prop-links": "Fornece os links internos do texto analisado.",
+       "apihelp-parse-paramvalue-prop-templates": "Fornece as predefinições do texto analisado.",
+       "apihelp-parse-paramvalue-prop-images": "Fornece as imagens do texto analisado.",
+       "apihelp-parse-paramvalue-prop-externallinks": "Fornece os links externos do texto analisado.",
+       "apihelp-parse-paramvalue-prop-sections": "Fornece as secções do texto analisado.",
+       "apihelp-parse-paramvalue-prop-revid": "Adiciona o identificador de revisão da página analisada.",
+       "apihelp-parse-paramvalue-prop-displaytitle": "Adiciona o título do texto analisado.",
+       "apihelp-parse-paramvalue-prop-headitems": "<span class=\"apihelp-deprecated\">Obsoleto.</span> Fornece os elementos a colocar no <code>&lt;head&gt;</code> da página.",
+       "apihelp-parse-paramvalue-prop-headhtml": "Fornece o <code>&lt;head&gt;</code> analisado da página.",
+       "apihelp-parse-paramvalue-prop-modules": "Fornece os módulos ResourceLoader usados na página. Para carregá-los, usar <code>mw.loader.using()</code>. Uma das variáveis <kbd>jsconfigvars</kbd> ou <kbd>encodedjsconfigvars</kbd> tem de ser pedida em conjunto com <kbd>modules</kbd>.",
+       "apihelp-parse-paramvalue-prop-jsconfigvars": "Fornece as variáveis de configuração JavaScript específicas da página. Para aplicá-las, usar <code>mw.config.set()</code>.",
+       "apihelp-parse-paramvalue-prop-encodedjsconfigvars": "Fornece as variáveis de configuração JavaScript específicas da página, no formato de uma ''string'' JSON.",
+       "apihelp-parse-paramvalue-prop-indicators": "Fornece o HTML dos indicadores de estado de página que são usados na página.",
+       "apihelp-parse-paramvalue-prop-iwlinks": "Fornece os links interwikis do texto analisado.",
+       "apihelp-parse-paramvalue-prop-wikitext": "Fornece o texto original com notação wiki que foi analisado.",
+       "apihelp-parse-paramvalue-prop-properties": "Fornece várias propriedades definidas no texto analisado.",
+       "apihelp-parse-paramvalue-prop-limitreportdata": "Fornece o relatório de limites de forma estruturada. Não fornece dados quando <var>$1disablelimitreport</var> está definido.",
+       "apihelp-parse-paramvalue-prop-limitreporthtml": "Fornece a versão HTML do relatório de limites. Não fornece dados quando <var>$1disablelimitreport</var> está definido.",
+       "apihelp-parse-paramvalue-prop-parsetree": "A árvore de análise XML do conteúdo da revisão (requer o modelo de conteúdo <code>$1</code>).",
+       "apihelp-parse-param-pst": "Fazer uma transformação anterior à gravação, do texto de entrada, antes de analisá-lo. Só é válido quando usado com texto.",
+       "apihelp-parse-param-onlypst": "Fazer uma transformação anterior à gravação (PST, ''pre-save transform'') do texto de entrada, mas não o analisar. Devolve o mesmo texto após aplicação da PST. Só é válido quando usado com <var>$1text</var>.",
+       "apihelp-parse-param-effectivelanglinks": "Inclui links interlínguas fornecidos por extensões (para ser usado com <kbd>$1prop=langlinks</kbd>).",
+       "apihelp-parse-param-section": "Analisar apenas o conteúdo desta secção.\n\nQuando tiver o valor <kbd>new</kbd>, analisar <var>$1text</var> e <var>$1sectiontitle</var> como se fosse adicionar uma nova secção à página.\n\n<kbd>new</kbd> só é permitido quando se especifica <var>text</var>.",
+       "apihelp-parse-param-sectiontitle": "O novo título da secção quando <var>section</var> tem o valor <kbd>new</kbd>.\n\nAo contrário da edição de páginas, este não toma o valor de <var>summary</var> se for omitido ou estiver vazio.",
+       "apihelp-parse-param-disablelimitreport": "Omitir o relatório de limites (\"NewPP limit report\") do resultado de saída do analisador sintático.",
+       "apihelp-parse-param-disablepp": "Em vez deste, usar <var>$1disablelimitreport</var>.",
+       "apihelp-parse-param-disableeditsection": "Omitir links para edição da secção no resultado da análise sintática.",
+       "apihelp-parse-param-disabletidy": "Não fazer a limpeza do HTML (isto é, o ''tidy'') no resultado da análise sintática.",
+       "apihelp-parse-param-generatexml": "Gerar a árvore de análise XML (requer o modelo de conteúdo <code>$1</code>; substituído por <kbd>$2prop=parsetree</kbd>).",
+       "apihelp-parse-param-preview": "Executar a análise em modo de antevisão.",
+       "apihelp-parse-param-sectionpreview": "Executar a análise em modo de antevisão (também ativa o modo de antevisão).",
+       "apihelp-parse-param-disabletoc": "Omitir a tabela de conteúdo no resultado.",
+       "apihelp-parse-param-contentformat": "O formato da seriação de conteúdo, usado para o texto de entrada. Só é válido quando usado com $1text.",
+       "apihelp-parse-param-contentmodel": "Modelo de conteúdo do texto de entrada. Se omitido, $1title tem de ser especificado e o valor por omissão será o modelo do título especificado. Só é válido quando usado com $1text.",
+       "apihelp-parse-example-page": "Fazer a análise sintática de uma página.",
+       "apihelp-parse-example-text": "Fazer a análise sintática do texto com notação wiki.",
+       "apihelp-parse-example-texttitle": "Fazer a análise sintática do texto com notação wiki, especificando o título da página.",
+       "apihelp-parse-example-summary": "Fazer a análise sintática de um resumo.",
+       "apihelp-patrol-description": "Patrulhar uma página ou revisão.",
+       "apihelp-patrol-param-rcid": "Identificador da mudança recente a patrulhar.",
+       "apihelp-patrol-param-revid": "Identificador da revisão a patrulhar.",
+       "apihelp-patrol-param-tags": "Etiquetas de modificação a aplicar à entrada do registo de patrulha.",
+       "apihelp-patrol-example-rcid": "Patrulhar uma mudança recente.",
+       "apihelp-patrol-example-revid": "Patrulhar uma revisão.",
+       "apihelp-protect-description": "Alterar o nível de proteção de uma página.",
+       "apihelp-protect-param-title": "Título da página a proteger ou desproteger. Não pode ser usado em conjunto com $1pageid.",
+       "apihelp-protect-param-pageid": "Identificador da página a proteger ou desproteger. Não pode ser usado em conjunto com $1title.",
+       "apihelp-protect-param-protections": "Lista de níveis de proteção, na forma <kbd>action=level</kbd> (por exemplo, <kbd>edit=sysop</kbd>). O nível <kbd>all</kbd> significada que todos podem executar a operação, isto é, sem restrição.\n\n<strong>Nota:</strong> Serão removidas as restrições de quaisquer operações não listadas.",
+       "apihelp-protect-param-expiry": "Datas e horas de expiração. Se só uma data e hora for definida, será usada para todas as proteções. Use <kbd>infinite</kbd>, <kbd>indefinite</kbd>, <kbd>infinity</kbd> ou <kbd>never</kbd>, para proteção sem expiração.",
+       "apihelp-protect-param-reason": "Motivo da proteção ou desproteção.",
+       "apihelp-protect-param-tags": "Etiquetas de modificação a aplicar à entrada no registo de proteções.",
+       "apihelp-protect-param-cascade": "Ativar a proteção em cascata (isto é, proteger as predefinições transcluídas e as imagens usadas nesta página). Ignorado se nenhum dos níveis de proteção dados suportam a proteção em cascata.",
+       "apihelp-protect-param-watch": "Se definido, adicionar a página que está a ser protegida ou desprotegida às páginas vigiadas do utilizador atual.",
+       "apihelp-protect-param-watchlist": "Adicionar ou remover incondicionalmente a página da lista de páginas vigiadas do utilizador atual, usar as preferências ou não alterar o estado de vigilância.",
+       "apihelp-protect-example-protect": "Proteger uma página.",
+       "apihelp-protect-example-unprotect": "Desproteger uma página definindo a restrição <kbd>all</kbd> (isto é, todos podem executar a operação).",
+       "apihelp-protect-example-unprotect2": "Desproteger uma página definindo que não há restrições.",
+       "apihelp-purge-description": "Limpar a <i>cache</i> para os títulos especificados.\n\nRequer um pedido POST se o utilizador não tiver iniciado uma sessão.",
+       "apihelp-purge-param-forcelinkupdate": "Atualizar as tabelas de ligações.",
+       "apihelp-purge-param-forcerecursivelinkupdate": "Atualizar a tabela de ligações, e atualizar as tabelas de ligações de qualquer página que usa esta página como modelo.",
+       "apihelp-purge-example-simple": "Purgar as páginas <kbd>Main Page</kbd> e <kbd>API</kbd>.",
+       "apihelp-purge-example-generator": "Purgar as primeiras 10 páginas no espaço nominal principal.",
+       "apihelp-query-description": "Obter dados do MediaWiki e acerca dele.\n\nTodas as modificações de dados têm primeiro de usar um pedido para adquirir uma chave, de forma a impedir ações abusivas de <i>sites</i> maliciosos.",
+       "apihelp-query-param-prop": "As propriedades a serem obtidas para as páginas consultadas.",
+       "apihelp-query-param-list": "As listas a serem obtidas.",
+       "apihelp-query-param-meta": "Os metadados a serem obtidos.",
+       "apihelp-query-param-indexpageids": "Incluir uma secção adicional de identificadores de página que lista todos os identificadores de página devolvidos.",
+       "apihelp-query-param-export": "Exportar as revisões atuais de todas as páginas fornecidas ou geradas.",
+       "apihelp-query-param-exportnowrap": "Devolver o XML de exportação sem o envolver num resultado XML (o mesmo formato que [[Special:Export]]). Só pode ser usado com $1export.",
+       "apihelp-query-param-iwurl": "Indica se deve ser obtido o URL completo quando o título é um <i>link</i> interwikis.",
+       "apihelp-query-param-rawcontinue": "Devolver os dados em bruto de <samp>query-continue</samp> para continuar.",
+       "apihelp-query-example-revisions": "Obter [[Special:ApiHelp/query+siteinfo|informação do ''site'']] e as [[Special:ApiHelp/query+revisions|revisões]] da página <kbd>Main Page</kbd>.",
+       "apihelp-query-example-allpages": "Obter as revisões das páginas que começam por <kbd>API/</kbd>.",
        "apihelp-query+allcategories-description": "Enumerar todas as categorias.",
-       "apihelp-query+alldeletedrevisions-example-user": "Lista das últimas 50 contribuições eliminadas pelo utilizador <kbd>Example</kbd>.",
-       "apihelp-query+allpages-param-prefix": "Pesquisa para todos os títulos de páginas que comecem com este valor.",
-       "apihelp-query+allpages-example-generator": "Mostrar informação sobre 4 páginas que comecem com a letra <kbd>T</kbd>.",
-       "apihelp-query+allusers-example-Y": "Lista de utilizadores que comecem com <kbd>Y</kbd>.",
+       "apihelp-query+allcategories-param-from": "A categoria a partir da qual será começada a enumeração.",
+       "apihelp-query+allcategories-param-to": "A categoria na qual será terminada a enumeração.",
+       "apihelp-query+allcategories-param-prefix": "Procurar todos os títulos de categorias que começam por este valor.",
+       "apihelp-query+allcategories-param-dir": "A direção da ordenação.",
+       "apihelp-query+allcategories-param-min": "Só devolver as categorias que tenham no mínimo este número de membros.",
+       "apihelp-query+allcategories-param-max": "Só devolver as categorias que tenham no máximo este número de membros.",
+       "apihelp-query+allcategories-param-limit": "O número de categorias a serem devolvidas.",
+       "apihelp-query+allcategories-param-prop": "As propriedades a serem obtidas:",
+       "apihelp-query+allcategories-paramvalue-prop-size": "Adiciona o número de páginas na categoria.",
+       "apihelp-query+allcategories-paramvalue-prop-hidden": "Etiqueta as categorias ocultadas com <code>_&#95;HIDDENCAT_&#95;</code>.",
+       "apihelp-query+allcategories-example-size": "Lista as categorias com informação sobre o número de páginas em cada uma delas.",
+       "apihelp-query+allcategories-example-generator": "Obter informação sobre a própria página de categoria, para as categorias que começam por <kbd>List</kbd>.",
+       "apihelp-query+alldeletedrevisions-description": "Listar todas as revisões eliminadas por um utilizador ou de um espaço nominal.",
+       "apihelp-query+alldeletedrevisions-paraminfo-useronly": "Só pode ser usado com <var>$3user</var>.",
+       "apihelp-query+alldeletedrevisions-paraminfo-nonuseronly": "Não pode ser usado com <var>$3user</var>.",
+       "apihelp-query+alldeletedrevisions-param-start": "A data e hora da revisão a partir da qual será começada a enumeração.",
+       "apihelp-query+alldeletedrevisions-param-end": "A data e hora na qual será terminada a enumeração.",
+       "apihelp-query+alldeletedrevisions-param-from": "Começar a listagem neste título.",
+       "apihelp-query+alldeletedrevisions-param-to": "Terminar a listagem neste título.",
+       "apihelp-query+alldeletedrevisions-param-prefix": "Procurar todos os títulos de página que começam por este valor.",
+       "apihelp-query+alldeletedrevisions-param-tag": "Listar só as revisões marcadas com esta etiqueta.",
+       "apihelp-query+alldeletedrevisions-param-user": "Listar só as revisões feitas por este utilizador.",
+       "apihelp-query+alldeletedrevisions-param-excludeuser": "Não listar as revisões feitas por este utilizador.",
+       "apihelp-query+alldeletedrevisions-param-namespace": "Listar só as páginas neste espaço nominal.",
+       "apihelp-query+alldeletedrevisions-param-miser-user-namespace": "<strong>Nota:</strong> Devido ao [[mw:Manual:$wgMiserMode|modo avarento]], o uso de <var>$1user</var> e <var>$1namespace</var> em conjunto pode resultar na devolução de menos de <var>$1limit</var> resultados antes de continuar; em casos extremos pode não ser devolvido qualquer resultado.",
+       "apihelp-query+alldeletedrevisions-param-generatetitles": "Ao ser usado como gerador, gerar títulos em vez de identificadores de revisões.",
+       "apihelp-query+alldeletedrevisions-example-user": "Listar as últimas 50 contribuições eliminadas do utilizador <kbd>Example</kbd>.",
+       "apihelp-query+alldeletedrevisions-example-ns-main": "Listar as primeiras 50 revisões eliminadas no espaço nominal principal.",
+       "apihelp-query+allfileusages-description": "Listar todas as utilizações de ficheiros, incluindo ficheiros que não existam.",
+       "apihelp-query+allfileusages-param-from": "O título do ficheiro a partir do qual será começada a enumeração.",
+       "apihelp-query+allfileusages-param-to": "O título do ficheiro no qual será terminada a enumeração.",
+       "apihelp-query+allfileusages-param-prefix": "Procurar todos os títulos de ficheiro que começam por este valor.",
+       "apihelp-query+allfileusages-param-unique": "Mostrar só nomes de ficheiro únicos. Não pode ser usado com <kbd>$1prop=ids</kbd>.\nAo ser usado como gerador, produz páginas de destino em vez de páginas de origem.",
+       "apihelp-query+allfileusages-param-prop": "As informações que devem ser incluídas:",
+       "apihelp-query+allfileusages-paramvalue-prop-ids": "Adiciona os identificadores das páginas que utilizam (não pode ser usado com <var>$1unique</var>).",
+       "apihelp-query+allfileusages-paramvalue-prop-title": "Adiciona o título do ficheiro.",
+       "apihelp-query+allfileusages-param-limit": "O número total de elementos a serem devolvidos.",
+       "apihelp-query+allfileusages-param-dir": "A direção de listagem.",
+       "apihelp-query+allfileusages-example-B": "Listar os títulos de ficheiros, incluindo aqueles em falta, com os identificadores das páginas de onde provêm, começando no <kbd>B</kbd>.",
+       "apihelp-query+allfileusages-example-unique": "Listar os títulos de ficheiro únicos.",
+       "apihelp-query+allfileusages-example-unique-generator": "Obtém todos os títulos de ficheiros, marcando aqueles em falta.",
+       "apihelp-query+allfileusages-example-generator": "Obtém as páginas que contêm os ficheiros.",
+       "apihelp-query+allimages-description": "Enumerar todas as imagens sequencialmente.",
+       "apihelp-query+allimages-param-sort": "Propriedade pela qual fazer a ordenação.",
+       "apihelp-query+allimages-param-dir": "A direção de listagem.",
+       "apihelp-query+allimages-param-from": "O título da imagem a partir do qual será começada a enumeração. Só pode ser usado com $1sort=name.",
+       "apihelp-query+allimages-param-to": "O título da imagem no qual será terminada a enumeração. Só pode ser usado com $1sort=name.",
+       "apihelp-query+allimages-param-start": "A data e hora da imagem a partir da qual será começada a enumeração. Só pode ser usado com $1sort=timestamp.",
+       "apihelp-query+allimages-param-end": "A data e hora da imagem na qual será terminada a enumeração. Só pode ser usado com $1sort=timestamp.",
+       "apihelp-query+allimages-param-prefix": "Procurar todos os títulos de imagem que começam por este valor. Só pode ser usado com $1sort=name.",
+       "apihelp-query+allimages-param-minsize": "Limitar só às imagens com este número mínimo de bytes.",
+       "apihelp-query+allimages-param-maxsize": "Limitar só às imagens com este número máximo de bytes.",
+       "apihelp-query+allimages-param-sha1": "Resumo criptográfico SHA1 da imagem. Substitui $1sha1base36.",
+       "apihelp-query+allimages-param-sha1base36": "Resumo criptográfico SHA1 da imagem em base 36 (usado no MediaWiki).",
+       "apihelp-query+allimages-param-user": "Devolver só os ficheiros carregados por este utilizador. Só pode ser usado com $1sort=timestamp. Não pode ser usado em conjunto com $1filterbots.",
+       "apihelp-query+allimages-param-filterbots": "Como filtrar os ficheiros carregados por robôs. Só pode ser usado com $1sort=timestamp. Não pode ser usado em conjunto com $1user.",
+       "apihelp-query+allimages-param-mime": "Tipos MIME a procurar; por exemplo, <kbd>image/jpeg</kbd>.",
+       "apihelp-query+allimages-param-limit": "O número total de imagens a serem devolvidas.",
+       "apihelp-query+allimages-example-B": "Mostrar uma lista dos ficheiros que começam com a letra <kbd>B</kbd>.",
+       "apihelp-query+allimages-example-recent": "Mostrar uma lista dos ficheiros carregados recentemente, semelhante a [[Special:NewFiles]].",
+       "apihelp-query+allimages-example-mimetypes": "Mostrar uma lista dos ficheiros com os tipos MIME <kbd>image/png</kbd> ou <kbd>image/gif</kbd>.",
+       "apihelp-query+allimages-example-generator": "Mostrar informação sobre 4 ficheiros, começando pela letra <kbd>T</kbd>.",
+       "apihelp-query+alllinks-description": "Enumerar todos os ''links'' que apontam para um determinado espaço nominal.",
+       "apihelp-query+alllinks-param-from": "O título do ''link'' a partir do qual será começada a enumeração.",
+       "apihelp-query+alllinks-param-to": "O título do ''link'' no qual será terminada a enumeração.",
+       "apihelp-query+alllinks-param-prefix": "Procurar todos os títulos ligados que começam por este valor.",
+       "apihelp-query+alllinks-param-unique": "Mostrar só títulos ligados únicos. Não pode ser usado com <kbd>$1prop=ids</kbd>.\nAo ser usado como gerador, produz páginas de destino em vez de páginas de origem.",
+       "apihelp-query+alllinks-param-prop": "As informações que devem ser incluídas:",
+       "apihelp-query+alllinks-paramvalue-prop-ids": "Adiciona o identificador da página que contém a ligação (não pode ser usado com <var>$1unique</var>).",
+       "apihelp-query+alllinks-paramvalue-prop-title": "Adiciona o título do ''link''.",
+       "apihelp-query+alllinks-param-namespace": "O espaço nominal a ser enumerado.",
+       "apihelp-query+alllinks-param-limit": "O número total de entradas a serem devolvidas.",
+       "apihelp-query+alllinks-param-dir": "A direção de listagem.",
+       "apihelp-query+alllinks-example-B": "Listar os títulos para os quais existem ligações, incluindo títulos em falta, com os identificadores das páginas que contêm as respetivas ligações, começando pela letra <kbd>B</kbd>.",
+       "apihelp-query+alllinks-example-unique": "Listar os títulos únicos para os quais existem ligações.",
+       "apihelp-query+alllinks-example-unique-generator": "Obtém todos os títulos para os quais existem ligações, marcando aqueles em falta.",
+       "apihelp-query+alllinks-example-generator": "Obtém as páginas que contêm as ligações.",
+       "apihelp-query+allmessages-description": "Devolver as mensagens deste ''site''.",
+       "apihelp-query+allmessages-param-messages": "Mensagens a serem produzidas no resultado. <kbd>*</kbd> (o valor por omissão) significa todas as mensagens.",
+       "apihelp-query+allmessages-param-prop": "As propriedades a serem obtidas:",
+       "apihelp-query+allmessages-param-enableparser": "Definir, para ativar o analisador sintático e pré-processar o texto da mensagem com notação wiki (substituir palavras mágicas, processar predefinições, etc.).",
+       "apihelp-query+allmessages-param-nocontent": "Se definido, não incluir o conteúdo das mensagens no resultado de saída.",
+       "apihelp-query+allmessages-param-includelocal": "Incluir também as mensagens locais, isto é, mensagens que não existem no software mas existem como uma página no espaço nominal MediaWiki:.\nIsto lista todas as páginas do espaço nominal MediaWiki:, portanto, também irá listar aquelas que não são verdadeiramente mensagens, como [[MediaWiki:Common.js|Common.js]].",
+       "apihelp-query+allmessages-param-args": "Os argumentos a serem substituídos na mensagem.",
+       "apihelp-query+allmessages-param-filter": "Devolver só as mensagens cujos nomes contêm este texto.",
+       "apihelp-query+allmessages-param-customised": "Devolver só as mensagens neste estado de personalização.",
+       "apihelp-query+allmessages-param-lang": "Devolver as mensagens nesta língua.",
+       "apihelp-query+allmessages-param-from": "Devolver as mensagens, a partir desta mensagem.",
+       "apihelp-query+allmessages-param-to": "Devolver as mensagens, até esta mensagem.",
+       "apihelp-query+allmessages-param-title": "Nome da página a utilizar como contexto ao fazer a análise sintática da mensagem (para a opção $1enableparser).",
+       "apihelp-query+allmessages-param-prefix": "Devolver as mensagens com este prefixo.",
+       "apihelp-query+allmessages-example-ipb": "Mostrar mensagens que começam por <kbd>ipb-</kbd>.",
+       "apihelp-query+allmessages-example-de": "Mostrar as mensagens <kbd>august</kbd> e <kbd>mainpage</kbd> em Alemão.",
+       "apihelp-query+allpages-description": "Enumerar sequencialmente todas as páginas de um determinado espaço nominal.",
+       "apihelp-query+allpages-param-from": "O título de página a partir do qual será começada a enumeração.",
+       "apihelp-query+allpages-param-to": "O título de página no qual será terminada a enumeração.",
+       "apihelp-query+allpages-param-prefix": "Procurar todos os títulos de páginas que comecem com este valor.",
+       "apihelp-query+allpages-param-namespace": "O espaço nominal a ser enumerado.",
+       "apihelp-query+allpages-param-filterredir": "As páginas a serem listadas.",
+       "apihelp-query+allpages-param-minsize": "Limitar só às páginas com este número mínimo de bytes.",
+       "apihelp-query+allpages-param-maxsize": "Limitar só às páginas com este número máximo de bytes.",
+       "apihelp-query+allpages-param-prtype": "Limitar só às páginas protegidas.",
+       "apihelp-query+allpages-param-prlevel": "Filtrar as proteções com base no nível de proteção (tem de ser usado com o parâmetro $1prtype=).",
+       "apihelp-query+allpages-param-prfiltercascade": "Filtrar as proteções com base na proteção em cascata (ignorado se $1prtype não estiver presente).",
+       "apihelp-query+allpages-param-limit": "O número total de páginas a serem devolvidas.",
+       "apihelp-query+allpages-param-dir": "A direção de listagem.",
+       "apihelp-query+allpages-param-filterlanglinks": "Filtrar dependo de uma página ter ''links'' interlínguas. Note que isto pode não tomar em consideração ''links'' interlínguas adicionados por extensões.",
+       "apihelp-query+allpages-param-prexpiry": "O tipo de expiração pelo qual as páginas serão filtradas:\n;indefinite:Obter só páginas com um período de expiração indefinido.\n;definite:Obter só páginas com um período de expiração definido (específico).\n;all:Obter páginas com qualquer período de expiração.",
+       "apihelp-query+allpages-example-B": "Mostrar uma lista de páginas, começando na letra <kbd>B</kbd>.",
+       "apihelp-query+allpages-example-generator": "Mostrar informação sobre 4 páginas, começando na letra <kbd>T</kbd>.",
+       "apihelp-query+allpages-example-generator-revisions": "Mostrar o conteúdo das primeiras 2 páginas que não sejam redirecionamentos, começando na página <kbd>Re</kbd>.",
+       "apihelp-query+allredirects-description": "Listar todos os redirecionamentos para um espaço nominal.",
+       "apihelp-query+allredirects-param-from": "O título do redirecionamento a partir do qual será começada a enumeração.",
+       "apihelp-query+allredirects-param-to": "O título do redirecionamento no qual será terminada a enumeração.",
+       "apihelp-query+allredirects-param-prefix": "Procurar todas as páginas de destino que começam por este valor.",
+       "apihelp-query+allredirects-param-unique": "Mostrar só páginas de destino únicas. Não pode ser usado com <kbd>$1prop=ids|fragment|interwiki</kbd>.\nAo ser usado como gerador, produz páginas de destino em vez de páginas de origem.",
+       "apihelp-query+allredirects-param-prop": "As informações que devem ser incluídas:",
+       "apihelp-query+allredirects-paramvalue-prop-ids": "Adiciona o identificador da página que contém o redirecionamento (não pode ser usado com <var>$1unique</var>).",
+       "apihelp-query+allredirects-paramvalue-prop-title": "Adiciona o título do redirecionamento.",
+       "apihelp-query+allredirects-paramvalue-prop-fragment": "Adiciona o fragmento do redirecionamento, se existir (não pode ser usado com <var>$1unique</var>).",
+       "apihelp-query+allredirects-paramvalue-prop-interwiki": "Adiciona o prefixo interwikis do redirecionamento, se existir (não pode ser usado em conjunto com <var>$1unique</var>).",
+       "apihelp-query+allredirects-param-namespace": "O espaço nominal a ser enumerado.",
+       "apihelp-query+allredirects-param-limit": "O número total de elementos a serem devolvidos.",
+       "apihelp-query+allredirects-param-dir": "A direção de listagem.",
+       "apihelp-query+allredirects-example-B": "Listar as páginas de destino, incluindo aquelas em falta, com os identificadores da página de origem, começando na <kbd>B</kbd>.",
+       "apihelp-query+allredirects-example-unique": "Listar as páginas de destino únicas.",
+       "apihelp-query+allredirects-example-unique-generator": "Obtém todas as páginas de destino, marcando aquelas em falta.",
+       "apihelp-query+allredirects-example-generator": "Obtém as páginas que contêm os redirecionamentos.",
+       "apihelp-query+allrevisions-description": "Listar todas as revisões.",
+       "apihelp-query+allrevisions-param-start": "A data e hora a partir da qual será começada a enumeração.",
+       "apihelp-query+allrevisions-param-end": "A data e hora na qual será terminada a enumeração.",
+       "apihelp-query+allrevisions-param-user": "Listar só as revisões deste utilizador.",
+       "apihelp-query+allrevisions-param-excludeuser": "Não listar as revisões deste utilizador.",
+       "apihelp-query+allrevisions-param-namespace": "Listar só as páginas neste espaço nominal.",
+       "apihelp-query+allrevisions-param-generatetitles": "Ao ser usado como gerador, gerar títulos em vez de identificadores de revisões.",
+       "apihelp-query+allrevisions-example-user": "Listar as últimas 50 contribuições do utilizador <kbd>Example</kbd>.",
+       "apihelp-query+allrevisions-example-ns-main": "Listar as primeiras 50 revisões no espaço nominal principal.",
+       "apihelp-query+mystashedfiles-description": "Obter uma lista dos ficheiros que estão na área de ficheiros escondidos do utilizador atual.",
+       "apihelp-query+mystashedfiles-param-prop": "As propriedades a serem obtidas para os ficheiros.",
+       "apihelp-query+mystashedfiles-paramvalue-prop-size": "Obter o tamanho do ficheiro e as dimensões da imagem.",
+       "apihelp-query+mystashedfiles-paramvalue-prop-type": "Obter o tipo MIME e o tipo de multimédia do ficheiro.",
+       "apihelp-query+mystashedfiles-param-limit": "Quantos ficheiros a serem obtidos.",
+       "apihelp-query+alltransclusions-param-from": "O título da transclusão a partir do qual será começada a enumeração.",
+       "apihelp-query+alltransclusions-param-to": "O título da transclusão no qual será terminada a enumeração.",
+       "apihelp-query+alltransclusions-param-prefix": "Procurar todos os títulos transcluídos que começam por este valor.",
+       "apihelp-query+alltransclusions-param-unique": "Mostrar só títulos transcluídos únicos. Não pode ser usado com <kbd>$1prop=ids</kbd>.\nAo ser usado como gerador, produz páginas de destino em vez de páginas de origem.",
+       "apihelp-query+alltransclusions-param-prop": "As informações que devem ser incluídas:",
+       "apihelp-query+alltransclusions-paramvalue-prop-ids": "Adiciona o identificador da página onde é feita a transclusão (não pode ser usado com <var>$1unique</var>).",
+       "apihelp-query+alltransclusions-paramvalue-prop-title": "Adiciona o título da transclusão.",
+       "apihelp-query+alltransclusions-param-namespace": "O espaço nominal a enumerar.",
+       "apihelp-query+alltransclusions-param-limit": "O número total de elementos a serem devolvidos.",
+       "apihelp-query+alltransclusions-param-dir": "A direção de listagem.",
+       "apihelp-query+alltransclusions-example-B": "Listar os títulos transcluídos, incluindo aqueles em falta, com os identificadores das páginas de origem, começando no <kbd>B</kbd>.",
+       "apihelp-query+alltransclusions-example-unique": "Listar os títulos transcluídos únicos.",
+       "apihelp-query+alltransclusions-example-unique-generator": "Obtém todos os títulos transcluídos, marcando aqueles em falta.",
+       "apihelp-query+alltransclusions-example-generator": "Obtém as páginas que contêm as transclusões.",
+       "apihelp-query+allusers-description": "Enumerar todos os utilizadores registados.",
+       "apihelp-query+allusers-param-from": "O nome de utilizador a partir do qual será começada a enumeração.",
+       "apihelp-query+allusers-param-to": "O nome de utilizador no qual será terminada a enumeração.",
+       "apihelp-query+allusers-param-prefix": "Procurar todos os nomes de utilizador que começam por este valor.",
+       "apihelp-query+allusers-param-dir": "A direção da ordenação.",
+       "apihelp-query+allusers-param-group": "Incluir só os utilizadores nos grupos indicados.",
+       "apihelp-query+allusers-param-excludegroup": "Excluir os utilizadores nos grupos indicados.",
+       "apihelp-query+allusers-param-rights": "Incluir só os utilizadores com as permissões indicadas. Não inclui as permissões atribuídas por grupos implícitos ou de promoção automática como *, utilizador, ou autoconfirmado.",
+       "apihelp-query+allusers-param-prop": "As informações que devem ser incluídas:",
+       "apihelp-query+allusers-paramvalue-prop-blockinfo": "Adiciona a informação sobre um bloqueio atual do utilizador.",
+       "apihelp-query+allusers-paramvalue-prop-groups": "Lista os grupos a que o utilizador pertence. Isto usa mais recursos do servidor e pode devolver menos resultados do que o limite.",
+       "apihelp-query+allusers-paramvalue-prop-implicitgroups": "Lista todos os grupos a que o utilizador pertence de forma automática.",
+       "apihelp-query+allusers-paramvalue-prop-rights": "Lista as permissões que o utilizador tem.",
+       "apihelp-query+allusers-paramvalue-prop-editcount": "Adiciona a contagem de edições do utilizador.",
+       "apihelp-query+allusers-paramvalue-prop-registration": "Adiciona a data e hora de registo do utilizador, se estiver disponível (pode estar vazia).",
+       "apihelp-query+allusers-paramvalue-prop-centralids": "Adiciona os identificadores centrais e o estado de ligação central (''attachment'') do utilizador.",
+       "apihelp-query+allusers-param-limit": "O número total de nomes de utilizador a serem devolvidos.",
+       "apihelp-query+allusers-param-witheditsonly": "Listar só os utilizadores que realizaram edições.",
+       "apihelp-query+allusers-param-activeusers": "Listar só os utilizadores ativos {{PLURAL:$1|no último dia|nos últimos $1 dias}}.",
+       "apihelp-query+allusers-param-attachedwiki": "Com <kbd>$1prop=centralids</kbd>, indicar também se o utilizador tem uma ligação (''attachment'') à wiki designada por este identificador.",
+       "apihelp-query+allusers-example-Y": "Listar utilizadores, começando pelo <kbd>Y</kbd>.",
+       "apihelp-query+authmanagerinfo-description": "Obter informação sobre o atual estado de autenticação.",
+       "apihelp-query+authmanagerinfo-param-securitysensitiveoperation": "Testar se o estado atual de autenticação do utilizador é suficiente para a operação especificada, que exige condições seguras.",
+       "apihelp-query+authmanagerinfo-param-requestsfor": "Obter informação sobre os pedidos de autenticação que são necessários para a operação de autenticação especificada.",
+       "apihelp-query+authmanagerinfo-example-securitysensitiveoperation": "Testar se a autenticação é suficiente para a operação <kbd>foo</kbd>.",
+       "apihelp-query+backlinks-param-namespace": "O espaço nominal a ser enumerado.",
+       "apihelp-query+backlinks-param-dir": "A direção de listagem.",
+       "apihelp-query+backlinks-param-limit": "O número total de páginas a serem devolvidas. Se <var>$1redirect</var> estiver ativado, o nível aplica-se a cada nível em separado (o que significa que até 2 * <var>$1limit</var> resultados podem ser devolvidos).",
        "apihelp-query+backlinks-example-simple": "Mostrar ligações para <kbd>Main page</kbd>.",
        "apihelp-query+backlinks-example-generator": "Obter informações sobre as páginas com ligação para <kbd>Main page</kbd>.",
+       "apihelp-query+blocks-description": "Listar todos os utilizadores e endereços IP bloqueados.",
+       "apihelp-query+blocks-param-start": "A data e hora a partir da qual será começada a enumeração.",
+       "apihelp-query+blocks-param-end": "A data e hora na qual será terminada a enumeração.",
+       "apihelp-query+blocks-param-ids": "Lista dos identificadores de bloqueios a serem listados (opcional).",
+       "apihelp-query+blocks-param-users": "Lista dos utilizadores a serem procurados (opcional).",
+       "apihelp-query+blocks-param-ip": "Obter todos os bloqueios aplicáveis a este endereço IP ou intervalo CIDR, incluindo bloqueios de intervalos. Não pode ser usado em conjunto com <var>$3users</var>. Não são aceites intervalos CIDR maiores que IPv4/$1 ou IPv6/$2.",
        "apihelp-query+blocks-param-limit": "O número máximo de bloqueios a listar.",
-       "apihelp-query+categorymembers-description": "Lista de todas as páginas numa categoria fornecida.",
+       "apihelp-query+blocks-param-prop": "As propriedades a serem obtidas:",
+       "apihelp-query+blocks-paramvalue-prop-id": "Adiciona o identificador do bloqueio.",
+       "apihelp-query+blocks-paramvalue-prop-userid": "Adiciona o identificador do utilizador bloqueado.",
+       "apihelp-query+blocks-paramvalue-prop-byid": "Adiciona o identificador do utilizador que fez o bloqueio.",
+       "apihelp-query+blocks-paramvalue-prop-expiry": "Adiciona a data e hora de expiração do bloqueio.",
+       "apihelp-query+blocks-paramvalue-prop-range": "Adiciona o intervalo de endereços IP afetado pelo bloqueio.",
+       "apihelp-query+blocks-param-show": "Mostrar só os bloqueios que preenchem estes critérios.\nPor exemplo, para ver só bloqueios indefinidos de endereços IP, defina <kbd>$1show=ip|!temp</kbd>.",
+       "apihelp-query+blocks-example-simple": "Listar bloqueios.",
+       "apihelp-query+blocks-example-users": "Listar os bloqueios dos utilizadores <kbd>Alice</kbd> e <kbd>Bob</kbd>.",
+       "apihelp-query+categories-description": "Listar todas as categorias às quais as páginas pertencem.",
+       "apihelp-query+categories-param-prop": "As propriedades adicionais que devem ser obtidas para cada categoria:",
+       "apihelp-query+categories-paramvalue-prop-sortkey": "Adiciona a chave de ordenação (''string'' hexadecimal) e o prefixo da chave de ordenação (parte legível) da categoria.",
+       "apihelp-query+categories-param-show": "Os tipos de categorias que serão mostrados.",
+       "apihelp-query+categories-param-limit": "O número de categorias a serem devolvidas.",
+       "apihelp-query+categories-param-categories": "Listar só estas categorias. Útil para verificar se uma determinada página está numa determinada categoria.",
+       "apihelp-query+categories-param-dir": "A direção de listagem.",
+       "apihelp-query+categories-example-simple": "Obter uma lista das categorias às quais pertence a página <kbd>Albert Einstein</kbd>.",
+       "apihelp-query+categorymembers-description": "Listar todas as páginas numa categoria específica.",
+       "apihelp-query+categorymembers-param-title": "A categoria que será enumerada (obrigatório). Tem de incluir o prefixo <kbd>{{ns:category}}:</kbd>. Não pode ser usado em conjunto com <var>$1pageid</var>.",
+       "apihelp-query+categorymembers-param-pageid": "Identificador da categoria a ser enumerada. Não pode ser usado em conjunto com <var>$1title</var>.",
+       "apihelp-query+categorymembers-param-prop": "As informações que devem ser incluídas:",
+       "apihelp-query+categorymembers-paramvalue-prop-ids": "Adiciona o identificador da página.",
+       "apihelp-query+categorymembers-paramvalue-prop-sortkey": "Adiciona a chave usada para a ordenação da categoria (''string'' hexadecimal).",
+       "apihelp-query+categorymembers-paramvalue-prop-type": "Adiciona o tipo com que a página foi categorizada (<samp>page</samp>, <samp>subcat</samp> ou <samp>file</samp>).",
+       "apihelp-query+categorymembers-param-type": "O tipo de membros de categoria que devem ser incluídos. Ignorado se <kbd>$1sort=timestamp</kbd> estiver definido.",
+       "apihelp-query+categorymembers-param-limit": "O número máximo de páginas a serem devolvidas.",
+       "apihelp-query+categorymembers-param-sort": "Propriedade pela qual fazer a ordenação.",
+       "apihelp-query+categorymembers-param-dir": "A direção da ordenação.",
+       "apihelp-query+categorymembers-param-start": "A data e hora da página a partir da qual será começada a listagem. Só pode ser usado em conjunto com <kbd>$1sort=timestamp</kbd>.",
+       "apihelp-query+categorymembers-param-end": "A data e hora da página na qual será terminada a listagem. Só pode ser usado em conjunto com <kbd>$1sort=timestamp</kbd>.",
+       "apihelp-query+contributors-param-limit": "O número de contribuidores a serem devolvidos.",
+       "apihelp-query+deletedrevisions-param-start": "A data e hora a partir da qual será começada a enumeração. Ignorado ao processar uma lista de identificadores de revisão.",
+       "apihelp-query+deletedrevisions-param-end": "A data e hora na qual será terminada a enumeração. Ignorado ao processar uma lista de identificadores de revisão.",
+       "apihelp-query+deletedrevisions-param-tag": "Listar só as revisões marcadas com esta etiqueta.",
+       "apihelp-query+deletedrevisions-param-user": "Listar só as revisões deste utilizador.",
+       "apihelp-query+deletedrevisions-param-excludeuser": "Não listar as revisões deste utilizador.",
+       "apihelp-query+deletedrevisions-example-titles": "Listar as revisões eliminadas das páginas <kbd>Main Page</kbd> e <kbd>Talk:Main Page</kbd>, com o conteúdo.",
+       "apihelp-query+deletedrevisions-example-revids": "Listar a informação da revisão eliminada <kbd>123456</kbd>.",
+       "apihelp-query+deletedrevs-description": "Listar as revisões eliminadas.\n\nOpera em três modos:\n# Listar as revisões eliminadas dos títulos indicados, ordenadas por data e hora.\n# Listar as contribuições eliminadas do utilizador indicado, ordenadas por data e hora (sem especificar títulos).\n# Listar todas as revisões eliminadas no espaço nominal indicado, ordenadas por título e por data e hora (sem especificar títulos, sem definir $1user).\n\nAlguns parâmetros só se aplicam a alguns modos e são ignorados noutros.",
        "apihelp-query+deletedrevs-paraminfo-modes": "{{PLURAL:$1|Modo|Modos}}: $2",
+       "apihelp-query+deletedrevs-param-start": "A data e hora a partir da qual será começada a enumeração.",
+       "apihelp-query+deletedrevs-param-end": "A data e hora na qual será terminada a enumeração.",
+       "apihelp-query+deletedrevs-param-from": "Começar a listagem neste título.",
+       "apihelp-query+deletedrevs-param-to": "Terminar a listagem neste título.",
+       "apihelp-query+deletedrevs-param-prefix": "Procurar todos os títulos de página que começam por este valor.",
+       "apihelp-query+deletedrevs-param-unique": "Listar só uma revisão para cada página.",
+       "apihelp-query+deletedrevs-param-tag": "Listar só as revisões marcadas com esta etiqueta.",
+       "apihelp-query+deletedrevs-param-user": "Listar só as revisões deste utilizador.",
        "apihelp-query+deletedrevs-param-excludeuser": "Não listar edições deste utilizador.",
-       "apihelp-query+deletedrevs-param-namespace": "Listar apenas as páginas neste domínio.",
-       "apihelp-query+extlinks-example-simple": "Obtenha uma lista de ligações externas na <kbd>Main Page</kbd>.",
-       "apihelp-query+filearchive-example-simple": "Mostrar lista de todos os ficheiros eliminados",
+       "apihelp-query+deletedrevs-param-namespace": "Listar só as páginas neste domínio.",
+       "apihelp-query+deletedrevs-param-limit": "O número máximo de revisões a serem listadas.",
+       "apihelp-query+deletedrevs-param-prop": "As propriedades a serem obtidas:\n;revid:Adiciona o identificador da revisão eliminada.\n;parentid:Adiciona o identificador da revisão anterior da página.\n;user:Adiciona o utilizador que fez a revisão.\n;userid:Adiciona o identificador do utilizador que fez a revisão.\n;comment:Adiciona o comentário da revisão.\n;parsedcomment:Adiciona o comentário da revisão após passagem pelo analisador sintático.\n;minor:Etiqueta a revisão como uma revisão menor.\n;len:Adiciona o comprimento (em bytes) da revisão.\n;sha1:Adiciona o SHA-1 da revisão (na base 16).\n;content:Adiciona o conteúdo da revisão.\n;token:<span class=\"apihelp-deprecated\">Obsoleto.</span> Fornece a chave da edição.\n;tags:Etiquetas da revisão.",
+       "apihelp-query+deletedrevs-example-mode1": "Listar só as últimas revisões eliminadas das páginas <kbd>Main Page</kbd> e <kbd>Talk:Main Page</kbd>, com o conteúdo (modo 1).",
+       "apihelp-query+deletedrevs-example-mode2": "Listar as últimas 50 contribuições eliminadas do utilizador <kbd>Bob</kbd> (modo 2).",
+       "apihelp-query+deletedrevs-example-mode3-main": "Listar as primeiras 50 revisões eliminadas no espaço nominal principal (modo 3).",
+       "apihelp-query+deletedrevs-example-mode3-talk": "Listar as primeiras 50 páginas eliminadas no espaço nominal {{ns:talk}} (modo 3).",
+       "apihelp-query+duplicatefiles-description": "Listar todos os ficheiros que são duplicados dos ficheiros indicados com base no seu resumo criptográfico.",
+       "apihelp-query+duplicatefiles-param-limit": "O número de ficheiros duplicados a serem devolvidos.",
+       "apihelp-query+duplicatefiles-param-dir": "A direção de listagem.",
+       "apihelp-query+embeddedin-param-namespace": "O espaço nominal a ser enumerado.",
+       "apihelp-query+embeddedin-param-dir": "A direção de listagem.",
+       "apihelp-query+embeddedin-param-limit": "O número total de páginas a serem devolvidas.",
+       "apihelp-query+extlinks-description": "Devolve todos os URL externos (que não sejam interwikis) das páginas especificadas.",
+       "apihelp-query+extlinks-param-limit": "O número de ''links'' a serem devolvidos.",
+       "apihelp-query+extlinks-param-protocol": "Protocolo do URL. Se vazio e <var>$1query</var> está definido, o protocolo é <kbd>http</kbd>. Deixe isto e  <var>$1query</var> vazios para listar todos os <i>links</i> externos.",
+       "apihelp-query+extlinks-param-query": "Texto de pesquisa sem protocolo. Útil para verificar se uma determinada página contém um determinado URL externo.",
+       "apihelp-query+extlinks-example-simple": "Obter uma lista das ligações externas na <kbd>Main Page</kbd>.",
+       "apihelp-query+exturlusage-description": "Enumerar as páginas que contêm um determinado URL.",
+       "apihelp-query+exturlusage-param-prop": "As informações que devem ser incluídas:",
+       "apihelp-query+exturlusage-paramvalue-prop-ids": "Adiciona o identificador da página.",
+       "apihelp-query+exturlusage-paramvalue-prop-url": "Adiciona o URL usado na página.",
+       "apihelp-query+exturlusage-param-protocol": "Protocolo do URL. Se vazio e <var>$1query</var> está definido, o protocolo é <kbd>http</kbd>. Deixe isto e  <var>$1query</var> vazios para listar todos os <i>links</i> externos.",
+       "apihelp-query+exturlusage-param-namespace": "Os espaços nominais a serem enumerados.",
+       "apihelp-query+exturlusage-param-limit": "O número de páginas a serem devolvidas.",
+       "apihelp-query+exturlusage-param-expandurl": "Expandir URL relativos a protocolos com o protocolo canónico.",
+       "apihelp-query+filearchive-description": "Enumerar todos os ficheiros eliminados sequencialmente.",
+       "apihelp-query+filearchive-param-from": "O título da imagem a partir do qual será começada a enumeração.",
+       "apihelp-query+filearchive-param-to": "O título da imagem no qual será terminada a enumeração.",
+       "apihelp-query+filearchive-param-prefix": "Procurar todos os títulos de imagem que começam por este valor.",
+       "apihelp-query+filearchive-param-dir": "A direção de listagem.",
+       "apihelp-query+filearchive-param-sha1": "O resumo criptográfico SHA-1 da imagem. Anula $1sha1base36.",
+       "apihelp-query+filearchive-param-sha1base36": "O resumo criptográfico da imagem na base 36 (usado no MediaWiki).",
+       "apihelp-query+filearchive-param-prop": "As informações da imagem que devem ser obtidas:",
+       "apihelp-query+filearchive-paramvalue-prop-sha1": "Adiciona o resumo criptográfico SHA-1 da imagem.",
+       "apihelp-query+filearchive-paramvalue-prop-user": "Adiciona o utilizador que carregou a versão da imagem.",
+       "apihelp-query+filearchive-paramvalue-prop-description": "Adiciona a descrição da versão da imagem.",
+       "apihelp-query+filearchive-paramvalue-prop-mime": "Adiciona o tipo MIME da imagem.",
+       "apihelp-query+filearchive-paramvalue-prop-bitdepth": "Adiciona a profundidade em ''bits'' da versão.",
+       "apihelp-query+filearchive-example-simple": "Mostrar uma lista de todos os ficheiros eliminados.",
+       "apihelp-query+filerepoinfo-param-prop": "As propriedades do repositório que devem ser obtidas (em algumas wikis poderão haver mais disponíveis):\n;apiurl:URL para a API do repositório - útil para obter informação de imagens do servidor.\n;name:A chave para o repositório - usada, por exemplo, em <var>[[mw:Manual:$wgForeignFileRepos|$wgForeignFileRepos]]</var> e nos valores de retorno de [[Special:ApiHelp/query+imageinfo|imageinfo]].\n;displayname:O nome legível da wiki repositório.\n;rooturl:URL de raiz para endereços de imagens.\n;local:Se o repositório é o local ou não.",
+       "apihelp-query+fileusage-param-prop": "As propriedades a serem obtidas:",
+       "apihelp-query+fileusage-paramvalue-prop-redirect": "Indicar se a página é um redirecionamento.",
+       "apihelp-query+fileusage-param-limit": "O número de elementos a serem devolvidos.",
+       "apihelp-query+fileusage-example-simple": "Obter uma lista das páginas que usam [[:File:Example.jpg]].",
+       "apihelp-query+fileusage-example-generator": "Obter informação sobre as páginas que usam [[:File:Example.jpg]].",
+       "apihelp-query+imageinfo-description": "Devolve informação do ficheiro e o historial de carregamentos.",
+       "apihelp-query+imageinfo-param-prop": "As informações do ficheiro que devem ser obtidas:",
+       "apihelp-query+imageinfo-paramvalue-prop-timestamp": "Adiciona a data e hora da versão carregada.",
+       "apihelp-query+imageinfo-paramvalue-prop-canonicaltitle": "Adiciona o título canónico do ficheiro.",
+       "apihelp-query+imageinfo-paramvalue-prop-url": "Devolve URL para o ficheiro e página de descrição.",
+       "apihelp-query+imageinfo-paramvalue-prop-size": "Adiciona o tamanho do ficheiro em ''bytes'' e a altura, largura e contagem de páginas (se aplicável).",
+       "apihelp-query+imageinfo-paramvalue-prop-sha1": "Adiciona o resumo criptográfico SHA-1 do ficheiro.",
+       "apihelp-query+imageinfo-paramvalue-prop-thumbmime": "Adiciona o tipo MIME da miniatura (requer URL e o parâmetro $1urlwidth).",
+       "apihelp-query+imageinfo-paramvalue-prop-archivename": "Adiciona o nome de ficheiro da versão arquivada das versões anteriores à última.",
+       "apihelp-query+imageinfo-paramvalue-prop-bitdepth": "Adiciona a profundidade em ''bits'' da versão.",
+       "apihelp-query+imageinfo-param-start": "Data e hora a partir da qual será começada a listagem.",
+       "apihelp-query+imageinfo-param-end": "Data e hora na qual será terminada a listagem.",
+       "apihelp-query+imageinfo-param-urlwidth": "Se $2prop=url está definido, será devolvido um URL para uma imagem redimensionada com este comprimento.\nPor razões de desempenho, se esta opção for usada não serão devolvidas mais de $1 imagens redimensionadas.",
+       "apihelp-query+imageinfo-param-extmetadatalanguage": "Em que língua obter extmetadata. Isto afeta tanto a tradução que será obtida, caso existam várias, como a formatação de números e vários outros valores.",
+       "apihelp-query+images-param-limit": "O número de ficheiros a serem devolvidos.",
+       "apihelp-query+images-param-images": "Listar só estes ficheiros. Útil para verificar se uma determinada página tem um determinado ficheiro.",
+       "apihelp-query+images-param-dir": "A direção de listagem.",
+       "apihelp-query+images-example-simple": "Obter uma lista dos ficheiros usados na página [[Main Page]].",
+       "apihelp-query+images-example-generator": "Obter informação sobre todos os ficheiros usados na página [[Main Page]].",
+       "apihelp-query+imageusage-param-namespace": "O espaço nominal a ser enumerado.",
+       "apihelp-query+imageusage-param-dir": "A direção de listagem.",
+       "apihelp-query+imageusage-param-limit": "O número total de páginas a serem devolvidas. Se <var>$1redirect</var> estiver ativado, o nível aplica-se a cada nível em separado (o que significa que até 2 * <var>$1limit</var> resultados podem ser devolvidos).",
        "apihelp-query+info-description": "Obter informação básica da página.",
-       "apihelp-query+recentchanges-example-simple": "Lista de mudanças recentes",
+       "apihelp-query+info-param-prop": "As propriedades adicionais que devem ser obtidas:",
+       "apihelp-query+info-paramvalue-prop-protection": "Listar o nível de proteção de cada página.",
+       "apihelp-query+info-paramvalue-prop-talkid": "O identificador da página de discussão de cada página que não seja de discussão.",
+       "apihelp-query+info-paramvalue-prop-notificationtimestamp": "A data e hora das notificações de alterações de cada página vigiada.",
+       "apihelp-query+info-paramvalue-prop-url": "Fornece um URL completo, um URL de edição e o URL canónico, para cada página.",
+       "apihelp-query+info-paramvalue-prop-readable": "Indica se o utilizador pode ler esta página.",
+       "apihelp-query+info-param-testactions": "Testar se o utilizador pode realizar certas operações na página.",
+       "apihelp-query+info-param-token": "Em substituição, usar [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].",
+       "apihelp-query+iwbacklinks-param-title": "Link interwikis a ser procurado. Tem de ser usado em conjunto com <var>$1blprefix</var>.",
+       "apihelp-query+iwbacklinks-param-limit": "O número total de páginas a serem devolvidas.",
+       "apihelp-query+iwbacklinks-param-prop": "As propriedades a serem obtidas:",
+       "apihelp-query+iwbacklinks-paramvalue-prop-iwprefix": "Adiciona o prefixo da ligação interwikis.",
+       "apihelp-query+iwbacklinks-param-dir": "A direção de listagem.",
+       "apihelp-query+iwlinks-param-url": "Indica se deve ser obtido o URL completo (não pode ser usado com $1prop).",
+       "apihelp-query+iwlinks-param-prop": "As propriedades adicionais que devem ser obtidas para cada ''link'' interlínguas:",
+       "apihelp-query+iwlinks-paramvalue-prop-url": "Adiciona o URL completo.",
+       "apihelp-query+iwlinks-param-limit": "O número de ''links'' interwikis a serem devolvidos.",
+       "apihelp-query+iwlinks-param-title": "Link interwikis a ser procurado. Tem de ser usado em conjunto com <var>$1prefix</var>.",
+       "apihelp-query+iwlinks-param-dir": "A direção de listagem.",
+       "apihelp-query+langbacklinks-param-title": "Link interlínguas a ser procurado. Tem de ser usado com $1lang.",
+       "apihelp-query+langbacklinks-param-limit": "O número total de páginas a serem devolvidas.",
+       "apihelp-query+langbacklinks-param-prop": "As propriedades a serem obtidas:",
+       "apihelp-query+langbacklinks-paramvalue-prop-lllang": "Adiciona o código de língua da ligação interlínguas.",
+       "apihelp-query+langbacklinks-param-dir": "A direção de listagem.",
+       "apihelp-query+langlinks-param-limit": "O número de ''links'' interlínguas a serem devolvidos.",
+       "apihelp-query+langlinks-param-url": "Indica se deve ser obtido o URL completo (não pode ser usado com $1prop).",
+       "apihelp-query+langlinks-param-prop": "As propriedades adicionais que devem ser obtidas para cada ''link'' interlínguas:",
+       "apihelp-query+langlinks-paramvalue-prop-url": "Adiciona o URL completo.",
+       "apihelp-query+langlinks-paramvalue-prop-autonym": "Adiciona o nome nativo da língua.",
+       "apihelp-query+langlinks-param-title": "Link a ser procurado. Tem de ser usado com <var>$1lang</var>.",
+       "apihelp-query+langlinks-param-dir": "A direção de listagem.",
+       "apihelp-query+links-param-limit": "O número de ''links'' a serem devolvidos.",
+       "apihelp-query+links-param-titles": "Listar só as ligações para estes títulos. Útil para verificar se uma determinada página contém ligações para um determinado título.",
+       "apihelp-query+links-param-dir": "A direção de listagem.",
+       "apihelp-query+linkshere-param-prop": "As propriedades a serem obtidas:",
+       "apihelp-query+linkshere-paramvalue-prop-redirect": "Indicar se a página é um redirecionamento.",
+       "apihelp-query+linkshere-param-limit": "O número de elementos a serem devolvidos.",
+       "apihelp-query+logevents-param-prop": "As propriedades a serem obtidas:",
+       "apihelp-query+logevents-paramvalue-prop-ids": "Adiciona o identificador do evento no registo.",
+       "apihelp-query+logevents-paramvalue-prop-type": "Adiciona o tipo do evento no registo.",
+       "apihelp-query+logevents-paramvalue-prop-userid": "Adiciona o identificador do utilizador responsável pelo evento no registo.",
+       "apihelp-query+logevents-paramvalue-prop-comment": "Adiciona o comentário do evento no registo.",
+       "apihelp-query+logevents-param-start": "A data e hora a partir da qual será começada a enumeração.",
+       "apihelp-query+logevents-param-end": "A data e hora na qual será terminada a enumeração.",
+       "apihelp-query+logevents-param-tag": "Listar só as entradas de eventos marcadas com esta etiqueta.",
+       "apihelp-query+logevents-param-limit": "O número total de entradas de eventos a serem devolvidas.",
+       "apihelp-query+logevents-example-simple": "Listar os eventos recentes do registo.",
+       "apihelp-query+pagepropnames-description": "Listar todos os nomes de propriedades de páginas em uso nesta wiki.",
+       "apihelp-query+pagepropnames-param-limit": "O número máximo de nomes a serem devolvidos.",
+       "apihelp-query+pagepropnames-example-simple": "Obter os primeiros 10 nomes de propriedades.",
+       "apihelp-query+pageprops-description": "Obter várias propriedades de página definidas no conteúdo da página.",
+       "apihelp-query+pageprops-param-prop": "Listar só estas propriedades de página (<kbd>[[Special:ApiHelp/query+pagepropnames|action=query&list=pagepropnames]]</kbd> devolve os nomes das propriedades de página em uso). Útil para verificar se as páginas usam uma determinada propriedade de página.",
+       "apihelp-query+pageprops-example-simple": "Obter as propriedades das páginas <kbd>Main Page</kbd> e <kbd>MediaWiki</kbd>.",
+       "apihelp-query+pageswithprop-description": "Listar todas as páginas que usam uma determinada propriedade.",
+       "apihelp-query+pageswithprop-param-propname": "A propriedade de página a partir da qual as páginas serão enumeradas (<kbd>[[Special:ApiHelp/query+pagepropnames|action=query&list=pagepropnames]]</kbd> devolve os nomes das propriedades de página que estão a ser usadas).",
+       "apihelp-query+pageswithprop-param-prop": "As informações que devem ser incluídas:",
+       "apihelp-query+pageswithprop-paramvalue-prop-ids": "Adiciona o identificador da página.",
+       "apihelp-query+pageswithprop-paramvalue-prop-title": "Adiciona o título e o identificador do espaço nominal da página.",
+       "apihelp-query+pageswithprop-paramvalue-prop-value": "Adiciona o valor da propriedade da página.",
+       "apihelp-query+pageswithprop-param-limit": "O número máximo de páginas a serem devolvidas.",
+       "apihelp-query+pageswithprop-param-dir": "A direção da ordenação.",
+       "apihelp-query+pageswithprop-example-simple": "Listar as primeiras 10 páginas que usam a propriedade <code>&#123;&#123;DISPLAYTITLE:&#125;&#125;</code>.",
+       "apihelp-query+pageswithprop-example-generator": "Obter informação adicional sobre as primeiras 10 páginas que usam <code>_&#95;NOTOC_&#95;</code>.",
+       "apihelp-query+prefixsearch-description": "Realizar uma procura de prefixo nos títulos de página.\n\nApesar da semelhança de nomes, este módulo não pretende ser equivalente a [[Special:PrefixIndex]]; para este, consulte <kbd>[[Special:ApiHelp/query+allpages|action=query&list=allpages]]</kbd> com o parâmetro <kbd>apprefix</kbd>. O propósito deste módulo é semelhante a <kbd>[[Special:ApiHelp/opensearch|action=opensearch]]</kbd>: receber dados introduzidos pelo utilizador e devolver os títulos com melhor correspondência. Dependendo do motor de busca do servidor, isto pode incluir correções de erros ortográficos, evitar redirecionamentos, e outras heurísticas.",
+       "apihelp-query+prefixsearch-param-search": "O texto a ser pesquisado.",
+       "apihelp-query+prefixsearch-param-namespace": "Os espaços nominais onde realizar a pesquisa.",
+       "apihelp-query+prefixsearch-param-limit": "O número máximo de resultados a serem devolvidos.",
+       "apihelp-query+prefixsearch-param-offset": "O número de resultados a serem omitidos.",
+       "apihelp-query+prefixsearch-example-simple": "Procurar os títulos de página que começam por <kbd>meaning</kbd>.",
+       "apihelp-query+prefixsearch-param-profile": "O perfil de pesquisa a ser utilizado.",
+       "apihelp-query+protectedtitles-description": "Listar todos os títulos cuja criação está impedida.",
+       "apihelp-query+protectedtitles-param-namespace": "Listar só os títulos nestes espaços nominais.",
+       "apihelp-query+protectedtitles-param-level": "Listar só os títulos com estes níveis de proteção.",
+       "apihelp-query+protectedtitles-param-limit": "O número total de páginas a serem devolvidas.",
+       "apihelp-query+protectedtitles-param-start": "Começar a listagem pelo título que tem esta data e hora de proteção.",
+       "apihelp-query+protectedtitles-param-end": "Terminar a listagem no título que tem esta data e hora de proteção.",
+       "apihelp-query+protectedtitles-param-prop": "As propriedades a serem obtidas:",
+       "apihelp-query+protectedtitles-paramvalue-prop-timestamp": "Adiciona a data e hora a que a proteção foi adicionada.",
+       "apihelp-query+protectedtitles-paramvalue-prop-user": "Adiciona o utilizador que fez a proteção.",
+       "apihelp-query+protectedtitles-paramvalue-prop-userid": "Adiciona o identificador do utilizador que fez a proteção.",
+       "apihelp-query+protectedtitles-paramvalue-prop-comment": "Adiciona o comentário da proteção.",
+       "apihelp-query+protectedtitles-paramvalue-prop-parsedcomment": "Adiciona o comentário da proteção após a análise sintática.",
+       "apihelp-query+protectedtitles-paramvalue-prop-expiry": "Adiciona a data e hora a que a proteção será removida.",
+       "apihelp-query+protectedtitles-paramvalue-prop-level": "Adiciona o nível de proteção.",
+       "apihelp-query+protectedtitles-example-simple": "Lista os títulos protegidos.",
+       "apihelp-query+protectedtitles-example-generator": "Encontrar as ligações para os títulos protegidos que pertencem ao espaço nominal principal.",
+       "apihelp-query+querypage-param-page": "O nome da página especial. Note que este é sensível a maiúsculas e minúsculas.",
+       "apihelp-query+querypage-param-limit": "O número de resultados a serem devolvidos.",
+       "apihelp-query+random-description": "Obter um conjunto de páginas aleatórias.\n\nAs páginas são listadas em sequência fixa, só o ponto de início da listagem é aleatório. Isto significa, por exemplo, que se a primeira página aleatória na lista é <samp>Main Page</samp>, a página <samp>List of fictional monkeys</samp> será <em>sempre</em> a segunda, a página <samp>List of people on stamps of Vanuatu</samp> a terceira, etc.",
+       "apihelp-query+random-param-namespace": "Devolver só as páginas que estão nestes espaços nominais.",
+       "apihelp-query+random-param-limit": "Limitar o número de páginas aleatórias que serão devolvidas.",
+       "apihelp-query+random-param-redirect": "Em vez dele, usar <kbd>$1filterredir=redirects</kbd>.",
+       "apihelp-query+random-param-filterredir": "Como filtrar redirecionamentos.",
+       "apihelp-query+random-example-simple": "Devolver duas páginas aleatórias do espaço nominal principal.",
+       "apihelp-query+random-example-generator": "Devolver informação de página sobre duas páginas aleatórias do espaço nominal principal.",
+       "apihelp-query+recentchanges-description": "Enumerar as mudanças recentes.",
+       "apihelp-query+recentchanges-param-start": "A data e hora a partir da qual será começada a enumeração.",
+       "apihelp-query+recentchanges-param-end": "A data e hora na qual será terminada a enumeração.",
+       "apihelp-query+recentchanges-param-namespace": "Filtrar só as mudanças nestes espaços nominais.",
+       "apihelp-query+recentchanges-param-user": "Listar só as mudanças feitas por este utilizador.",
+       "apihelp-query+recentchanges-param-excludeuser": "Não listar as mudanças feitas por este utilizador.",
+       "apihelp-query+recentchanges-param-tag": "Listar só as mudanças marcadas com esta etiqueta.",
+       "apihelp-query+recentchanges-param-prop": "Incluir informações adicionais:",
+       "apihelp-query+recentchanges-paramvalue-prop-user": "Adiciona o utilizador responsável pela edição e marca se o utilizador é um endereço IP.",
+       "apihelp-query+recentchanges-paramvalue-prop-userid": "Adiciona o identificador do utilizador responsável pela edição.",
+       "apihelp-query+recentchanges-paramvalue-prop-comment": "Adiciona o comentário da edição.",
+       "apihelp-query+recentchanges-paramvalue-prop-parsedcomment": "Adiciona o comentário da edição, após análise sintática.",
+       "apihelp-query+recentchanges-paramvalue-prop-flags": "Adiciona as etiquetas da edição.",
+       "apihelp-query+recentchanges-paramvalue-prop-timestamp": "Adiciona a data e hora da edição.",
+       "apihelp-query+recentchanges-paramvalue-prop-title": "Adiciona o título de página da edição.",
+       "apihelp-query+recentchanges-paramvalue-prop-ids": "Adiciona o identificadores da página, das mudanças recentes, e das revisões nova e antiga.",
+       "apihelp-query+recentchanges-paramvalue-prop-sizes": "Adiciona os tamanhos antigo e novo da página em ''bytes''.",
+       "apihelp-query+recentchanges-paramvalue-prop-redirect": "Etiqueta a página se esta for um redirecionamento.",
+       "apihelp-query+recentchanges-paramvalue-prop-patrolled": "Etiqueta as edições que podem ser patrulhadas, marcando-as como patrulhadas ou não patrulhadas.",
+       "apihelp-query+recentchanges-paramvalue-prop-loginfo": "Adiciona informação de registo (identificador do registo, tipo de entrada, etc.) às entradas do registo.",
+       "apihelp-query+recentchanges-paramvalue-prop-tags": "Lista as etiquetas da entrada.",
+       "apihelp-query+recentchanges-paramvalue-prop-sha1": "Adiciona a soma de controlo do conteúdo para as entradas associadas com uma revisão.",
+       "apihelp-query+recentchanges-param-token": "Em substituição, usar <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>.",
+       "apihelp-query+recentchanges-param-show": "Mostrar só as entradas que correspondem a estes critérios. Por exemplo, para ver só as edições menores feitas por utilizadores autenticados, defina $1show=minor|!anon.",
+       "apihelp-query+recentchanges-param-limit": "O número total de mudanças a serem devolvidas.",
+       "apihelp-query+recentchanges-param-type": "Os tipos de mudanças a serem mostradas.",
+       "apihelp-query+recentchanges-param-toponly": "Listar só as alterações que são a revisão mais recente.",
+       "apihelp-query+recentchanges-param-generaterevisions": "Ao ser usado como gerador, gerar identificadores de revisões em vez de títulos. As entradas das mudanças recentes que não tenham identificadores de revisão associados (por exemplo, a maioria das entradas do registo) não geram nada.",
+       "apihelp-query+recentchanges-example-simple": "Listar as mudanças recentes.",
+       "apihelp-query+recentchanges-example-generator": "Obter informação de página acerca das mudanças recentes não patrulhadas.",
+       "apihelp-query+redirects-description": "Devolve todos os redirecionamentos para as páginas indicadas.",
+       "apihelp-query+redirects-param-prop": "As propriedades a serem obtidas:",
+       "apihelp-query+redirects-paramvalue-prop-pageid": "O identificador de página de cada redirecionamento.",
+       "apihelp-query+redirects-paramvalue-prop-title": "O título de cada redirecionamento.",
+       "apihelp-query+redirects-paramvalue-prop-fragment": "O fragmento de cada redirecionamento, se existir.",
+       "apihelp-query+redirects-param-namespace": "Incluir só as páginas destes espaços nominais.",
+       "apihelp-query+redirects-param-limit": "O número de redirecionamentos a serem devolvidos.",
+       "apihelp-query+redirects-param-show": "Mostrar só as páginas que correspondem a estes critérios:\n;fragment:Mostrar só os redirecionamentos com um fragmento.\n;!fragment:Mostrar só os redirecionamentos sem um fragmento.",
+       "apihelp-query+redirects-example-simple": "Obter uma lista dos redirecionamentos para a página [[Main Page]].",
+       "apihelp-query+redirects-example-generator": "Obter informação sobre todos os redirecionamentos para a página [[Main Page]].",
+       "apihelp-query+revisions-description": "Obter informação da revisão.\n\nPode ser usado de várias maneiras:\n# Obter dados sobre um conjunto de páginas (última revisão), definindo títulos ou identificadores de páginas.\n# Obter as revisões de uma página indicada, usando títulos ou identificadores de páginas, com início, fim ou limite.\n# Obter dados sobre um conjunto de revisões definindo identificadores de revisões.",
+       "apihelp-query+revisions-paraminfo-singlepageonly": "Só pode ser usado com uma única página (modo #2)",
+       "apihelp-query+revisions-param-startid": "O identificador de revisão a partir do qual será começada a enumeração.",
+       "apihelp-query+revisions-param-endid": "Terminar a enumeração de revisões neste identificador de revisão.",
+       "apihelp-query+revisions-param-start": "A data e hora da revisão a partir da qual será começada a enumeração.",
+       "apihelp-query+revisions-param-end": "A data e hora da revisão na qual será terminada a enumeração.",
+       "apihelp-query+revisions-param-user": "Incluir só as revisões deste utilizador.",
+       "apihelp-query+revisions-param-excludeuser": "Excluir as revisões deste utilizador.",
+       "apihelp-query+revisions-param-tag": "Listar só as revisões marcadas com esta etiqueta.",
+       "apihelp-query+revisions-param-token": "Que chaves obter para cada revisão.",
+       "apihelp-query+revisions-example-last5": "Obter as últimas 5 revisões da página <kbd>Main Page</kbd>.",
+       "apihelp-query+revisions-example-first5": "Obter as primeiras 5 revisões da página <kbd>Main Page</kbd>.",
+       "apihelp-query+revisions-example-first5-after": "Obter as primeiras 5 revisões da página <kbd>Main Page</kbd> feitas após 2006-05-01.",
+       "apihelp-query+revisions-example-first5-not-localhost": "Obter as primeiras 5 revisões da página <kbd>Main Page</kbd> que não foram feitas pelo utilizador anónimo <kbd>127.0.0.1</kbd>.",
+       "apihelp-query+revisions-example-first5-user": "Obter as primeiras 5 revisões da página <kbd>Main Page</kbd> feitas pelo utilizador <kbd>MediaWiki default</kbd>.",
+       "apihelp-query+revisions+base-param-prop": "As propriedades a serem obtidas para cada revisão:",
+       "apihelp-query+revisions+base-paramvalue-prop-ids": "O identificador da revisão.",
+       "apihelp-query+revisions+base-paramvalue-prop-flags": "As etiquetas da revisão (menor).",
+       "apihelp-query+revisions+base-paramvalue-prop-timestamp": "A data e hora da revisão.",
+       "apihelp-query+revisions+base-paramvalue-prop-user": "O utilizador que fez a revisão.",
+       "apihelp-query+revisions+base-paramvalue-prop-userid": "O identificador de utilizador do criador da revisão.",
+       "apihelp-query+revisions+base-paramvalue-prop-size": "O tamanho (em bytes) da revisão.",
+       "apihelp-query+revisions+base-paramvalue-prop-sha1": "O resumo criptográfico SHA-1 (na base 16) da revisão.",
+       "apihelp-query+revisions+base-paramvalue-prop-contentmodel": "O identificador do modelo de conteúdo da revisão.",
+       "apihelp-query+revisions+base-paramvalue-prop-comment": "O comentário do utilizador para a revisão.",
+       "apihelp-query+revisions+base-paramvalue-prop-parsedcomment": "O comentário do utilizador para a revisão, após a análise sintática.",
+       "apihelp-query+revisions+base-paramvalue-prop-content": "O texto da revisão.",
+       "apihelp-query+revisions+base-paramvalue-prop-tags": "As etiquetas para a revisão.",
+       "apihelp-query+revisions+base-paramvalue-prop-parsetree": "A árvore de análise XML do conteúdo da revisão (requer o modelo de conteúdo <code>$1</code>).",
+       "apihelp-query+search-param-search": "Procurar os títulos de página ou o conteúdo que corresponda a este valor. Pode usar o texto da pesquisa para invocar funcionalidades de pesquisa especiais, dependendo dos meios de pesquisa do servidor da wiki.",
+       "apihelp-query+search-param-what": "O tipo de pesquisa a executar.",
+       "apihelp-query+search-param-info": "Quais os metadados a serem devolvidos.",
+       "apihelp-query+search-param-prop": "As propriedades a serem devolvidas:",
+       "apihelp-query+search-paramvalue-prop-size": "Adiciona o tamanho da página em ''bytes''.",
+       "apihelp-query+search-paramvalue-prop-wordcount": "Adiciona o número de palavras da página.",
+       "apihelp-query+search-paramvalue-prop-timestamp": "Adiciona a data e hora a que a página foi editada pela última vez.",
+       "apihelp-query+search-paramvalue-prop-snippet": "Adiciona um fragmento de código com a página, após análise sintática.",
+       "apihelp-query+search-paramvalue-prop-titlesnippet": "Adiciona um fragmento de código com o título da página, após análise sintática.",
+       "apihelp-query+search-paramvalue-prop-redirectsnippet": "Adiciona um fragmento de código com o título redirecionado, após análise sintática.",
+       "apihelp-query+search-paramvalue-prop-redirecttitle": "Adiciona o título do redirecionamento correspondente.",
+       "apihelp-query+search-paramvalue-prop-sectionsnippet": "Adiciona um fragmento de código com o título da secção correspondente, após análise sintática.",
+       "apihelp-query+search-paramvalue-prop-sectiontitle": "Adiciona o título da secção correspondente.",
+       "apihelp-query+search-paramvalue-prop-categorysnippet": "Adiciona um fragmento de código com a categoria correspondente, após análise sintática.",
+       "apihelp-query+search-paramvalue-prop-isfilematch": "Adiciona um valor booleano que indica se a pesquisa encontrou correspondência no conteúdo de ficheiros.",
+       "apihelp-query+search-paramvalue-prop-score": "<span class=\"apihelp-deprecated\">Obsoleto e ignorado.</span>",
+       "apihelp-query+search-paramvalue-prop-hasrelated": "<span class=\"apihelp-deprecated\">Obsoleto e ignorado.</span>",
+       "apihelp-query+search-param-limit": "O número total de páginas a serem devolvidas.",
+       "apihelp-query+search-param-interwiki": "Incluir resultados interwikis na pesquisa, se disponíveis.",
+       "apihelp-query+search-param-backend": "O servidor de pesquisas a ser usado, se diferente do servidor padrão.",
        "apihelp-query+search-param-enablerewrites": "Ativar reescrita da consulta interna. Alguns motores de busca podem reescrever a consulta, substituindo-a por outra que consideram que dará melhores resultados, como acontece na correção de erros de ortografia.",
+       "apihelp-query+search-example-simple": "Procurar <kbd>meaning</kbd>.",
+       "apihelp-query+search-example-generator": "Obter informação sobre as páginas devolvidas por uma pesquisa do termo <kbd>meaning</kbd>.",
+       "apihelp-query+siteinfo-description": "Devolver informação geral sobre o ''site''.",
+       "apihelp-query+siteinfo-param-prop": "A informação a ser obtida:",
+       "apihelp-query+siteinfo-paramvalue-prop-general": "Informação global do sistema.",
+       "apihelp-query+siteinfo-paramvalue-prop-namespaces": "Uma lista dos espaços nominais registados e dos seus nomes canónicos.",
+       "apihelp-query+siteinfo-paramvalue-prop-namespacealiases": "Uma lista dos nomes alternativos dos espaços nominais registados.",
+       "apihelp-query+siteinfo-paramvalue-prop-specialpagealiases": "Uma lista dos nomes alternativos das páginas especiais.",
+       "apihelp-query+siteinfo-paramvalue-prop-magicwords": "Uma lista das palavras mágicas e dos seus nomes alternativos.",
+       "apihelp-query+siteinfo-paramvalue-prop-statistics": "Devolve as estatísticas do ''site''.",
+       "apihelp-query+siteinfo-paramvalue-prop-interwikimap": "Devolve o mapa de interwikis (opcionalmente filtrado, opcionalmente localizado usando <var>$1inlanguagecode</var>).",
+       "apihelp-query+siteinfo-paramvalue-prop-dbrepllag": "Devolve o servidor da base de dados com o maior atraso de replicação.",
+       "apihelp-query+siteinfo-paramvalue-prop-usergroups": "Devolve os grupos de utilizadores e as permissões associadas.",
+       "apihelp-query+siteinfo-paramvalue-prop-libraries": "Devolve as bibliotecas instaladas na wiki.",
+       "apihelp-query+siteinfo-paramvalue-prop-extensions": "Devolve as extensões instaladas na wiki.",
+       "apihelp-query+siteinfo-paramvalue-prop-fileextensions": "Devolve uma lista das extensões (tipos) dos ficheiros que podem ser carregados.",
+       "apihelp-query+siteinfo-paramvalue-prop-rightsinfo": "Devolve informação sobre os direitos (a licença) da wiki, se disponível.",
+       "apihelp-query+siteinfo-paramvalue-prop-restrictions": "Devolve informação sobre os tipos de restrição (proteção) disponíveis.",
+       "apihelp-query+siteinfo-paramvalue-prop-languages": "Devolve uma lista das línguas que o MediaWiki suporta (opcionalmente localizada, usando <var>$1inlanguagecode</var>).",
+       "apihelp-query+siteinfo-paramvalue-prop-skins": "Devolve uma lista de todos os temas ativados (opcionalmente localizada, usando <var>$1inlanguagecode</var>, ou então na língua do conteúdo).",
+       "apihelp-query+siteinfo-paramvalue-prop-extensiontags": "Devolve uma lista dos elementos de extensões do analisador sintático.",
+       "apihelp-query+siteinfo-paramvalue-prop-functionhooks": "Devolve uma lista dos ''hooks'' de funções do analisador sintático.",
+       "apihelp-query+siteinfo-paramvalue-prop-showhooks": "Devolve uma lista de todos os ''hooks'' subscritos (conteúdo de <var>[[mw:Manual:$wgHooks|$wgHooks]]</var>).",
+       "apihelp-query+siteinfo-paramvalue-prop-variables": "Devolve uma lista de identificadores de variáveis.",
+       "apihelp-query+siteinfo-paramvalue-prop-protocols": "Devolve uma lista dos protocolos permitidos nos ''links'' externos.",
+       "apihelp-query+siteinfo-paramvalue-prop-defaultoptions": "Devolve os valores padrão para as preferências dos utilizadores.",
+       "apihelp-query+siteinfo-paramvalue-prop-uploaddialog": "Devolve a configuração do diálogo de carregamento.",
+       "apihelp-query+siteinfo-param-filteriw": "Devolver só as entradas locais, ou só as não locais, do mapa de interwikis.",
+       "apihelp-query+siteinfo-param-showalldb": "Listar todos os servidores da base de dados, não só aquele que tem maior atraso.",
+       "apihelp-query+siteinfo-param-numberingroup": "Lista o número de utilizadores nos grupos de utilizadores.",
+       "apihelp-query+siteinfo-param-inlanguagecode": "Código de língua dos nomes localizados (o melhor possível) das línguas e temas.",
+       "apihelp-query+siteinfo-example-simple": "Obter informação do ''site''.",
+       "apihelp-query+siteinfo-example-interwiki": "Obter uma lista dos prefixos interwikis locais.",
+       "apihelp-query+siteinfo-example-replag": "Verificar o atraso de replicação atual.",
+       "apihelp-query+stashimageinfo-description": "Devolve informações dos ficheiros escondidos.",
+       "apihelp-query+stashimageinfo-param-filekey": "Chave que identifica um carregamento anterior que foi escondido temporariamente.",
+       "apihelp-query+stashimageinfo-param-sessionkey": "Nome alternativo de $1filekey, para compatibilidade com versões anteriores.",
+       "apihelp-query+stashimageinfo-example-simple": "Devolve informação sobre um ficheiro escondido.",
+       "apihelp-query+stashimageinfo-example-params": "Devolve as miniaturas de dois ficheiros escondidos.",
+       "apihelp-query+tags-description": "Listar as etiquetas de modificação.",
+       "apihelp-query+tags-param-limit": "O número máximo de etiquetas a serem listadas.",
+       "apihelp-query+tags-param-prop": "As propriedades a serem obtidas:",
+       "apihelp-query+tags-paramvalue-prop-name": "Adiciona o nome da etiqueta.",
+       "apihelp-query+tags-paramvalue-prop-displayname": "Adiciona a mensagem de sistema para a etiqueta.",
+       "apihelp-query+tags-paramvalue-prop-description": "Adiciona a descrição da etiqueta.",
+       "apihelp-query+tags-paramvalue-prop-hitcount": "Adiciona o número de revisões e de entradas no registo que têm esta etiqueta.",
+       "apihelp-query+tags-paramvalue-prop-defined": "Indicar se a etiqueta está definida.",
+       "apihelp-query+tags-paramvalue-prop-source": "Obter as fontes da etiqueta, que podem incluir <samp>extension</samp> para etiquetas definidas por extensões e <samp>manual</samp> para etiquetas que podem ser manualmente aplicadas pelos utilizadores.",
+       "apihelp-query+tags-paramvalue-prop-active": "Indica se a etiqueta ainda está a ser aplicada.",
+       "apihelp-query+tags-example-simple": "Listar as etiquetas disponíveis.",
+       "apihelp-query+templates-description": "Devolve todas as páginas que são transcluídas nas páginas indicadas.",
+       "apihelp-query+templates-param-namespace": "Mostrar só as predefinições nestes espaços nominais.",
+       "apihelp-query+templates-param-limit": "O número de predefinições a serem devolvidas.",
+       "apihelp-query+templates-param-templates": "Listar só estas predefinições. Útil para verificar se uma determinada página contém uma determinada predefinição.",
+       "apihelp-query+templates-param-dir": "A direção de listagem.",
+       "apihelp-query+templates-example-simple": "Obter as predefinições usadas na página <kbd>Main Page</kbd>.",
+       "apihelp-query+templates-example-generator": "Obter informação sobre as páginas das predefinições usadas na página <kbd>Main Page</kbd>.",
+       "apihelp-query+templates-example-namespaces": "Obter as páginas dos espaços nominais {{ns:user}} e {{ns:template}} que são transcluídas na página <kbd>Main Page</kbd>.",
+       "apihelp-query+tokens-description": "Obtém chaves para operações de modificação de dados.",
+       "apihelp-query+tokens-param-type": "Tipos de chave a pedir.",
+       "apihelp-query+tokens-example-simple": "Obter uma chave csfr (padrão).",
+       "apihelp-query+tokens-example-types": "Obter uma chave de vigilância e uma chave de patrulha.",
+       "apihelp-query+transcludedin-description": "Obter todas as páginas que transcluem as páginas indicadas.",
+       "apihelp-query+transcludedin-param-prop": "As propriedades a serem obtidas:",
+       "apihelp-query+transcludedin-paramvalue-prop-pageid": "O identificador de cada página.",
+       "apihelp-query+transcludedin-paramvalue-prop-title": "O título de cada página.",
+       "apihelp-query+transcludedin-paramvalue-prop-redirect": "Indicar se a página é um redirecionamento.",
+       "apihelp-query+transcludedin-param-namespace": "Incluir só as páginas nestes espaços nominais.",
+       "apihelp-query+transcludedin-param-limit": "O número de entradas a serem devolvidas.",
+       "apihelp-query+transcludedin-param-show": "Mostrar só as entradas que correspondem a estes critérios:\n;redirect:Mostrar só os redirecionamentos.\n;!redirect:Mostrar só as que não são redirecionamentos.",
+       "apihelp-query+transcludedin-example-simple": "Obter uma lista das páginas que transcluem <kbd>Main Page</kbd>.",
+       "apihelp-query+transcludedin-example-generator": "Obter informação sobre as páginas que transcluem <kbd>Main Page</kbd>.",
+       "apihelp-query+usercontribs-description": "Obter todas as edições de um utilizador.",
+       "apihelp-query+usercontribs-param-limit": "O número máximo de contribuições a serem devolvidas.",
+       "apihelp-query+usercontribs-param-start": "A data e hora da contribuição pela qual será começada a devolução de resultados.",
+       "apihelp-query+usercontribs-param-end": "A data e hora da contribuição na qual será terminada a devolução de resultados.",
+       "apihelp-query+usercontribs-param-namespace": "Listar só as contribuições nestes espaços nominais.",
+       "apihelp-query+usercontribs-paramvalue-prop-ids": "Adiciona os identificadores da página e da revisão.",
+       "apihelp-query+usercontribs-paramvalue-prop-timestamp": "Adiciona a data e hora da edição.",
+       "apihelp-query+usercontribs-paramvalue-prop-parsedcomment": "Adiciona o comentário da edição, após análise sintática.",
+       "apihelp-query+usercontribs-paramvalue-prop-sizediff": "Adiciona a diferença de tamanho entre a edição e a sua progenitora.",
+       "apihelp-query+usercontribs-paramvalue-prop-flags": "Adiciona indicações da edição.",
+       "apihelp-query+usercontribs-param-tag": "Listar só as revisões marcadas com esta etiqueta.",
+       "apihelp-query+usercontribs-param-toponly": "Listar só as alterações que são a revisão mais recente.",
+       "apihelp-query+usercontribs-example-ipprefix": "Mostrar as contribuições de todos os endereços IP com o prefixo <kbd>192.0.2.</kbd>.",
+       "apihelp-query+userinfo-param-prop": "As informações que devem ser incluídas:",
+       "apihelp-query+userinfo-paramvalue-prop-hasmsg": "Adiciona uma etiqueta <samp>messages</samp> se o utilizador atual tem mensagens pendentes.",
+       "apihelp-query+userinfo-paramvalue-prop-preferencestoken": "<span class=\"apihelp-deprecated\">Obsoleto.</span> Obter uma chave para alterar as preferências do utilizador atual.",
+       "apihelp-query+userinfo-paramvalue-prop-editcount": "Adiciona a contagem de edições do utilizador atual.",
+       "apihelp-query+userinfo-paramvalue-prop-realname": "Adiciona o nome real do utilizador.",
+       "apihelp-query+userinfo-paramvalue-prop-email": "Adicionar o correio eletrónico do utilizador e a data de autenticação do correio eletrónico.",
+       "apihelp-query+userinfo-paramvalue-prop-registrationdate": "Adiciona a data de registo do utilizador.",
+       "apihelp-query+userinfo-paramvalue-prop-unreadcount": "Adiciona a contagem de páginas não lidas da lista de páginas vigiadas do utilizador (máximo $1; devolve <samp>$2</samp> se forem mais).",
+       "apihelp-query+userinfo-paramvalue-prop-centralids": "Adiciona os identificadores centrais e o estado de ligação central (''attachment'') do utilizador.",
+       "apihelp-query+users-param-prop": "As informações que devem ser incluídas:",
+       "apihelp-query+users-paramvalue-prop-editcount": "Adiciona a contagem de edições do utilizador.",
+       "apihelp-query+users-paramvalue-prop-registration": "Adiciona a data e hora de registo do utilizador.",
+       "apihelp-query+users-paramvalue-prop-centralids": "Adiciona os identificadores centrais e o estado de ligação central (''attachment'') do utilizador.",
+       "apihelp-query+users-param-token": "Em substituição, usar <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>.",
+       "apihelp-query+watchlist-description": "Obter mudanças recentes das páginas vigiadas do utilizador atual.",
+       "apihelp-query+watchlist-param-start": "A data e hora da mudança recente a partir da qual será começada a enumeração.",
+       "apihelp-query+watchlist-param-end": "A data e hora da mudança recente na qual será terminada a enumeração.",
+       "apihelp-query+watchlist-param-user": "Listar só as alterações deste utilizador.",
+       "apihelp-query+watchlist-param-limit": "O número total de resultados a serem devolvidos por pedido.",
+       "apihelp-query+watchlist-param-prop": "As propriedades adicionais que devem ser obtidas:",
+       "apihelp-query+watchlist-paramvalue-prop-ids": "Adiciona identificadores de revisões e de páginas.",
+       "apihelp-query+watchlist-paramvalue-prop-flags": "Adiciona etiquetas para a edição.",
+       "apihelp-query+watchlist-paramvalue-prop-userid": "Adiciona o identificador do utilizador que realizou a edição.",
+       "apihelp-query+watchlist-paramvalue-prop-parsedcomment": "Adiciona o comentário da edição, após análise sintática.",
+       "apihelp-query+watchlist-paramvalue-prop-timestamp": "Adiciona a data e hora da edição.",
+       "apihelp-query+watchlist-paramvalue-prop-sizes": "Adiciona os tamanhos novo e antigo da página.",
+       "apihelp-query+watchlist-paramvalue-prop-notificationtimestamp": "Adiciona a data e hora da última vez em que o utilizador foi notificado da edição.",
+       "apihelp-query+watchlist-paramvalue-prop-loginfo": "Adiciona informação do registo quando apropriado.",
+       "apihelp-query+watchlist-param-type": "Os tipos de alterações a serem mostradas:",
        "apihelp-query+watchlist-param-owner": "Usado com $1token para aceder à lista de páginas vigiadas de outro utilizador.",
        "apihelp-query+watchlist-param-token": "Uma chave de segurança (disponível nas [[Special:Preferences#mw-prefsection-watchlist|preferências]] do utilizador) para permitir acesso à lista de páginas vigiadas de outro utilizador.",
-       "apihelp-query+watchlistraw-param-owner": "Usado com $1token para aceder à lista de páginas vigiadas de outro utilizador.",
+       "apihelp-query+watchlist-example-props": "Obter informação adicional sobre a revisão mais recente das páginas vigiadas do utilizador atual que tenham sido alteradas.",
+       "apihelp-query+watchlist-example-generator": "Obter informações das páginas na lista de páginas vigiadas do utilizador atual que tenham sido recentemente alteradas.",
+       "apihelp-query+watchlist-example-wlowner": "Listar a revisão mais recente das páginas na lista de páginas vigiadas do utilizador <kbd>Example</kbd> que tenham sido recentemente alteradas.",
+       "apihelp-query+watchlistraw-param-namespace": "Listar só as páginas nos espaços nominais indicados.",
+       "apihelp-query+watchlistraw-param-limit": "O número total de resultados a serem devolvidos por pedido.",
+       "apihelp-query+watchlistraw-param-prop": "As propriedades adicionais que devem ser obtidas:",
+       "apihelp-query+watchlistraw-paramvalue-prop-changed": "Adiciona a data e hora da última vez em que o utilizador foi notificado da edição.",
+       "apihelp-query+watchlistraw-param-show": "Listar só os elementos que preenchem estes critérios.",
+       "apihelp-query+watchlistraw-param-owner": "Usado em conjunto com o parâmetro $1token para aceder à lista de páginas vigiadas de outro utilizador.",
        "apihelp-query+watchlistraw-param-token": "Uma chave de segurança (disponível nas [[Special:Preferences#mw-prefsection-watchlist|preferências]] do utilizador) para permitir acesso à lista de páginas vigiadas de outro utilizador.",
+       "apihelp-query+watchlistraw-param-dir": "A direção de listagem.",
+       "apihelp-query+watchlistraw-param-fromtitle": "O título (com o prefixo do espaço nominal) a partir do qual será começada a enumeração.",
+       "apihelp-query+watchlistraw-param-totitle": "O título (com o prefixo do espaço nominal) no qual será terminada a enumeração.",
+       "apihelp-query+watchlistraw-example-simple": "Listar as páginas na lista de páginas vigiadas do utilizador atual.",
+       "apihelp-query+watchlistraw-example-generator": "Obter informações das páginas na lista de páginas vigiadas do utilizador atual.",
+       "apihelp-removeauthenticationdata-description": "Remover os dados de autenticação do utilizador atual.",
+       "apihelp-rollback-param-watchlist": "Adicionar ou remover incondicionalmente a página da lista de páginas vigiadas do utilizador atual, usar as preferências ou não alterar o estado de vigilância.",
+       "apihelp-rollback-example-summary": "Reverter as últimas edições da página <kbd>Main Page</kbd> pelo utilizador IP <kbd>192.0.2.5</kbd> com o resumo <kbd>Reverting vandalism</kbd>, e marcar essas edições e a reversão como edições de robôs.",
+       "apihelp-setnotificationtimestamp-description": "Atualizar a data e hora de notificação de alterações às páginas vigiadas.\n\nIsto afeta o realce das páginas alteradas, na lista de páginas vigiadas e no histórico, e o envio de mensagens de correio quando a preferência \"{{int:tog-enotifwatchlistpages}}\" está ativada.",
+       "apihelp-setnotificationtimestamp-param-timestamp": "A data e hora a definir como data e hora da notificação.",
+       "apihelp-setnotificationtimestamp-param-torevid": "A revisão para a qual definir a data e hora de notificação (só uma página).",
+       "apihelp-setnotificationtimestamp-param-newerthanrevid": "A revisão da qual definir que a data e hora de notificação é mais recente (só uma página).",
+       "apihelp-setnotificationtimestamp-example-all": "Reiniciar o estado de notificação de todas as páginas vigiadas.",
+       "apihelp-setnotificationtimestamp-example-pagetimestamp": "Definir a data e hora de notificação para a página <kbd>Main page</kbd> de forma a que todas as edições desde 1 de janeiro de 2012 passem a ser consideradas não vistas",
+       "apihelp-setnotificationtimestamp-example-allpages": "Reiniciar o estado de notificação das páginas no espaço nominal <kbd>{{ns:user}}</kbd>.",
+       "apihelp-stashedit-description": "Preparar uma edição na <i>cache</i> partilhada.\n\nIsto destina-se a ser usado via AJAX a partir do formulário de edição, para melhorar o desempenho da gravação da página.",
+       "apihelp-stashedit-param-title": "Título da página que está a ser editada.",
+       "apihelp-tokens-description": "Obter chaves para operações de modificação de dados.\n\nEste módulo é obsoleto e foi substituído por [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].",
+       "apihelp-tokens-param-type": "Tipos de chave a pedir.",
+       "apihelp-tokens-example-edit": "Obter uma chave de edição (padrão).",
+       "apihelp-tokens-example-emailmove": "Obter uma chave de correio eletrónico e uma chave de movimentação.",
        "apihelp-unblock-description": "Desbloquear um utilizador.",
+       "apihelp-unblock-param-id": "Identificador do bloqueio a desfazer (obtido com <kbd>list=blocks</kbd>). Não pode ser usado em conjunto com <var>$1user</var>.",
+       "apihelp-unblock-param-user": "Nome de utilizador, endereço IP ou gama de endereços IP a desbloquear. Não pode ser usado em conjunto com <var>$1id</var>.",
        "apihelp-unblock-param-reason": "Motivo para o desbloqueio.",
+       "apihelp-unblock-example-id": "Desfazer o bloqueio com o identificador #<kbd>105</kbd>.",
+       "apihelp-unblock-example-user": "Desbloquear o utilizador <kbd>Bob</kbd> com o motivo <kbd>Sorry Bob</kbd>.",
        "apihelp-undelete-param-title": "Título da página a restaurar.",
+       "apihelp-undelete-param-watchlist": "Adicionar ou remover incondicionalmente a página da lista de páginas vigiadas do utilizador atual, usar as preferências ou não alterar o estado de vigilância.",
        "apihelp-upload-param-watch": "Vigiar página.",
+       "apihelp-upload-param-watchlist": "Adicionar ou remover incondicionalmente a página da lista de páginas vigiadas do utilizador atual, usar as preferências ou não alterar o estado de vigilância.",
        "apihelp-upload-param-ignorewarnings": "Ignorar todos os avisos.",
+       "apihelp-upload-param-url": "URL de onde obter o ficheiro.",
+       "apihelp-upload-example-url": "Carregar de um URL.",
        "apihelp-userrights-param-user": "Nome de utilizador(a).",
        "apihelp-userrights-param-userid": "ID de utilizador.",
        "apihelp-userrights-param-add": "Adicionar o utilizador a estes grupos.",
        "apihelp-userrights-param-remove": "Remover este utilizador destes grupos.",
+       "apihelp-watch-description": "Adicionar ou remover páginas da lista de páginas vigiadas do utilizador atual.",
        "apihelp-watch-example-unwatch": "Deixar de vigiar a página <kbd>Página Principal</kbd>.",
-       "apihelp-json-description": "Dados de saída em formato JSON.",
-       "api-help-title": "Ajuda API da MediaWiki",
-       "api-help-lead": "Esta é uma página de documentação API do MediaWiki gerada automaticamente.\n\nDocumentação e exemplos: https://www.mediawiki.org/wiki/API",
+       "apihelp-json-description": "Produzir dados de saída no formato JSON.",
+       "apihelp-xml-param-xslt": "Se especificado, adiciona a página nomeada como uma folha de estilo XSL. O valor tem de ser um título no espaço nominal {{ns:mediawiki}} e acabar em <code>.xsl</code>.",
+       "api-help-title": "Ajuda da API do MediaWiki",
+       "api-help-lead": "Esta é uma página de documentação da API do MediaWiki gerada automaticamente.\n\nDocumentação e exemplos: https://www.mediawiki.org/wiki/API",
        "api-help-main-header": "Módulo principal",
-       "api-help-flag-deprecated": "Este módulo está obsoleto.",
+       "api-help-flag-deprecated": "Este módulo é obsoleto.",
+       "api-help-flag-internal": "<strong>Este módulo é interno ou instável.</strong> O seu funcionamento pode ser alterado sem aviso prévio.",
        "api-help-flag-readrights": "Este módulo requer direitos de leitura.",
-       "api-help-flag-writerights": "Este módulo requer direitos de leitura.",
-       "api-help-flag-mustbeposted": "Este módulo aceita somente solicitações POST.",
+       "api-help-flag-writerights": "Este módulo requer direitos de escrita.",
+       "api-help-flag-mustbeposted": "Este módulo só aceita pedidos POST.",
+       "api-help-flag-generator": "Este módulo pode ser usado como gerador.",
        "api-help-source": "Fonte: $1",
+       "api-help-source-unknown": "Fonte: <span class=\"apihelp-unknown\">desconhecida</span>",
        "api-help-license": "Licença: [[$1|$2]]",
        "api-help-license-noname": "Licença: [[$1|Ver ligação]]",
        "api-help-license-unknown": "Licença: <span class=\"apihelp-unknown\">desconhecida</span>",
        "api-help-param-deprecated": "Obsoleto.",
        "api-help-param-required": "Este parâmetro é obrigatório.",
        "api-help-datatypes-header": "Tipo de dados",
-       "api-help-datatypes": "Alguns tipos de parâmetro na API necessitam de mais explicações:\n;boolean\n:Os parâmetros booleanos funcionam como as caixas de seleção HTML: se o parâmetro for especificado, independentemente do valor, é considerado verdadeiro. Para um valor falso, omitir o parâmetro completo.\n;timestamp\n:Timestamps podem ser especificados em vários formatos. Formato de data e hora ISO 8601 é recomendado. Todos os horários estão em UTC, qualquer inclusão de fuso horário é ignorado.\n:* Data e hora ISO 8601, <kbd><var>2001</var>-<var>01</var>-<var>15</var>T<var>14</var>:<var>56</var>:<var>00</var>Z</kbd> (pontuação e <kbd>Z</kbd> são opcionais)\n:* Data e hora ISO 8601 com segundos fracionários (ignorado), <kbd><var>2001</var>-<var>01</var>-<var>15</var>T<var>14</var>:<var>56</var>:<var>00</var>.<var>00001</var>Z</kbd> (traços, dois pontos e <kbd>Z</kbd> são opcionais)\n:* Formato do MediaWiki, <kbd><var>2001</var><var>01</var><var>15</var><var>14</var><var>56</var><var>00</var></kbd>\n:* Formato numérico genérico, <kbd><var>2001</var>-<var>01</var>-<var>15</var> <var>14</var>:<var>56</var>:<var>00</var></kbd> (fuso horário opcional do <kbd>GMT</kbd>, <kbd>+<var>##</var></kbd>, or <kbd>-<var>##</var></kbd> são ignorados)\n:* Formato EXIF, <kbd><var>2001</var>:<var>01</var>:<var>15</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:*Formato RFC 2822 (o fuso horário pode ser omitido), <kbd><var>Mon</var>, <var>15</var> <var>Jan</var> <var>2001</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* Formato RFC 850 (o fuso horário pode ser omitido), <kbd><var>Monday</var>, <var>15</var>-<var>Jan</var>-<var>2001</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* Formato C ctime, <kbd><var>Mon</var> <var>Jan</var> <var>15</var> <var>14</var>:<var>56</var>:<var>00</var> <var>2001</var></kbd>\n:* Segundos desde 1970-01-01T00:00:00Z como um inteiro de 1 a 13 dígitos (excluindo <kbd>0</kbd>)\n:* A string <kbd>now</kbd>",
+       "api-help-datatypes": "O formato de entrada para o MediaWiki deve ser UTF-8 normalizado de acordo com a norma NFC. O MediaWiki pode converter outros tipos de entrada, mas isto pode causar a falha de algumas operações (tais como [[Special:ApiHelp/edit|edições]] com verificações MD5).\n\nAlguns tipos de parâmetros nos pedidos à API necessitam de mais explicações:\n;boolean\n:Os parâmetros booleanos funcionam como as caixas de seleção HTML: se o parâmetro for especificado, independentemente do valor, é considerado verdadeiro. Para um valor falso, omitir o parâmetro completo.\n;timestamp\n:As datas e horas podem ser especificados em vários formatos. O formato de data e hora ISO 8601 é recomendado. Todas as horas estão em UTC, qualquer inclusão de fuso horário é ignorada.\n:* Data e hora ISO 8601, <kbd><var>2001</var>-<var>01</var>-<var>15</var>T<var>14</var>:<var>56</var>:<var>00</var>Z</kbd> (pontuação e <kbd>Z</kbd> são opcionais)\n:* Data e hora ISO 8601 com segundos fracionários (ignorado), <kbd><var>2001</var>-<var>01</var>-<var>15</var>T<var>14</var>:<var>56</var>:<var>00</var>.<var>00001</var>Z</kbd> (traços, dois pontos e <kbd>Z</kbd> são opcionais)\n:* Formato do MediaWiki, <kbd><var>2001</var><var>01</var><var>15</var><var>14</var><var>56</var><var>00</var></kbd>\n:* Formato numérico genérico, <kbd><var>2001</var>-<var>01</var>-<var>15</var> <var>14</var>:<var>56</var>:<var>00</var></kbd> (fuso horário opcional de <kbd>GMT</kbd>, <kbd>+<var>##</var></kbd>, ou <kbd>-<var>##</var></kbd> são ignorados)\n:* Formato EXIF, <kbd><var>2001</var>:<var>01</var>:<var>15</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:*Formato RFC 2822 (o fuso horário pode ser omitido), <kbd><var>Mon</var>, <var>15</var> <var>Jan</var> <var>2001</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* Formato RFC 850 (o fuso horário pode ser omitido), <kbd><var>Monday</var>, <var>15</var>-<var>Jan</var>-<var>2001</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* Formato C ctime, <kbd><var>Mon</var> <var>Jan</var> <var>15</var> <var>14</var>:<var>56</var>:<var>00</var> <var>2001</var></kbd>\n:* Segundos desde 1970-01-01T00:00:00Z como um inteiro de 1 a 13 dígitos (excluindo <kbd>0</kbd>)\n:* O texto <kbd>now</kbd>\n;separador alternativo de valores múltiplos\n:Os parâmetros que aceitam vários valores são normalmente fornecidos com os valores separados por uma barra vertical (<i>pipe</i>), por exemplo <kbd>parâmetro=valor1|valor2</kbd> ou <kbd>parâmetro=valor1%7Cvalor2</kbd>. Se um valor contém a barra vertical, use U+001F (Separador de Unidades) como separador ''e'' prefixe o valor com U+001F, isto é, <kbd>parâmetro=%1Fvalor1%1Fvalor2</kbd>.",
        "api-help-param-type-limit": "Tipo: inteiro ou <kbd>max</kbd>",
-       "api-help-param-type-boolean": "Tipo: boolean ([[Special:ApiHelp/main#main/datatypes|detalhes]])",
+       "api-help-param-type-integer": "Tipo: {{PLURAL:$1|1=inteiro|2=lista de números inteiros}}",
+       "api-help-param-type-boolean": "Tipo: booleano ([[Special:ApiHelp/main#main/datatypes|detalhes]])",
+       "api-help-param-type-timestamp": "Tipo: {{PLURAL:$1|1=data e hora|2=lista de datas e horas}} ([[Special:ApiHelp/main#main/datatypes|formatos permitidos]])",
        "api-help-param-type-user": "Tipo: {{PLURAL:$1|1=nome de utilizador|2=lista de nomes de utilizadores}}",
-       "api-help-param-list": "{{PLURAL:$1|1=Um dos seguintes valores|2=Valores (separar com <kbd>{{!}}</kbd>)}}: $2",
-       "api-help-param-multi-separate": "Separe os valores com <kbd>|</kbd>.",
+       "api-help-param-list": "{{PLURAL:$1|1=Um dos seguintes valores|2=Valores (separados com <kbd>{{!}}</kbd> ou [[Special:ApiHelp/main#main/datatypes|alternativas]])}}: $2",
+       "api-help-param-list-can-be-empty": "{{PLURAL:$1|0=Tem de estar vazio|Pode estar vazio, ou ser $2}}",
+       "api-help-param-limit": "Não são permitidos mais do que: $1",
+       "api-help-param-limit2": "Não são permitidos mais do que $1 ($2 para robôs).",
+       "api-help-param-integer-min": "{{PLURAL:$1|1=O valor não pode ser inferior a|2=Os valores não podem ser inferiores a}} $2.",
+       "api-help-param-integer-max": "{{PLURAL:$1|1=O valor não pode ser superior a|2=Os valores não podem ser superiores a}} $3.",
+       "api-help-param-integer-minmax": "{{PLURAL:$1|1=O valor tem de estar compreendido|2=Os valores têm de estar compreendidos}} entre $2 e $3.",
+       "api-help-param-upload": "Tem ser enviado (<i>posted</i>) como um carregamento de ficheiro usando multipart/form-data.",
+       "api-help-param-multi-separate": "Separar os valores com <kbd>|</kbd> ou [[Special:ApiHelp/main#main/datatypes|alternativas]].",
        "api-help-param-multi-max": "O número máximo de valores é {{PLURAL:$1|$1}} ({{PLURAL:$2|$2}} para robôs).",
-       "api-help-param-default": "Padrão: $1",
+       "api-help-param-default": "Valor por omissão: $1",
        "api-help-param-default-empty": "Padrão: <span class=\"apihelp-empty\">(vazio)</span>",
+       "api-help-param-token": "Uma chave \"$1\" obtida de [[Special:ApiHelp/query+tokens|action=query&meta=tokens]]",
+       "api-help-param-token-webui": "Para efeitos de compatibilidade, a chave usada na interface <i>web</i> também é aceite.",
+       "api-help-param-disabled-in-miser-mode": "Desativado devido ao [[mw:Manual:$wgMiserMode|modo avarento]] (<i>miser mode</i>).",
+       "api-help-param-limited-in-miser-mode": "<strong>Nota:</strong> devido ao [[mw:Manual:$wgMiserMode|modo avarento]]  (<i>miser mode</i>), usar isto pode resultar na devolução de menos de <var>$1limit</var> resultados antes de continuar; em casos extremos pode não ser devolvido qualquer resultado.",
+       "api-help-param-direction": "A direção da enumeração:\n;newer:Listar o mais antigo primeiro. Nota: $1start tem de estar antes de $1end.\n;older:Listar o mais recente primeiro (padrão). Nota: $1start tem de estar depois de $1end.",
+       "api-help-param-continue": "Quando houver mais resultados disponíveis, usar isto para continuar",
        "api-help-param-no-description": "<span class=\"apihelp-empty\">(sem descrição)</span>",
        "api-help-examples": "{{PLURAL:$1|Exemplo|Exemplos}}:",
-       "api-help-permissions": "{{PLURAL:$1|Permissão|Permissiões}}:",
+       "api-help-permissions": "{{PLURAL:$1|Permissão|Permissões}}:",
        "api-help-permissions-granted-to": "{{PLURAL:$1|Concedida a|Concedidas a}}: $2",
+       "api-help-right-apihighlimits": "Usar limites mais altos em consultas da API (consultas lentas: $1; consultas rápidas: $2). Os limites para consultas lentas também se aplicam a parâmetros com vários valores.",
        "api-help-open-in-apisandbox": "<small>[abrir na página de testes]</small>",
+       "api-help-authmanager-general-usage": "O procedimento geral para usar este módulo é:\n# Obtenha os campos disponíveis usando <kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd> com <kbd>amirequestsfor=$4</kbd> e uma chave <kbd>$5</kbd> obtida de <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>.\n# Apresente os campos ao utilizador e obtenha os dados fornecidos por este.\n# Publique-os para este módulo, fornecendo <var>$1returnurl</var> e quaisquer campos relevantes.\n# Verifique o valor de <samp>status</samp> na resposta.\n#* Se recebeu <samp>PASS</samp> ou <samp>FAIL</samp>, terminou. A operação terá tido sucesso ou falhado.\n#* Se recebeu <samp>UI</samp>, apresente os novos campos ao utilizador e obtenha os dados fornecidos por este. Depois publique-os para este módulo com <var>$1continue</var> e os campos relevantes preenchidos, e repita o passo 4.\n#* Se recebeu <samp>REDIRECT</samp>, encaminhe o utilizador para <samp>redirecttarget</samp> e aguarde o retorno para o URL <var>$1returnurl</var>. Depois publique para este módulo com <var>$1continue</var> quaisquer campos que tenham sido passados ao URL de retorno, e repita o passo 4.\n#* Se recebeu <samp>RESTART</samp>, isto significa que a autenticação funcionou mas não temos uma conta de utilizador associada. Pode dar-lhe o tratamento de <samp>UI</samp> ou <samp>FAIL</samp>.",
+       "api-help-authmanagerhelper-requests": "Usar só estes pedidos de autenticação, com o <samp>id</samp> devolvido por <kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd> com <kbd>amirequestsfor=$1</kbd> ou por uma resposta anterior deste módulo.",
+       "api-help-authmanagerhelper-request": "Usar este pedido de autenticação, com o <samp>id</samp> devolvido por <kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd> com <kbd>amirequestsfor=$1</kbd>.",
+       "api-help-authmanagerhelper-messageformat": "Formato a usar nas mensagens de saída.",
+       "api-help-authmanagerhelper-mergerequestfields": "Combinar a informação de todos os pedidos de autenticação numa única matriz.",
+       "api-help-authmanagerhelper-preservestate": "Preservar o estado de uma tentativa de autenticação anterior falhada, se possível.",
+       "api-help-authmanagerhelper-returnurl": "O URL de retorno para processos de autenticação por terceiros tem de ser absoluto. É obrigatório fornecer este URL ou <var>$1continue</var>.\n\nTipicamente, após receber uma resposta <samp>REDIRECT</samp>, abrirá um <i>browser</i> ou uma <i>web view</i> para o URL <samp>redirecttarget</samp> especificado, para dar lugar ao processo de autenticação por terceiros. Quando esse processo terminar, a terceira entidade encaminhará o <i>browser</i> ou a <i>web view</i> para este URL. Deve extrair do URL quaisquer parâmetros de consulta ou de POST, e passá-los como um pedido <var>$1continue</var> a este módulo da API.",
+       "api-help-authmanagerhelper-continue": "Este pedido é uma continuação após uma resposta anterior com o valor <samp>UI</samp> ou <samp>REDIRECT</samp>. É obrigatório fornecer este parâmetro ou o parâmetro <var>$1returnurl</var>.",
+       "api-help-authmanagerhelper-additional-params": "Este módulo aceita parâmetros adicionais, dependendo dos pedidos de autenticação disponíveis. Use <kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd> com <kbd>amirequestsfor=$1</kbd> (ou uma resposta anterior deste módulo, se aplicável) para determinar os pedidos disponíveis e os campos que estes utilizam.",
        "api-credits-header": "Créditos",
-       "api-credits": "Programadores API:\n* Roan Kattouw (programador principal Set 2007–2009)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Yuri Astrakhan (criador, programador-líder Set 2006–Set 2007)\n* Brad Jorsch (programador-líder 2013–presente)\n\nPor favor, envie os seus comentários, sugestões e perguntas para mediawiki-api@lists.wikimedia.org ou reporte um erro técnico em https://phabricator.wikimedia.org/."
+       "api-credits": "Programadores da API:\n* Yuri Astrakhan (criador, programador principal set 2006–set 2007)\n* Roan Kattouw (programador principal set 2007–2009)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Brad Jorsch (programador principal 2013–presente)\n\nPor favor, envie os seus comentários, sugestões e perguntas para mediawiki-api@lists.wikimedia.org ou crie um relatório de defeitos em https://phabricator.wikimedia.org/."
 }
index 8deda75..95d6485 100644 (file)
@@ -12,7 +12,8 @@
                        "Amire80",
                        "Siebrand",
                        "Purodha",
-                       "Tacsipacsi"
+                       "Tacsipacsi",
+                       "D41D8CD98F"
                ]
        },
        "apihelp-main-description": "{{doc-apihelp-description|main}}",
        "api-help-param-deprecated": "Displayed in the API help for any deprecated parameter\n{{Identical|Deprecated}}",
        "api-help-param-required": "Displayed in the API help for any required parameter",
        "api-help-datatypes-header": "Header for the data type section in the API help output",
-       "api-help-datatypes": "{{technical}} {{doc-important|Do not translate or reformat dates inside &lt;kbd%gt; tags}} Documentation of certain API data types\nSee also:\n* [[Special:PrefixIndex/MediaWiki:api-help-param-type]]",
+       "api-help-datatypes": "{{technical}} {{doc-important|Do not translate or reformat dates inside &lt;kbd&gt; tags}} Documentation of certain API data types\nSee also:\n* [[Special:PrefixIndex/MediaWiki:api-help-param-type]]",
        "api-help-param-type-limit": "{{technical}} {{doc-important|Do not translate text inside &lt;kbd&gt; tags}} Used to indicate that a parameter is a \"limit\" type. Parameters:\n* $1 - Always 1.\nSee also:\n* {{msg-mw|api-help-datatypes}}\n* [[Special:PrefixIndex/MediaWiki:api-help-param-type]]",
        "api-help-param-type-integer": "{{technical}} Used to indicate that a parameter is an integer or list of integers. Parameters:\n* $1 - 1 if the parameter takes one value, 2 if the parameter takes a list of values.\nSee also:\n* {{msg-mw|api-help-datatypes}}\n* [[Special:PrefixIndex/MediaWiki:api-help-param-type]]",
        "api-help-param-type-boolean": "{{technical}} {{doc-important|Do not translate <code>Special:ApiHelp</code> in this message.}} Used to indicate that a parameter is a boolean. Parameters:\n* $1 - Always 1.\nSee also:\n* {{msg-mw|api-help-datatypes}}\n* [[Special:PrefixIndex/MediaWiki:api-help-param-type]]",
index 6abd59f..67c1a50 100644 (file)
@@ -36,6 +36,7 @@
        "apihelp-main-param-uselang": "Язык, используемый для перевода Сообщений. <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> с <kbd>siprop=языки</kbd> возвращает список кодов языков, или указать <kbd>пользователей</kbd> , чтобы использовать текущий язык пользователя предпочтения, или указать <kbd>контента</kbd> для использования этой Вики содержание язык.",
        "apihelp-block-description": "Блокировка участника.",
        "apihelp-block-param-user": "Имя участника, IP-адрес или диапазон IP-адресов, которые вы хотите заблокировать.",
+       "apihelp-block-param-expiry": "Время истечения срока действия. Могут быть относительными (например, <kbd>5 месяцев</kbd> или <kbd>2 недели</kbd>) или абсолютными (например, <kbd>2014-09-18T12:34:56Z</kbd>). Если задано <kbd>бессрочно</kbd>, <kbd>бессрочно</kbd>, или <kbd>не</kbd>, блок никогда не истекает.",
        "apihelp-block-param-reason": "Причина блокировки.",
        "apihelp-block-param-anononly": "Блокировать только анонимных пользователей (т. е. запретить анонимные правки для этого IP-адреса).",
        "apihelp-block-param-nocreate": "Запретить создание учётных записей.",
        "apihelp-block-param-allowusertalk": "Позволяет участникам редактировать их собственные страницы обсуждения (зависит от <var>[[mw:Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]</var>).",
        "apihelp-block-param-reblock": "Если участник уже заблокирован, перезаписать существующую блокировку.",
        "apihelp-block-param-watchuser": "Следить за страницей пользователя или IP-участника и страницей обсуждения.",
+       "apihelp-block-example-ip-simple": "Заблокировать IP-адрес <kbd>192.0.2.5</kbd> в течение трех дней с причиной <kbd>первого удара</kbd>.",
+       "apihelp-block-example-user-complex": "Заблокировать пользователя <kbd>Вандал</kbd> на бессрочно срок по причине <kbd>вандализма</kbd>, и предотвратить появление новых счет создания и отправки электронной почты.",
        "apihelp-changeauthenticationdata-description": "Изменить данные проверки подлинности для текущего пользователя.",
        "apihelp-changeauthenticationdata-example-password": "Попытка изменить текущий пароль пользователя в <kbd>ExamplePassword</kbd>.",
+       "apihelp-checktoken-description": "Проверить валидность токена от <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=token]]</kbd>.",
        "apihelp-checktoken-param-type": "Тип маркера проходит тестирование.",
        "apihelp-checktoken-param-token": "токен для проверки",
        "apihelp-checktoken-param-maxtokenage": "Максимально допустимый возраст токена (в секундах).",
        "apihelp-checktoken-example-simple": "Проверить годность <kbd>csrf</kbd>-токена.",
        "apihelp-clearhasmsg-description": "Очищает флаг <code>hasmsg</code> для текущего участника.",
        "apihelp-clearhasmsg-example-1": "Очистить флаг <code>hasmsg</code> для текущего участника.",
+       "apihelp-clientlogin-description": "Войдите в вики с помощью интерактивного потока.",
+       "apihelp-clientlogin-example-login": "Начать процесс регистрации в вики в качестве пользователя <kbd>пример</kbd> с паролем <kbd>ExamplePassword</kbd>.",
+       "apihelp-clientlogin-example-login2": "Продолжить ведение журнала в после <samp>интерфейс</samp> ответ для двухфакторной аутентификации, поставляя <var>OATHToken</var> из <kbd>987654</kbd>.",
+       "apihelp-compare-description": "Сделать разницу между 2 страницами.\n\nНомер редакции, Заголовок страницы, или страницы с ID для обоих \"из\" и \"в\" должны быть переданы.",
        "apihelp-compare-param-fromtitle": "Первый заголовок для сравнения.",
        "apihelp-compare-param-fromid": "Первый идентификатор страницы для сравнения.",
        "apihelp-compare-param-fromrev": "Первая редакция для сравнения.",
@@ -61,6 +69,8 @@
        "apihelp-compare-param-torev": "Вторая версия для сравнения",
        "apihelp-compare-example-1": "Создание различий между версиями 1 и 2.",
        "apihelp-createaccount-description": "Создайте новую учетную запись Пользователя.",
+       "apihelp-createaccount-param-preservestate": "Если <kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd> возвращается True для <samp>hasprimarypreservedstate</samp>, просит отмечен как <samp>основной-обязательно</samp> должен быть опущен. Если он возвращает непустое значение для <samp>preservedusername</samp>, что имя пользователя должно быть использовано для <var>пользователя</var> параметр.",
+       "apihelp-createaccount-example-create": "Запустить процесс создания пользователя <kbd>пример</kbd> с паролем <kbd>ExamplePassword</kbd>.",
        "apihelp-createaccount-param-name": "Имя участника.",
        "apihelp-createaccount-param-password": "Пароль (ignored if <var>$1mailpassword</var> is set).",
        "apihelp-createaccount-param-domain": "Домен для внешней аутентификации (дополнительно).",
        "apihelp-createaccount-param-language": "Установить код языка по умолчанию для пользователя (необязательный, по умолчанию используется язык содержимого).",
        "apihelp-createaccount-example-pass": "Создать пользователя <kbd>testuser</kbd> с паролем <kbd>test123</kbd>.",
        "apihelp-createaccount-example-mail": "Создать пользователя <kbd>testmailuser</kbd> и адрес электронной почты, сгенерировать случайный пароль.",
+       "apihelp-cspreport-description": "Используемые браузеры сообщать о нарушениях политики безопасности. Этот модуль никогда не должно использоваться, за исключением, когда автоматически используется совместимый КРИПТОПРОВАЙДЕР веб-браузер.",
+       "apihelp-cspreport-param-reportonly": "Отметить как доклад по мониторингу политики, а не принудительная политика",
+       "apihelp-cspreport-param-source": "Что генерируется Заголовок СКП, которые вызвали этот доклад",
        "apihelp-delete-description": "Удалить страницу.",
        "apihelp-delete-param-title": "Заголовок страницы удалить. Совместное использование с <var>$1страницы</var> невозможно.",
+       "apihelp-delete-param-pageid": "Идентификатор страницы для удаления. Нельзя использовать вместе с <var>$1титул</var>.",
+       "apihelp-delete-param-reason": "Причиной для удаления. Если не задано, автоматически сгенерированный причина будет использоваться.",
+       "apihelp-delete-param-tags": "Изменить теги для подачи заявки на запись в журнале удаления.",
        "apihelp-delete-param-watch": "Добавить страницу к текущему списку наблюдения пользователя.",
+       "apihelp-delete-param-watchlist": "Безоговорочно добавить или удалить страницы из списка наблюдения текущего пользователя, используйте предпочтения или не менять часы.",
        "apihelp-delete-param-unwatch": "Удалить страницу из списка наблюдения текущего пользователя.",
        "apihelp-delete-example-simple": "удалить <kbd>Main Page</kbd>.",
        "apihelp-delete-example-reason": "Удалить <kbd>Main Page</kbd> причина <kbd>Preparing for move</kbd>.",
@@ -82,6 +99,7 @@
        "apihelp-edit-description": "Создать и отредактировать страницы.",
        "apihelp-edit-param-sectiontitle": "Заголовок для нового раздела.",
        "apihelp-edit-param-text": "Содержание страницы.",
+       "apihelp-edit-param-tags": "Изменить теги для подачи заявки на пересмотр.",
        "apihelp-edit-param-minor": "Незначительное изменение (малая правка).",
        "apihelp-edit-param-notminor": "Значительное изменение (обычная, не «малая», правка).",
        "apihelp-edit-param-bot": "Пометьте этот редактировать как изменить скрипт.",
        "apihelp-edit-param-prependtext": "Добавьте этот текст в начале страницы. Переопределяет $1текст.",
        "apihelp-edit-param-appendtext": "Добавьте этот текст внизу страницы. Переопределяет $1текст.\n\nИспользуйте вместо этого параметра $1раздел = new, чтобы добавить новый раздел.",
        "apihelp-edit-param-undo": "Отменить это изменение. Переопределяет $1текст, $1prependtext и $1appendtext.",
+       "apihelp-edit-param-undoafter": "Отменить все изменения от $1, чтобы отменить это. Если не набор, просто отменить одну ревизию.",
        "apihelp-edit-param-redirect": "Автоматически разрешать редиректы.",
        "apihelp-edit-param-contentformat": "Формат сериализации содержимого, используемый для ввода текста.",
        "apihelp-edit-param-contentmodel": "Модель содержимого нового содержимого.",
        "apihelp-expandtemplates-description": "Расширяет все шаблоны в тексте.",
        "apihelp-expandtemplates-param-title": "Заголовок страницы.",
        "apihelp-expandtemplates-param-text": "Викитекст для конвертирования",
+       "apihelp-expandtemplates-param-revid": "Идентификатор ревизии, для <nowiki>{{REVISIONID}}</nowiki> и подобные переменные.",
+       "apihelp-expandtemplates-param-prop": "Какие данные получить.\n\nОбратите внимание, что если значение не выбрано, то результат будет содержать тексте, но выход будет в устаревший формат.",
        "apihelp-expandtemplates-paramvalue-prop-wikitext": "Расширенный викитекст",
+       "apihelp-expandtemplates-paramvalue-prop-categories": "Любой категории присутствуют во входных данных, которые не представлены в тексте вывод.",
+       "apihelp-expandtemplates-paramvalue-prop-properties": "Страница свойств определяются расширенные волшебные слова в тексте.",
+       "apihelp-expandtemplates-paramvalue-prop-volatile": "Есть ли выход летучих и не должны использоваться повторно в другом месте на странице.",
+       "apihelp-expandtemplates-paramvalue-prop-ttl": "Максимальное время, через которое кэширует результат должен быть признан недействительным.",
+       "apihelp-expandtemplates-paramvalue-prop-jsconfigvars": "Дает переменные конфигурации JavaScript конкретной странице.",
+       "apihelp-expandtemplates-paramvalue-prop-encodedjsconfigvars": "Дает переменные конфигурации JavaScript, определенных на страницу в виде строки JSON.",
        "apihelp-expandtemplates-paramvalue-prop-parsetree": "Дерево разбора XML входных данных.",
+       "apihelp-expandtemplates-param-includecomments": "Нужно ли включать комментарии HTML на выходе.",
+       "apihelp-expandtemplates-param-generatexml": "Создать XML-дерево разбора (заменить $1prop=parsetree).",
+       "apihelp-feedcontributions-description": "Возвращает вклад пользователей корма.",
        "apihelp-feedcontributions-param-feedformat": "Биреү форматы",
+       "apihelp-feedcontributions-param-user": "Что пользователи, чтобы получить взносы.",
        "apihelp-feedcontributions-param-year": "От года (и ранее).",
        "apihelp-feedcontributions-param-month": "От месяца (и ранее).",
        "apihelp-feedcontributions-param-deletedonly": "Показать только удалённые правки.",
index bef2409..956a0df 100644 (file)
@@ -33,7 +33,7 @@
        "apihelp-main-param-maxage": "设置<code>max-age</code> HTTP缓存控制头至这些秒。错误不会缓存。",
        "apihelp-main-param-assert": "如果设置为<kbd>user</kbd>就验证用户是否登录,或如果设置为<kbd>bot</kbd>就验证是否有机器人用户权限。",
        "apihelp-main-param-assertuser": "验证当前用户是命名用户。",
-       "apihelp-main-param-requestid": "任何在此提供的值将包含在响应中。可能可以用以区别请求。",
+       "apihelp-main-param-requestid": "任何在此提供的值将包含在响应中。可以用以区别请求。",
        "apihelp-main-param-servedby": "包含保存结果请求的主机名。",
        "apihelp-main-param-curtimestamp": "在结果中包括当前时间戳。",
        "apihelp-main-param-origin": "当通过跨域名AJAX请求(CORS)访问API时,设置此作为起始域名。这必须包括在任何pre-flight请求中,并因此必须是请求的URI的一部分(而不是POST正文)。\n\n对于已验证的请求,这必须正确匹配<code>Origin</code>标头中的原点之一,因此它已经设置为像<kbd>https://zh.wikipedia.org</kbd>或<kbd>https://meta.wikimedia.org</kbd>的东西。如果此参数不匹配<code>Origin</code>页顶,就返回403错误响应。如果此参数匹配<code>Origin</code>页顶并且起点被白名单,将设置<code>Access-Control-Allow-Origin</code>和<code>Access-Control-Allow-Credentials</code>开头。\n\n对于未验证的请求,会指定值<kbd>*</kbd>。这将导致<code>Access-Control-Allow-Origin</code>标头被设置,但<code>Access-Control-Allow-Credentials</code>将为<code>false</code>,且所有用户特定数据将受限制。",
@@ -64,7 +64,7 @@
        "apihelp-clientlogin-description": "使用交互式流登录wiki。",
        "apihelp-clientlogin-example-login": "开始作为用户<kbd>Example</kbd>和密码<kbd>ExamplePassword</kbd>登录至wiki的过程。",
        "apihelp-clientlogin-example-login2": "在<samp>UI</samp>响应双因素验证后继续登录,补充<var>OATHToken</var> <kbd>987654</kbd>。",
-       "apihelp-compare-description": "获取2个页面之间的差别。\n\n用于“from”和“to”的修订版本号、页面标题或页面 ID 必须获得通过。",
+       "apihelp-compare-description": "获取2个页面之间的差别。\n\n必须传递用于“from”和“to”的修订版本号、页面标题或页面 ID 。",
        "apihelp-compare-param-fromtitle": "要比较的第一个标题。",
        "apihelp-compare-param-fromid": "要比较的第一个页面 ID。",
        "apihelp-compare-param-fromrev": "要比较的第一个修订版本。",
        "apihelp-edit-param-minor": "小编辑。",
        "apihelp-edit-param-notminor": "不是小编辑。",
        "apihelp-edit-param-bot": "标记此编辑为机器人编辑。",
-       "apihelp-edit-param-basetimestamp": "基础修订的时间戳,用于检测编辑冲突。也许可以通过[[Special:ApiHelp/query+revisions|action=query&prop=revisions&rvprop=timestamp]]得到。",
+       "apihelp-edit-param-basetimestamp": "基础修订的时间戳,用于检测编辑冲突。可以通过[[Special:ApiHelp/query+revisions|action=query&prop=revisions&rvprop=timestamp]]得到。",
        "apihelp-edit-param-starttimestamp": "编辑过程开始的时间戳,用于检测编辑冲突。当开始编辑过程时(例如当加载要编辑的页面时)使用<var>[[Special:ApiHelp/main|curtimestamp]]</var>可能取得一个适当的值。",
        "apihelp-edit-param-recreate": "覆盖有关该页面在此期间已被删除的任何错误。",
        "apihelp-edit-param-createonly": "不要编辑页面,如果已经存在。",
        "apihelp-edit-param-token": "令牌应总是发送为最后参数,或至少在$1text参数之后。",
        "apihelp-edit-example-edit": "编辑一个页面。",
        "apihelp-edit-example-prepend": "页面中预置<kbd>_&#95;NOTOC_&#95;</kbd>。",
-       "apihelp-edit-example-undo": "通过13585撤销修订版本13579并自动填写编辑摘要。",
+       "apihelp-edit-example-undo": "撤销修订版本13579至13585并自动填写编辑摘要。",
        "apihelp-emailuser-description": "电子邮件联系一位用户。",
        "apihelp-emailuser-param-target": "电子邮件的目标用户。",
        "apihelp-emailuser-param-subject": "主题页眉。",
        "apihelp-expandtemplates-param-text": "要转换的wiki文本。",
        "apihelp-expandtemplates-param-revid": "修订版本ID,用于<nowiki>{{REVISIONID}}</nowiki>和类似变体。",
        "apihelp-expandtemplates-param-prop": "要获取的那条信息。\n\n注意如果没有选定值,结果将包含wiki文本,但将以弃用的格式显示。",
-       "apihelp-expandtemplates-paramvalue-prop-wikitext": "扩充的wiki文本。",
+       "apihelp-expandtemplates-paramvalue-prop-wikitext": "展开后的wiki文本。",
        "apihelp-expandtemplates-paramvalue-prop-categories": "任何在输出中提供的,未在wiki文本输出中表现的分类。",
        "apihelp-expandtemplates-paramvalue-prop-properties": "由wiki文本中扩充的魔术字定义的页面属性。",
-       "apihelp-expandtemplates-paramvalue-prop-volatile": "无论输出是否常常变动,均不应被在页面中其他任何位置重用。",
+       "apihelp-expandtemplates-paramvalue-prop-volatile": "输出是否常常变动,是否不应被在页面中其他任何位置重用。",
        "apihelp-expandtemplates-paramvalue-prop-ttl": "结果缓存应无效化后的最长时间。",
-       "apihelp-expandtemplates-paramvalue-prop-modules": "任何解析器函数请求添加至输出的ResourceLoader模块。无论<kbd>jsconfigvars</kbd>还是<kbd>encodedjsconfigvars</kbd>都必须与<kbd>modules</kbd>共同被请求。",
+       "apihelp-expandtemplates-paramvalue-prop-modules": "任何解析器函数请求添加至输出的ResourceLoader模块。<kbd>jsconfigvars</kbd>和<kbd>encodedjsconfigvars</kbd>之一必须与<kbd>modules</kbd>共同被请求。",
        "apihelp-expandtemplates-paramvalue-prop-jsconfigvars": "针对页面提供JavaScript配置变量。",
        "apihelp-expandtemplates-paramvalue-prop-encodedjsconfigvars": "针对页面提供JavaScript配置变量为一个JSON字符串。",
        "apihelp-expandtemplates-paramvalue-prop-parsetree": "输入的XML分析树。",
-       "apihelp-expandtemplates-param-includecomments": "è¾\93å\87ºæ\97¶æ\98¯å\90¦å\8c\85å\90«HTMLæ\91\98è¦\81。",
+       "apihelp-expandtemplates-param-includecomments": "è¾\93å\87ºæ\97¶æ\98¯å\90¦å\8c\85å\90«HTML注é\87\8a。",
        "apihelp-expandtemplates-param-generatexml": "生成XML解析树(取代自$1prop=parsetree)。",
        "apihelp-expandtemplates-example-simple": "展开wiki文本<kbd><nowiki>{{Project:Sandbox}}</nowiki></kbd>。",
        "apihelp-feedcontributions-description": "返回用户贡献纲要。",
        "apihelp-options-description": "更改当前用户的偏好设置。\n\n只有注册在核心或者已安装扩展中的选项,或者具有<code>userjs-</code>键值前缀(旨在被用户脚本使用)的选项可被设置。",
        "apihelp-options-param-reset": "将参数设置重置为网站默认值。",
        "apihelp-options-param-resetkinds": "当<var>$1reset</var>选项被设置时,要重置的选项类型列表。",
-       "apihelp-options-param-change": "æ\9b´æ\94¹å\88\97表ï¼\8c以name=valueæ ¼å¼\8få\8c\96ï¼\88ä¾\8bå¦\82skin=vectorï¼\89ã\80\82å\80¼ä¸\8dè\83½å\8c\85å\90«ç®¡é\81\93å­\97符ã\80\82å¦\82æ\9e\9c没æ\8f\90ä¾\9bå\80¼ï¼\88ç\94\9aè\87³æ²¡æ\9c\89ç­\89å\8f·ï¼\89ï¼\8cä¾\8bå¦\82optionname|otheroption|...ï¼\8cé\80\89项å°\86é\87\8d置为é»\98认å\80¼。",
+       "apihelp-options-param-change": "æ\9b´æ\94¹å\88\97表ï¼\8c以name=valueæ ¼å¼\8få\8c\96ï¼\88ä¾\8bå¦\82skin=vectorï¼\89ã\80\82å¦\82æ\9e\9c没æ\8f\90ä¾\9bå\80¼ï¼\88ç\94\9aè\87³æ²¡æ\9c\89ç­\89å\8f·ï¼\89ï¼\8cä¾\8bå¦\82optionname|otheroption|...ï¼\8cé\80\89项å°\86é\87\8d置为é»\98认å\80¼ã\80\82å¦\82æ\9e\9cä»»ä½\95ä¼ é\80\92ç\9a\84å\80¼å\8c\85å\90«ç®¡é\81\93å­\97符ï¼\88<kbd>|</kbd>ï¼\89ï¼\8c请æ\94¹ç\94¨[[Special:ApiHelp/main#main/datatypes|æ\9b¿ä»£å¤\9aå\80¼å\88\86é\9a\94符]]以正确æ\93\8dä½\9c。",
        "apihelp-options-param-optionname": "应设置为由<var>$1optionvalue</var>提供值的选项名称。",
-       "apihelp-options-param-optionvalue": "用于由<var>$1optionname</var>指定的选项的值,可以包含管道字符。",
+       "apihelp-options-param-optionvalue": "用于由<var>$1optionname</var>指定的选项的值。",
        "apihelp-options-example-reset": "重置所有用户设置。",
        "apihelp-options-example-change": "更改<kbd>skin</kbd>和<kbd>hideminor</kbd>设置。",
        "apihelp-options-example-complex": "重置所有设置,然后设置<kbd>skin</kbd>和<kbd>nickname</kbd>。",
        "apihelp-query+search-paramvalue-prop-size": "添加页面大小,单位为字节。",
        "apihelp-query+search-paramvalue-prop-wordcount": "添加页面的字数。",
        "apihelp-query+search-paramvalue-prop-timestamp": "添加页面上次编辑时的时间戳。",
-       "apihelp-query+search-paramvalue-prop-snippet": "Adds a parsed snippet of the page.",
-       "apihelp-query+search-paramvalue-prop-titlesnippet": "Adds a parsed snippet of the page title.",
+       "apihelp-query+search-paramvalue-prop-snippet": "添加已解析的页面片段。",
+       "apihelp-query+search-paramvalue-prop-titlesnippet": "添加已解析的页面标题片段。",
        "apihelp-query+search-paramvalue-prop-redirectsnippet": "添加被解析的重定向标题的片段。",
        "apihelp-query+search-paramvalue-prop-redirecttitle": "添加匹配的重定向的标题。",
-       "apihelp-query+search-paramvalue-prop-sectionsnippet": "Adds a parsed snippet of the matching section title.",
-       "apihelp-query+search-paramvalue-prop-sectiontitle": "Adds the title of the matching section.",
-       "apihelp-query+search-paramvalue-prop-categorysnippet": "Adds a parsed snippet of the matching category.",
+       "apihelp-query+search-paramvalue-prop-sectionsnippet": "添加已解析的匹配章节标题片段。",
+       "apihelp-query+search-paramvalue-prop-sectiontitle": "添加匹配章节的标题。",
+       "apihelp-query+search-paramvalue-prop-categorysnippet": "添加已解析的匹配分类片段。",
        "apihelp-query+search-paramvalue-prop-isfilematch": "添加布尔值,表明搜索是否匹配文件内容。",
        "apihelp-query+search-paramvalue-prop-score": "<span class=\"apihelp-deprecated\">已弃用并已忽略。</span>",
        "apihelp-query+search-paramvalue-prop-hasrelated": "<span class=\"apihelp-deprecated\">已弃用并已忽略。</span>",
        "apihelp-query+siteinfo-paramvalue-prop-libraries": "返回wiki上安装的库。",
        "apihelp-query+siteinfo-paramvalue-prop-extensions": "返回wiki上安装的扩展。",
        "apihelp-query+siteinfo-paramvalue-prop-fileextensions": "返回允许上传的文件扩展名(文件类型)列表。",
-       "apihelp-query+siteinfo-paramvalue-prop-rightsinfo": "å¦\82æ\9e\9cå\8f¯ç\94¨ï¼\8cè¿\94å\9b\9ewikiç\9a\84ç\89\88æ\9d\83信息。",
+       "apihelp-query+siteinfo-paramvalue-prop-rightsinfo": "å½\93å\8f¯ç\94¨æ\97¶è¿\94å\9b\9ewikiç\9a\84ç\89\88æ\9d\83ï¼\88许å\8f¯å\8d\8fè®®ï¼\89信息。",
        "apihelp-query+siteinfo-paramvalue-prop-restrictions": "返回可用的编辑限制(保护)类型信息。",
        "apihelp-query+siteinfo-paramvalue-prop-languages": "返回MediaWiki支持的语言列表(可选择使用<var>$1inlanguagecode</var>本地化)。",
        "apihelp-query+siteinfo-paramvalue-prop-skins": "返回所有启用的皮肤列表(可选择使用<var>$1inlanguagecode</var>本地化,否则是内容语言)。",
        "apihelp-query+stashimageinfo-example-params": "返回两个藏匿文件的缩略图。",
        "apihelp-query+tags-description": "列出更改标签。",
        "apihelp-query+tags-param-limit": "列出标签的最大数量。",
-       "apihelp-query+tags-param-prop": "要获取哪个属性:",
+       "apihelp-query+tags-param-prop": "要获取属性:",
        "apihelp-query+tags-paramvalue-prop-name": "添加标签名称。",
        "apihelp-query+tags-paramvalue-prop-displayname": "为标签添加系统消息。",
        "apihelp-query+tags-paramvalue-prop-description": "为标签添加描述。",
        "apihelp-query+userinfo-paramvalue-prop-implicitgroups": "列举当前用户的所有自动成为成员的用户组。",
        "apihelp-query+userinfo-paramvalue-prop-rights": "列举当前用户拥有的所有权限。",
        "apihelp-query+userinfo-paramvalue-prop-changeablegroups": "Lists the groups the current user can add to and remove from.",
-       "apihelp-query+userinfo-paramvalue-prop-options": "Lists all preferences the current user has set.",
+       "apihelp-query+userinfo-paramvalue-prop-options": "列举当前用户设置的所有参数设置。",
        "apihelp-query+userinfo-paramvalue-prop-preferencestoken": "<span class=\"apihelp-deprecated\">已弃用。</span>获取令牌以更改当前用户的参数设置。",
        "apihelp-query+userinfo-paramvalue-prop-editcount": "添加当前用户的编辑计数。",
-       "apihelp-query+userinfo-paramvalue-prop-ratelimits": "Lists all rate limits applying to the current user.",
+       "apihelp-query+userinfo-paramvalue-prop-ratelimits": "列举所有应用到当前用户的速率限制。",
        "apihelp-query+userinfo-paramvalue-prop-realname": "添加用户的真实姓名。",
-       "apihelp-query+userinfo-paramvalue-prop-email": "Adds the user's email address and email authentication date.",
-       "apihelp-query+userinfo-paramvalue-prop-acceptlang": "Echoes the <code>Accept-Language</code> header sent by the client in a structured format.",
+       "apihelp-query+userinfo-paramvalue-prop-email": "添加用户的电子邮件地址及电子邮件验证日期。",
+       "apihelp-query+userinfo-paramvalue-prop-acceptlang": "重复由客户端以结构化格式发送的<code>Accept-Language</code>标头。",
        "apihelp-query+userinfo-paramvalue-prop-registrationdate": "添加用户的注册时间。",
-       "apihelp-query+userinfo-paramvalue-prop-unreadcount": "Adds the count of unread pages on the user's watchlist (maximum $1; returns <samp>$2</samp> if more).",
+       "apihelp-query+userinfo-paramvalue-prop-unreadcount": "添加用户监视列表上的未独页面计数(最高$1;如果更多则返回<samp>$2</samp>)。",
        "apihelp-query+userinfo-paramvalue-prop-centralids": "添加中心ID并为用户附加状态。",
        "apihelp-query+userinfo-param-attachedwiki": "与<kbd>$1prop=centralids</kbd>一起使用,表明用户是否附加于此ID定义的wiki。",
        "apihelp-query+userinfo-example-simple": "获取有关当前用户的信息。",
        "apihelp-query+users-param-prop": "要包含的信息束:",
        "apihelp-query+users-paramvalue-prop-blockinfo": "如果用户被封禁就标记,并注明是谁封禁,以何种原因封禁的。",
        "apihelp-query+users-paramvalue-prop-groups": "列举每位用户属于的所有组。",
-       "apihelp-query+users-paramvalue-prop-implicitgroups": "Lists all the groups a user is automatically a member of.",
+       "apihelp-query+users-paramvalue-prop-implicitgroups": "列举用户自动作为成员之一的所有组。",
        "apihelp-query+users-paramvalue-prop-rights": "列举每位用户拥有的所有权限。",
        "apihelp-query+users-paramvalue-prop-editcount": "添加用户的编辑计数。",
        "apihelp-query+users-paramvalue-prop-registration": "添加用户的注册时间戳。",
-       "apihelp-query+users-paramvalue-prop-emailable": "Tags if the user can and wants to receive email through [[Special:Emailuser]].",
+       "apihelp-query+users-paramvalue-prop-emailable": "当用户可以并希望通过[[Special:Emailuser]]接收电子邮件时标记。",
        "apihelp-query+users-paramvalue-prop-gender": "标记用户性别。返回“male”、“female”或“unknown”。",
        "apihelp-query+users-paramvalue-prop-centralids": "添加中心ID并为用户附加状态。",
        "apihelp-query+users-paramvalue-prop-cancreate": "表明是否可以为有效但尚未注册的用户名创建一个账户。",
        "apihelp-json-param-callback": "如果指定,将输出内容包裹在一个指定的函数调用中。出于安全考虑,所有用户相关的数据将被限制。",
        "apihelp-json-param-utf8": "如果指定,使用十六进制转义序列将大多数(但不是全部)非ASCII的字符编码为UTF-8,而不是替换它们。默认当<var>formatversion</var>不是<kbd>1</kbd>时。",
        "apihelp-json-param-ascii": "如果指定,使用十六进制转义序列将所有非ASCII编码。默认当<var>formatversion</var>为<kbd>1</kbd>时。",
-       "apihelp-json-param-formatversion": "输出格式:\n;1:向后兼容格式(XML样式布尔值、用于内容节点的<samp>*</samp>键等)。\n;2:实验现代格式。细节可以更改!\n;latest:使用最新格式(当前为<kbd>2</kbd>),可以在没有警告的情况下更改。",
+       "apihelp-json-param-formatversion": "输出格式:\n;1:向后兼容格式(XML样式布尔值、用于内容节点的<samp>*</samp>键等)。\n;2:实验现代格式。细节可能更改!\n;latest:使用最新格式(当前为<kbd>2</kbd>),格式可能在没有警告的情况下更改。",
        "apihelp-jsonfm-description": "输出数据为JSON格式(HTML优质打印效果)。",
        "apihelp-none-description": "不输出任何东西。",
        "apihelp-php-description": "输出数据为序列化PHP格式。",
-       "apihelp-php-param-formatversion": "输出格式:\n;1:向后兼容格式(XML样式布尔值、用于内容节点的<samp>*</samp>键等)。\n;2:实验现代格式。细节可以更改!\n;latest:使用最新格式(当前为<kbd>2</kbd>),可以在没有警告的情况下更改。",
+       "apihelp-php-param-formatversion": "输出格式:\n;1:向后兼容格式(XML样式布尔值、用于内容节点的<samp>*</samp>键等)。\n;2:实验现代格式。细节可能更改!\n;latest:使用最新格式(当前为<kbd>2</kbd>),格式可能在没有警告的情况下更改。",
        "apihelp-phpfm-description": "输出数据为序列化PHP格式(HTML优质打印效果)。",
        "apihelp-rawfm-description": "输出数据为JSON格式,包含调试元素(HTML优质打印效果)。",
        "apihelp-xml-description": "输出数据为XML格式。",
        "api-help-param-deprecated": "已弃用。",
        "api-help-param-required": "这个参数是必须的。",
        "api-help-datatypes-header": "数据类型",
-       "api-help-datatypes": "至MediaWiki的输入应为NFC标准化的UTF-8。MediaWiki可以尝试转换其他输入,但这可能导致一些操作失败(例如[[Special:ApiHelp/edit|edits]]与MD5校验)。\n\n一些在API请求中的参数类型需要更进一步解释:\n;boolean\n:布尔参数就像HTML复选框一样工作:如果指定参数,无论何值都被认为是真。如果要假值,则可完全忽略参数。\n;timestamp\n:时间戳可被指定为很多格式。推荐使用ISO 8601日期和时间标准。所有时间为UTC时间,包含的任何时区会被忽略。\n:* ISO 8601日期和时间,<kbd><var>2001</var>-<var>01</var>-<var>15</var>T<var>14</var>:<var>56</var>:<var>00</var>Z</kbd>(标点和<kbd>Z</kbd>是可选项)\n:* 带小数秒(会被忽略)的ISO 8601日期和时间,<kbd><var>2001</var>-<var>01</var>-<var>15</var>T<var>14</var>:<var>56</var>:<var>00</var>.<var>00001</var>Z</kbd>(破折号、括号和<kbd>Z</kbd>是可选的)\n:* MediaWiki格式,<kbd><var>2001</var><var>01</var><var>15</var><var>14</var><var>56</var><var>00</var></kbd>\n:* 一般数字格式,<kbd><var>2001</var>-<var>01</var>-<var>15</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>(<kbd>GMT</kbd>、<kbd>+<var>##</var></kbd>或<kbd>-<var>##</var></kbd>的可选时区会被忽略)\n:* EXIF格式,<kbd><var>2001</var>:<var>01</var>:<var>15</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* RFC 2822格式(时区可能会被省略),<kbd><var>Mon</var>, <var>15</var> <var>Jan</var> <var>2001</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* RFC 850格式(时区可能会被省略),<kbd><var>Monday</var>, <var>15</var>-<var>Jan</var>-<var>2001</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* C ctime格式,<kbd><var>Mon</var> <var>Jan</var> <var>15</var> <var>14</var>:<var>56</var>:<var>00</var> <var>2001</var></kbd>\n:* 秒数是从1970-01-01T00:00:00Z开始,作为1到13位数的整数(除了<kbd>0</kbd>)\n:* 字符串<kbd>now</kbd>\n;替代多值分隔符\n:使用多个值的参数通常会与管道符号分隔的值一起提交,例如<kbd>param=value1|value2</kbd>或<kbd>param=value1%7Cvalue2</kbd>。如果值必须包含管道符号,使用U+001F(单位分隔符)作为分隔符,''并''在值前加前缀U+001F,例如<kbd>param=%1Fvalue1%1Fvalue2</kbd>。",
+       "api-help-datatypes": "至MediaWiki的输入应为NFC标准化的UTF-8。MediaWiki可以尝试转换其他输入,但这可能导致一些操作失败(例如带MD5校验[[Special:ApiHelp/edit|编辑]])。\n\n一些在API请求中的参数类型需要更进一步解释:\n;boolean\n:布尔参数就像HTML复选框一样工作:如果指定参数,无论何值都被认为是真。如果要假值,则可完全忽略参数。\n;timestamp\n:时间戳可被指定为很多格式。推荐使用ISO 8601日期和时间标准。所有时间为UTC时间,包含的任何时区会被忽略。\n:* ISO 8601日期和时间,<kbd><var>2001</var>-<var>01</var>-<var>15</var>T<var>14</var>:<var>56</var>:<var>00</var>Z</kbd>(标点和<kbd>Z</kbd>是可选项)\n:* 带小数秒(会被忽略)的ISO 8601日期和时间,<kbd><var>2001</var>-<var>01</var>-<var>15</var>T<var>14</var>:<var>56</var>:<var>00</var>.<var>00001</var>Z</kbd>(破折号、冒号和<kbd>Z</kbd>是可选的)\n:* MediaWiki格式,<kbd><var>2001</var><var>01</var><var>15</var><var>14</var><var>56</var><var>00</var></kbd>\n:* 一般数字格式,<kbd><var>2001</var>-<var>01</var>-<var>15</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>(<kbd>GMT</kbd>、<kbd>+<var>##</var></kbd>或<kbd>-<var>##</var></kbd>的可选时区会被忽略)\n:* EXIF格式,<kbd><var>2001</var>:<var>01</var>:<var>15</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* RFC 2822格式(时区可省略),<kbd><var>Mon</var>, <var>15</var> <var>Jan</var> <var>2001</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* RFC 850格式(时区可省略),<kbd><var>Monday</var>, <var>15</var>-<var>Jan</var>-<var>2001</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* C ctime格式,<kbd><var>Mon</var> <var>Jan</var> <var>15</var> <var>14</var>:<var>56</var>:<var>00</var> <var>2001</var></kbd>\n:* 从1970-01-01T00:00:00Z开始的秒数,作为1到13位数的整数(除了<kbd>0</kbd>)\n:* 字符串<kbd>now</kbd>\n;替代多值分隔符\n:使用多个值的参数通常会与管道符号分隔的值一起提交,例如<kbd>param=value1|value2</kbd>或<kbd>param=value1%7Cvalue2</kbd>。如果值必须包含管道符号,使用U+001F(单位分隔符)作为分隔符,''并''在值前加前缀U+001F,例如<kbd>param=%1Fvalue1%1Fvalue2</kbd>。",
        "api-help-param-type-limit": "类型:整数或<kbd>max</kbd>",
        "api-help-param-type-integer": "类型:{{PLURAL:$1|1=整数|2=整数列表}}",
        "api-help-param-type-boolean": "类型:布尔值([[Special:ApiHelp/main#main/datatypes|详细信息]])",
        "api-help-param-integer-minmax": "{{PLURAL:$1|值}}必须介于$2和$3之间。",
        "api-help-param-upload": "必须被公布为使用multipart/form-data的一次文件上传。",
        "api-help-param-multi-separate": "通过<kbd>|</kbd>或[[Special:ApiHelp/main#main/datatypes|替代物]]隔开各值。",
-       "api-help-param-multi-max": "值的最高数字是{{PLURAL:$1|$1}}(对于机器人则是{{PLURAL:$2|$2}})。",
+       "api-help-param-multi-max": "值的最大数量是{{PLURAL:$1|$1}}(对于机器人则是{{PLURAL:$2|$2}})。",
        "api-help-param-default": "默认:$1",
        "api-help-param-default-empty": "默认:<span class=\"apihelp-empty\">(空)</span>",
        "api-help-param-token": "从[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]取回的“$1”令牌",
        "api-help-right-apihighlimits": "在API查询中使用更高的上限(慢查询:$1;快查询:$2)。慢查询的限制也适用于多值参数。",
        "api-help-open-in-apisandbox": "<small>[在沙盒中打开]</small>",
        "api-help-authmanager-general-usage": "使用此模块的一般程序是:\n# 通过<kbd>amirequestsfor=$4</kbd>取得来自<kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd>的可用字段,和来自<kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>的<kbd>$5</kbd>令牌。\n# 向用户显示字段,并获得其提交内容。\n# 发送至此模块,提供<var>$1returnurl</var>及任何相关字段。\n# 在响应中检查<samp>status</samp>。\n#* 如果您收到了<samp>PASS</samp>或<samp>FAIL</samp>,您已经完成。操作要么成功,要么不成功。\n#* 如果您收到了<samp>UI</samp>,present the new fields to the user and obtain their submission. Then post to this module with <var>$1continue</var> and the relevant fields set, and repeat step 4.\n#* 如果您收到了<samp>REDIRECT</samp>,direct the user to the <samp>redirecttarget</samp> and wait for the return to <var>$1returnurl</var>. Then post to this module with <var>$1continue</var> and any fields passed to the return URL, and repeat step 4.\n#* 如果您收到了<samp>RESTART</samp>,that means the authentication worked but we don't have a linked user account. You might treat this as <samp>UI</samp> or as <samp>FAIL</samp>.",
+       "api-help-authmanagerhelper-requests": "只使用这些身份验证请求,通过返回自<kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd>的<samp>id</samp>与<kbd>amirequestsfor=$1</kbd>,或来自此模块之前的响应。",
        "api-help-authmanagerhelper-request": "使用此身份验证请求,通过返回自<kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd>的<samp>id</samp>与<kbd>amirequestsfor=$1</kbd>。",
        "api-help-authmanagerhelper-messageformat": "返回消息使用的格式。",
        "api-help-authmanagerhelper-mergerequestfields": "合并用于所有身份验证请求的字段信息至一个数组中。",
        "api-help-authmanagerhelper-preservestate": "从之前失败的登录尝试中保持状态,如果可能。",
+       "api-help-authmanagerhelper-returnurl": "为第三方身份验证流返回URL,必须为绝对值。需要此值或<var>$1continue</var>两者之一。\n\nUpon receiving a <samp>REDIRECT</samp> response, you will typically open a browser or web view to the specified <samp>redirecttarget</samp> URL for a third-party authentication flow. When that completes, the third party will send the browser or web view to this URL. You should extract any query or POST parameters from the URL and pass them as a <var>$1continue</var> request to this API module.",
        "api-help-authmanagerhelper-continue": "此请求是在早先的<samp>UI</samp>或<samp>REDIRECT</samp>响应之后的附加请求。必需此值或<var>$1returnurl</var>。",
        "api-help-authmanagerhelper-additional-params": "此模块允许额外参数,取决于可用的身份验证请求。使用<kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd>与<kbd>amirequestsfor=$1</kbd>(或之前来自此模块的相应,如果可以)以决定可用请求及其使用的字段。",
        "api-credits-header": "制作人员",
index 016306a..5c75292 100644 (file)
@@ -80,7 +80,6 @@ class UserCache {
         * @param string $caller The calling method
         */
        public function doQuery( array $userIds, $options = [], $caller = '' ) {
-
                $usersToCheck = [];
                $usersToQuery = [];
 
@@ -132,7 +131,6 @@ class UserCache {
                        }
                }
                $lb->execute();
-
        }
 
        /**
index 2c3f58f..78a4863 100644 (file)
@@ -31,7 +31,7 @@ use Cdb\Writer;
  * space. The performance advantage is greater when the DBA extension is
  * available than it is with the PHP port.
  *
- * See Cdb.php and http://cr.yp.to/cdb.html
+ * See Cdb.php and https://cr.yp.to/cdb.html
  */
 class LCStoreCDB implements LCStore {
 
index 4970a2b..4b6362f 100644 (file)
@@ -549,7 +549,6 @@ class LocalisationCache {
         * @return array Array with a 'messages' key, or empty array if the file doesn't exist
         */
        public function readJSONFile( $fileName ) {
-
                if ( !is_readable( $fileName ) ) {
                        return [];
                }
@@ -561,7 +560,6 @@ class LocalisationCache {
 
                $data = FormatJson::decode( $json, true );
                if ( $data === null ) {
-
                        throw new MWException( __METHOD__ . ": Invalid JSON file: $fileName" );
                }
 
@@ -1036,7 +1034,6 @@ class LocalisationCache {
                        $blobStore = new MessageBlobStore();
                        $blobStore->clear();
                }
-
        }
 
        /**
index 76dd754..993f0b7 100644 (file)
@@ -63,7 +63,7 @@ class ChangeTags {
                        if ( !$tag ) {
                                continue;
                        }
-                       $description = self::tagDescription( $tag );
+                       $description = self::tagDescription( $tag, $context );
                        if ( $description === false ) {
                                continue;
                        }
@@ -98,11 +98,12 @@ class ChangeTags {
         * we consider the tag hidden, and return false.
         *
         * @param string $tag Tag
+        * @param IContextSource $context
         * @return string|bool Tag description or false if tag is to be hidden.
         * @since 1.25 Returns false if tag is to be hidden.
         */
-       public static function tagDescription( $tag ) {
-               $msg = wfMessage( "tag-$tag" );
+       public static function tagDescription( $tag, IContextSource $context ) {
+               $msg = $context->msg( "tag-$tag" );
                if ( !$msg->exists() ) {
                        // No such message, so return the HTML-escaped tag name.
                        return htmlspecialchars( $tag );
index 9c0b96e..e6b773c 100644 (file)
@@ -91,13 +91,35 @@ class IcuCollation extends Collation {
         * available and that there are, in fact, no additional letters to consider.
         */
        private static $tailoringFirstLetters = [
-               // Verified by native speakers
+               'af' => [],
+               'am' => [],
+               'ar' => [],
+               'as' => [ "\xe0\xa6\x82", "\xe0\xa6\x81", "\xe0\xa6\x83", "\xe0\xa7\x8e", "ক্ষ " ],
+               'ast' => [ "Ch", "Ll", "Ñ" ], // not in libicu
+               'az' => [ "Ç", "Ə", "Ğ", "İ", "Ö", "Ş", "Ü" ],
                'be' => [ "Ё" ],
                'be-tarask' => [ "Ё" ],
+               'bg' => [],
+               'bo' => [],
+               'br' => [ "Ch", "C'h" ],
                'bs' => [ "Č", "Ć", "Dž", "Đ", "Lj", "Nj", "Š", "Ž" ],
+               'bs-Cyrl' => [],
+               'ca' => [],
+               'chr' => [],
+               'co' => [], // not in libicu
                'cs' => [ "Č", "Ch", "Ř", "Š", "Ž" ],
                'cy' => [ "Ch", "Dd", "Ff", "Ng", "Ll", "Ph", "Rh", "Th" ],
+               'da' => [ "Æ", "Ø", "Å" ],
+               'de' => [],
+               'de-AT@collation=phonebook' => [ 'ä', 'ö', 'ü', 'ß' ],
+               'dsb' => [ "Č", "Ć", "Dź", "Ě", "Ch", "Ł", "Ń", "Ŕ", "Š", "Ś", "Ž", "Ź" ],
+               'ee' => [ "Dz", "Ɖ", "Ɛ", "Ƒ", "Gb", "Ɣ", "Kp", "Ny", "Ŋ", "Ɔ", "Ts", "Ʋ" ],
+               'el' => [],
                'en' => [],
+               'eo' => [ "Ĉ", "Ĝ", "Ĥ", "Ĵ", "Ŝ", "Ŭ" ],
+               'es' => [ "Ñ" ],
+               'et' => [ "Š", "Ž", "Õ", "Ä", "Ö", "Ü", "W" ], // added W for CollationEt (xx-uca-et)
+               'eu' => [ "Ñ" ], // not in libicu
                'fa' => [
                        // RTL, let's put each letter on a new line
                        "آ",
@@ -107,74 +129,107 @@ class IcuCollation extends Collation {
                        "و"
                ],
                'fi' => [ "Å", "Ä", "Ö" ],
+               'fil' => [ "Ñ", "Ng" ],
+               'fo' => [ "Á", "Ð", "Í", "Ó", "Ú", "Ý", "Æ", "Ø", "Å" ],
                'fr' => [],
+               'fr-CA' => [], // fr-CA sorts accents slightly different from fr.
+               'fur' => [ "À", "Á", "Â", "È", "Ì", "Ò", "Ù" ], // not in libicu
+               'fy' => [], // not in libicu
+               'ga' => [],
+               'gd' => [], // not in libicu
+               'gl' => [ "Ch", "Ll", "Ñ" ],
+               'gu' => [ "\xe0\xaa\x82", "\xe0\xaa\x83", "\xe0\xaa\x81", "\xe0\xaa\xb3" ],
+               'ha' => [ 'Ɓ', 'Ɗ', 'Ƙ', 'Sh', 'Ts', 'Ƴ' ],
+               'haw' => [ 'ʻ' ],
+               'he' => [],
+               'hi' => [ "\xe0\xa4\x82", "\xe0\xa4\x83" ],
                'hr' => [ "Č", "Ć", "Dž", "Đ", "Lj", "Nj", "Š", "Ž" ],
                'hsb' => [ "Č", "Dź", "Ě", "Ch", "Ł", "Ń", "Ř", "Š", "Ć", "Ž" ],
                'hu' => [ "Cs", "Dz", "Dzs", "Gy", "Ly", "Ny", "Ö", "Sz", "Ty", "Ü", "Zs" ],
+               'hy' => [ "և" ],
+               'id' => [],
+               'ig' => [ "Ch", "Gb", "Gh", "Gw", "Ị", "Kp", "Kw", "Ṅ", "Nw", "Ny", "Ọ", "Sh", "Ụ" ],
                'is' => [ "Á", "Ð", "É", "Í", "Ó", "Ú", "Ý", "Þ", "Æ", "Ö", "Å" ],
                'it' => [],
+               'ka' => [],
+               'kk' => [ "Ү", "І" ],
+               'kl' => [ "Æ", "Ø", "Å" ],
+               'km' => [
+                       "រ", "ឫ", "ឬ", "ល", "ឭ", "ឮ", "\xe1\x9e\xbb\xe1\x9f\x86",
+                       "\xe1\x9f\x86", "\xe1\x9e\xb6\xe1\x9f\x86", "\xe1\x9f\x87",
+                       "\xe1\x9e\xb7\xe1\x9f\x87", "\xe1\x9e\xbb\xe1\x9f\x87",
+                       "\xe1\x9f\x81\xe1\x9f\x87", "\xe1\x9f\x84\xe1\x9f\x87",
+               ],
+               'kn' => [ "\xe0\xb2\x81", "\xe0\xb2\x83", "\xe0\xb3\xb1", "\xe0\xb3\xb2" ],
+               'kok' => [ "\xe0\xa4\x82", "\xe0\xa4\x83", "ळ", "क्ष" ],
+               'ku' => [ "Ç", "Ê", "Î", "Ş", "Û" ], // not in libicu
+               'ky' => [ "Ё" ],
+               'la' => [], // not in libicu
+               'lb' => [],
+               'lkt' => [ 'Č', 'Ǧ', 'Ȟ', 'Š', 'Ž' ],
+               'ln' => [ 'Ɛ' ],
+               'lo' => [],
                'lt' => [ "Č", "Š", "Ž" ],
                'lv' => [ "Č", "Ģ", "Ķ", "Ļ", "Ņ", "Š", "Ž" ],
                'mk' => [ "Ѓ", "Ќ" ],
+               'ml' => [],
+               'mn' => [],
+               'mo' => [ "Ă", "Â", "Î", "Ş", "Ţ" ], // not in libicu
+               'mr' => [ "\xe0\xa4\x82", "\xe0\xa4\x83", "ळ", "क्ष", "ज्ञ" ],
+               'ms' => [],
+               'mt' => [ "Ċ", "Ġ", "Għ", "Ħ", "Ż" ],
+               'nb' => [ "Æ", "Ø", "Å" ],
+               'ne' => [],
                'nl' => [],
+               'nn' => [ "Æ", "Ø", "Å" ],
+               'no' => [ "Æ", "Ø", "Å" ], // not in libicu. You should probably use nb or nn instead.
+               'oc' => [], // not in libicu
+               'om' => [ 'Ch', 'Dh', 'Kh', 'Ny', 'Ph', 'Sh' ],
+               'or' => [ "\xe0\xac\x81", "\xe0\xac\x82", "\xe0\xac\x83", "କ୍ଷ" ],
+               'pa' => [ "\xe0\xa9\x8d" ],
                'pl' => [ "Ą", "Ć", "Ę", "Ł", "Ń", "Ó", "Ś", "Ź", "Ż" ],
                'pt' => [],
+               'rm' => [], // not in libicu
+               'ro' => [ "Ă", "Â", "Î", "Ş", "Ţ" ],
                'ru' => [],
+               'rup' => [ "Ă", "Â", "Î", "Ľ", "Ń", "Ş", "Ţ" ], // not in libicu
+               'sco' => [],
+               'se' => [
+                       'Á', 'Č', 'Ʒ', 'Ǯ', 'Đ', 'Ǧ', 'Ǥ', 'Ǩ', 'Ŋ',
+                       'Š', 'Ŧ', 'Ž', 'Ø', 'Æ', 'Ȧ', 'Ä', 'Ö'
+               ],
+               'si' => [ "\xe0\xb6\x82", "\xe0\xb6\x83", "\xe0\xb6\xa4" ],
                'sk' => [ "Ä", "Č", "Ch", "Ô", "Š", "Ž" ],
+               'sl' => [ "Č", "Š", "Ž" ],
+               'smn' => [ "Á", "Č", "Đ", "Ŋ", "Š", "Ŧ", "Ž", "Æ", "Ø", "Å", "Ä", "Ö" ],
+               'sq' => [ "Ç", "Dh", "Ë", "Gj", "Ll", "Nj", "Rr", "Sh", "Th", "Xh", "Zh" ],
                'sr' => [],
+               'sr-Latn' => [ "Č", "Ć", "Dž", "Đ", "Lj", "Nj", "Š", "Ž" ],
                'sv' => [ "Å", "Ä", "Ö" ],
                'sv@collation=standard' => [ "Å", "Ä", "Ö" ],
+               'sw' => [],
                'ta' => [
                        "\xE0\xAE\x82", "ஃ", "க்ஷ", "க்", "ங்", "ச்", "ஞ்", "ட்", "ண்", "த்", "ந்",
                        "ப்", "ம்", "ய்", "ர்", "ல்", "வ்", "ழ்", "ள்", "ற்", "ன்", "ஜ்", "ஶ்", "ஷ்",
                        "ஸ்", "ஹ்", "க்ஷ்"
                ],
-               'uk' => [ "Ґ", "Ь" ],
-               'vi' => [ "Ă", "Â", "Đ", "Ê", "Ô", "Ơ", "Ư" ],
-               // Not verified, but likely correct
-               'af' => [],
-               'ast' => [ "Ch", "Ll", "Ñ" ],
-               'az' => [ "Ç", "Ə", "Ğ", "İ", "Ö", "Ş", "Ü" ],
-               'bg' => [],
-               'br' => [ "Ch", "C'h" ],
-               'ca' => [],
-               'co' => [],
-               'da' => [ "Æ", "Ø", "Å" ],
-               'de' => [],
-               'dsb' => [ "Č", "Ć", "Dź", "Ě", "Ch", "Ł", "Ń", "Ŕ", "Š", "Ś", "Ž", "Ź" ],
-               'el' => [],
-               'eo' => [ "Ĉ", "Ĝ", "Ĥ", "Ĵ", "Ŝ", "Ŭ" ],
-               'es' => [ "Ñ" ],
-               'et' => [ "Š", "Ž", "Õ", "Ä", "Ö", "Ü", "W" ], // added W for CollationEt (xx-uca-et)
-               'eu' => [ "Ñ" ],
-               'fo' => [ "Á", "Ð", "Í", "Ó", "Ú", "Ý", "Æ", "Ø", "Å" ],
-               'fur' => [ "À", "Á", "Â", "È", "Ì", "Ò", "Ù" ],
-               'fy' => [],
-               'ga' => [],
-               'gd' => [],
-               'gl' => [ "Ch", "Ll", "Ñ" ],
-               'kk' => [ "Ү", "І" ],
-               'kl' => [ "Æ", "Ø", "Å" ],
-               'ku' => [ "Ç", "Ê", "Î", "Ş", "Û" ],
-               'ky' => [ "Ё" ],
-               'la' => [],
-               'lb' => [],
-               'mo' => [ "Ă", "Â", "Î", "Ş", "Ţ" ],
-               'mt' => [ "Ċ", "Ġ", "Għ", "Ħ", "Ż" ],
-               'no' => [ "Æ", "Ø", "Å" ],
-               'oc' => [],
-               'rm' => [],
-               'ro' => [ "Ă", "Â", "Î", "Ş", "Ţ" ],
-               'rup' => [ "Ă", "Â", "Î", "Ľ", "Ń", "Ş", "Ţ" ],
-               'sco' => [],
-               'sl' => [ "Č", "Š", "Ž" ],
-               'smn' => [ "Á", "Č", "Đ", "Ŋ", "Š", "Ŧ", "Ž", "Æ", "Ø", "Å", "Ä", "Ö" ],
-               'sq' => [ "Ç", "Dh", "Ë", "Gj", "Ll", "Nj", "Rr", "Sh", "Th", "Xh", "Zh" ],
+               'te' => [ "\xe0\xb0\x81", "\xe0\xb0\x82", "\xe0\xb0\x83" ],
+               'th' => [ "ฯ", "\xe0\xb9\x86", "\xe0\xb9\x8d", "\xe0\xb8\xba" ],
                'tk' => [ "Ç", "Ä", "Ž", "Ň", "Ö", "Ş", "Ü", "Ý" ],
-               'tl' => [ "Ñ", "Ng" ],
+               'tl' => [ "Ñ", "Ng" ], // not in libicu
+               'to' => [ "Ng", "ʻ" ],
                'tr' => [ "Ç", "Ğ", "İ", "Ö", "Ş", "Ü" ],
-               'tt' => [ "Ә", "Ө", "Ү", "Җ", "Ң", "Һ" ],
-               'uz' => [ "Ch", "G'", "Ng", "O'", "Sh" ],
+               'tt' => [ "Ә", "Ө", "Ү", "Җ", "Ң", "Һ" ], // not in libicu
+               'uk' => [ "Ґ", "Ь" ],
+               'uz' => [ "Ch", "G'", "Ng", "O'", "Sh" ], // not in libicu
+               'vi' => [ "Ă", "Â", "Đ", "Ê", "Ô", "Ơ", "Ư" ],
+               'vo' => [ "Ä", "Ö", "Ü" ],
+               'yi' => [
+                       "\xd7\x91\xd6\xbf", "\xd7\x9b\xd6\xbc", "\xd7\xa4\xd6\xbc",
+                       "\xd7\xa9\xd7\x82", "\xd7\xaa\xd6\xbc"
+               ],
+               'yo' => [ "Ẹ", "Gb", "Ọ", "Ṣ" ],
+               'zu' => [],
        ];
 
        /**
index feef87d..4d6c68c 100644 (file)
@@ -67,7 +67,7 @@ class HashConfig implements Config, MutableConfig {
        }
 
        /**
-        * @see Config::set
+        * @see MutableConfig::set
         */
        public function set( $name, $value ) {
                $this->settings[$name] = $value;
index 6d07216..7208b7e 100644 (file)
@@ -1134,7 +1134,7 @@ class DatabaseMssql extends DatabaseBase {
        /**
         * MS SQL requires specifying the escape character used in a LIKE query
         * or using Square brackets to surround characters that are to be escaped
-        * http://msdn.microsoft.com/en-us/library/ms179859.aspx
+        * https://msdn.microsoft.com/en-us/library/ms179859.aspx
         * Here we take the Specify-Escape-Character approach since it's less
         * invasive, renders a query that is closer to other DB's and better at
         * handling square bracket escaping
index f1a01fe..ce0cda1 100644 (file)
@@ -155,7 +155,7 @@ class AvroFormatter implements FormatterInterface {
         */
        public function getSchemaRevisionId( $channel ) {
                if ( isset( $this->schemas[$channel]['revision'] ) ) {
-                       return (int) $this->schemas[$channel]['revision'];
+                       return (int)$this->schemas[$channel]['revision'];
                }
                return null;
        }
index c7d378e..229a9a2 100644 (file)
@@ -205,64 +205,85 @@ class LinksUpdate extends DataUpdate implements EnqueueableDataUpdate {
 
        protected function doIncrementalUpdate() {
                # Page links
-               $existing = $this->getExistingLinks();
-               $this->linkDeletions = $this->getLinkDeletions( $existing );
-               $this->linkInsertions = $this->getLinkInsertions( $existing );
+               $existingPL = $this->getExistingLinks();
+               $this->linkDeletions = $this->getLinkDeletions( $existingPL );
+               $this->linkInsertions = $this->getLinkInsertions( $existingPL );
                $this->incrTableUpdate( 'pagelinks', 'pl', $this->linkDeletions, $this->linkInsertions );
 
                # Image links
-               $existing = $this->getExistingImages();
-               $imageDeletes = $this->getImageDeletions( $existing );
-               $this->incrTableUpdate( 'imagelinks', 'il', $imageDeletes,
-                       $this->getImageInsertions( $existing ) );
+               $existingIL = $this->getExistingImages();
+               $imageDeletes = $this->getImageDeletions( $existingIL );
+               $this->incrTableUpdate(
+                       'imagelinks',
+                       'il',
+                       $imageDeletes,
+                       $this->getImageInsertions( $existingIL ) );
 
                # Invalidate all image description pages which had links added or removed
-               $imageUpdates = $imageDeletes + array_diff_key( $this->mImages, $existing );
+               $imageUpdates = $imageDeletes + array_diff_key( $this->mImages, $existingIL );
                $this->invalidateImageDescriptions( $imageUpdates );
 
                # External links
-               $existing = $this->getExistingExternals();
-               $this->incrTableUpdate( 'externallinks', 'el', $this->getExternalDeletions( $existing ),
-                       $this->getExternalInsertions( $existing ) );
+               $existingEL = $this->getExistingExternals();
+               $this->incrTableUpdate(
+                       'externallinks',
+                       'el',
+                       $this->getExternalDeletions( $existingEL ),
+                       $this->getExternalInsertions( $existingEL ) );
 
                # Language links
-               $existing = $this->getExistingInterlangs();
-               $this->incrTableUpdate( 'langlinks', 'll', $this->getInterlangDeletions( $existing ),
-                       $this->getInterlangInsertions( $existing ) );
+               $existingLL = $this->getExistingInterlangs();
+               $this->incrTableUpdate(
+                       'langlinks',
+                       'll',
+                       $this->getInterlangDeletions( $existingLL ),
+                       $this->getInterlangInsertions( $existingLL ) );
 
                # Inline interwiki links
-               $existing = $this->getExistingInterwikis();
-               $this->incrTableUpdate( 'iwlinks', 'iwl', $this->getInterwikiDeletions( $existing ),
-                       $this->getInterwikiInsertions( $existing ) );
+               $existingIW = $this->getExistingInterwikis();
+               $this->incrTableUpdate(
+                       'iwlinks',
+                       'iwl',
+                       $this->getInterwikiDeletions( $existingIW ),
+                       $this->getInterwikiInsertions( $existingIW ) );
 
                # Template links
-               $existing = $this->getExistingTemplates();
-               $this->incrTableUpdate( 'templatelinks', 'tl', $this->getTemplateDeletions( $existing ),
-                       $this->getTemplateInsertions( $existing ) );
+               $existingTL = $this->getExistingTemplates();
+               $this->incrTableUpdate(
+                       'templatelinks',
+                       'tl',
+                       $this->getTemplateDeletions( $existingTL ),
+                       $this->getTemplateInsertions( $existingTL ) );
 
                # Category links
-               $existing = $this->getExistingCategories();
-               $categoryDeletes = $this->getCategoryDeletions( $existing );
-               $this->incrTableUpdate( 'categorylinks', 'cl', $categoryDeletes,
-                       $this->getCategoryInsertions( $existing ) );
-
-               # Invalidate all categories which were added, deleted or changed (set symmetric difference)
-               $categoryInserts = array_diff_assoc( $this->mCategories, $existing );
+               $existingCL = $this->getExistingCategories();
+               $categoryDeletes = $this->getCategoryDeletions( $existingCL );
+               $this->incrTableUpdate(
+                       'categorylinks',
+                       'cl',
+                       $categoryDeletes,
+                       $this->getCategoryInsertions( $existingCL ) );
+               $categoryInserts = array_diff_assoc( $this->mCategories, $existingCL );
                $categoryUpdates = $categoryInserts + $categoryDeletes;
-               $this->invalidateCategories( $categoryUpdates );
-               $this->updateCategoryCounts( $categoryInserts, $categoryDeletes );
 
                # Page properties
-               $existing = $this->getExistingProperties();
-               $this->propertyDeletions = $this->getPropertyDeletions( $existing );
-               $this->incrTableUpdate( 'page_props', 'pp', $this->propertyDeletions,
-                       $this->getPropertyInsertions( $existing ) );
+               $existingPP = $this->getExistingProperties();
+               $this->propertyDeletions = $this->getPropertyDeletions( $existingPP );
+               $this->incrTableUpdate(
+                       'page_props',
+                       'pp',
+                       $this->propertyDeletions,
+                       $this->getPropertyInsertions( $existingPP ) );
 
                # Invalidate the necessary pages
-               $this->propertyInsertions = array_diff_assoc( $this->mProperties, $existing );
+               $this->propertyInsertions = array_diff_assoc( $this->mProperties, $existingPP );
                $changed = $this->propertyDeletions + $this->propertyInsertions;
                $this->invalidateProperties( $changed );
 
+               # Invalidate all categories which were added, deleted or changed (set symmetric difference)
+               $this->invalidateCategories( $categoryUpdates );
+               $this->updateCategoryCounts( $categoryInserts, $categoryDeletes );
+
                # Refresh links of all pages including this page
                # This will be in a separate transaction
                if ( $this->mRecursive ) {
@@ -324,7 +345,7 @@ class LinksUpdate extends DataUpdate implements EnqueueableDataUpdate {
        /**
         * @param array $cats
         */
-       function invalidateCategories( $cats ) {
+       private function invalidateCategories( $cats ) {
                PurgeJobUtils::invalidatePages( $this->getDB(), NS_CATEGORY, array_keys( $cats ) );
        }
 
@@ -333,17 +354,31 @@ class LinksUpdate extends DataUpdate implements EnqueueableDataUpdate {
         * @param array $added Associative array of category name => sort key
         * @param array $deleted Associative array of category name => sort key
         */
-       function updateCategoryCounts( $added, $deleted ) {
-               $a = WikiPage::factory( $this->mTitle );
-               $a->updateCategoryCounts(
-                       array_keys( $added ), array_keys( $deleted )
-               );
+       private function updateCategoryCounts( array $added, array $deleted ) {
+               global $wgUpdateRowsPerQuery;
+
+               $wp = WikiPage::factory( $this->mTitle );
+               $factory = MediaWikiServices::getInstance()->getDBLoadBalancerFactory();
+
+               foreach ( array_chunk( array_keys( $added ), $wgUpdateRowsPerQuery ) as $addBatch ) {
+                       $wp->updateCategoryCounts( $addBatch, [], $this->mId );
+                       $factory->commitAndWaitForReplication(
+                               __METHOD__, $this->ticket, [ 'wiki' => $this->getDB()->getWikiID() ]
+                       );
+               }
+
+               foreach ( array_chunk( array_keys( $deleted ), $wgUpdateRowsPerQuery ) as $deleteBatch ) {
+                       $wp->updateCategoryCounts( [], $deleteBatch, $this->mId );
+                       $factory->commitAndWaitForReplication(
+                               __METHOD__, $this->ticket, [ 'wiki' => $this->getDB()->getWikiID() ]
+                       );
+               }
        }
 
        /**
         * @param array $images
         */
-       function invalidateImageDescriptions( $images ) {
+       private function invalidateImageDescriptions( $images ) {
                PurgeJobUtils::invalidatePages( $this->getDB(), NS_FILE, array_keys( $images ) );
        }
 
index 62c8b00..b9a259b 100644 (file)
@@ -108,7 +108,6 @@ class SearchUpdate implements DeferrableUpdate {
                        # Perform the actual update
                        $search->update( $this->id, $normalTitle, $search->normalizeText( $text ) );
                }
-
        }
 
        /**
index 16e9a44..a5a8676 100644 (file)
@@ -496,12 +496,11 @@ class DifferenceEngine extends ContextSource {
                                                [
                                                        'action' => 'markpatrolled',
                                                        'rcid' => $linkInfo['rcid'],
-                                                       'token' => $linkInfo['token'],
                                                ]
                                        ) . ']</span>';
                                // Allow extensions to change the markpatrolled link
                                Hooks::run( 'DifferenceEngineMarkPatrolledLink', [ $this,
-                                       &$this->mMarkPatrolledLink, $linkInfo['rcid'], $linkInfo['token'] ] );
+                                       &$this->mMarkPatrolledLink, $linkInfo['rcid'] ] );
                        }
                }
                return $this->mMarkPatrolledLink;
@@ -511,7 +510,7 @@ class DifferenceEngine extends ContextSource {
         * Returns an array of meta data needed to build a "mark as patrolled" link and
         * adds the mediawiki.page.patrol.ajax to the output.
         *
-        * @return array|false An array of meta data for a patrol link (rcid & token)
+        * @return array|false An array of meta data for a patrol link (rcid only)
         *  or false if no link is needed
         */
        protected function getMarkPatrolledLinkInfo() {
@@ -561,10 +560,8 @@ class DifferenceEngine extends ContextSource {
                                        $this->getOutput()->addModules( 'mediawiki.page.patrol.ajax' );
                                }
 
-                               $token = $user->getEditToken( $rcid );
                                return [
                                        'rcid' => $rcid,
-                                       'token' => $token,
                                ];
                        }
                }
@@ -882,6 +879,10 @@ class DifferenceEngine extends ContextSource {
                        return $result;
                };
 
+               /**
+                * @param Status $status
+                * @throws FatalError
+                */
                $error = function( $status ) {
                        throw new FatalError( $status->getWikiText() );
                };
index 296e3b7..9c9b1c9 100644 (file)
@@ -42,7 +42,6 @@ class WordLevelDiff extends \Diff {
         * @param string[] $linesAfter
         */
        public function __construct( $linesBefore, $linesAfter ) {
-
                list( $wordsBefore, $wordsBeforeStripped ) = $this->split( $linesBefore );
                list( $wordsAfter, $wordsAfterStripped ) = $this->split( $linesAfter );
 
@@ -68,7 +67,6 @@ class WordLevelDiff extends \Diff {
                                $yi += count( $closing );
                        }
                }
-
        }
 
        /**
@@ -77,7 +75,6 @@ class WordLevelDiff extends \Diff {
         * @return array[]
         */
        private function split( $lines ) {
-
                $words = [];
                $stripped = [];
                $first = true;
index 736cb06..3d8ddb8 100644 (file)
@@ -284,7 +284,7 @@ TXT;
                $trace = $trace ?: debug_backtrace();
                $logger = LoggerFactory::getInstance( 'fatal' );
                $logger->error( $msg, [
-                       'exception' => [
+                       'fatal_exception' => [
                                'class' => 'ErrorException',
                                'message' => "PHP Fatal Error: {$message}",
                                'code' => $level,
index 42168d7..ab26803 100644 (file)
@@ -51,7 +51,7 @@ class XmlDumpWriter {
                         * you copy in the new xsd file.
                         *
                         * After it is reviewed, merged and deployed (sync-docroot), the index.html needs purging.
-                        * echo "http://www.mediawiki.org/xml/index.html" | mwscript purgeList.php --wiki=aawiki
+                        * echo "https://www.mediawiki.org/xml/index.html" | mwscript purgeList.php --wiki=aawiki
                         */
                        'xsi:schemaLocation' => "http://www.mediawiki.org/xml/export-$ver/ " .
                                "http://www.mediawiki.org/xml/export-$ver.xsd",
index fc23f76..5936e7d 100644 (file)
@@ -34,7 +34,7 @@ class MySqlLockManager extends DBLockManager {
 
        /**
         * Get a connection to a lock DB and acquire locks on $paths.
-        * This does not use GET_LOCK() per http://bugs.mysql.com/bug.php?id=1118.
+        * This does not use GET_LOCK() per https://bugs.mysql.com/bug.php?id=1118.
         *
         * @see DBLockManager::getLocksOnServer()
         * @param string $lockSrv
index c195241..c4730d7 100644 (file)
@@ -195,12 +195,12 @@ class LocalRepo extends FileRepo {
                        $expiry = 86400; // has invalidation, 1 day
                }
 
-               $that = $this;
+               $method = __METHOD__;
                $redirDbKey = ObjectCache::getMainWANInstance()->getWithSetCallback(
                        $memcKey,
                        $expiry,
-                       function ( $oldValue, &$ttl, array &$setOpts ) use ( $that, $title ) {
-                               $dbr = $that->getSlaveDB(); // possibly remote DB
+                       function ( $oldValue, &$ttl, array &$setOpts ) use ( $method, $title ) {
+                               $dbr = $this->getSlaveDB(); // possibly remote DB
 
                                $setOpts += Database::getCacheSetOptions( $dbr );
 
@@ -213,7 +213,7 @@ class LocalRepo extends FileRepo {
                                                        'page_title' => $title->getDBkey(),
                                                        'rd_from = page_id'
                                                ],
-                                               __METHOD__
+                                               $method
                                        );
                                } else {
                                        $row = false;
index 9df9360..d3a14fa 100644 (file)
@@ -2234,12 +2234,7 @@ class LocalFileDeleteBatch {
 
                // Bitfields to further suppress the content
                if ( $this->suppress ) {
-                       $bitfield = 0;
-                       // This should be 15...
-                       $bitfield |= Revision::DELETED_TEXT;
-                       $bitfield |= Revision::DELETED_COMMENT;
-                       $bitfield |= Revision::DELETED_USER;
-                       $bitfield |= Revision::DELETED_RESTRICTED;
+                       $bitfield = Revision::SUPPRESSED_ALL;
                } else {
                        $bitfield = 'oi_deleted';
                }
@@ -2259,7 +2254,6 @@ class LocalFileDeleteBatch {
                                        'fa_deleted_timestamp' => $encTimestamp,
                                        'fa_deleted_reason' => $encReason,
                                        'fa_deleted' => $this->suppress ? $bitfield : 0,
-
                                        'fa_name' => 'img_name',
                                        'fa_archive_name' => 'NULL',
                                        'fa_size' => 'img_size',
index a17ca6e..06fef4f 100644 (file)
@@ -194,14 +194,12 @@ class OldLocalFile extends LocalFile {
                } else {
                        $this->fileExists = false;
                }
-
        }
 
        /**
         * Load lazy file metadata from the DB
         */
        protected function loadExtraFromDB() {
-
                $this->extraDataLoaded = true;
                $dbr = $this->repo->getSlaveDB();
                $conds = [ 'oi_name' => $this->getName() ];
@@ -227,7 +225,6 @@ class OldLocalFile extends LocalFile {
                } else {
                        throw new MWException( "Could not find data for image '{$this->archive_name}'." );
                }
-
        }
 
        /**
index 1f4d99e..cadb502 100644 (file)
@@ -147,6 +147,7 @@ class HTMLForm extends ContextSource {
                'namespaceselect' => 'HTMLSelectNamespace',
                'namespaceselectwithbutton' => 'HTMLSelectNamespaceWithButton',
                'tagfilter' => 'HTMLTagFilter',
+               'sizefilter' => 'HTMLSizeFilterField',
                'submit' => 'HTMLSubmitField',
                'hidden' => 'HTMLHiddenField',
                'edittools' => 'HTMLEditTools',
index 4afdea7..8390a0b 100644 (file)
@@ -42,7 +42,7 @@ abstract class HTMLFormField {
         *
         * @return string Valid HTML.
         */
-       abstract function getInputHTML( $value );
+       abstract public function getInputHTML( $value );
 
        /**
         * Same as getInputHTML, but returns an OOUI object.
@@ -51,7 +51,7 @@ abstract class HTMLFormField {
         * @param string $value
         * @return OOUI\Widget|false
         */
-       function getInputOOUI( $value ) {
+       public function getInputOOUI( $value ) {
                return false;
        }
 
@@ -74,7 +74,7 @@ abstract class HTMLFormField {
         *
         * @return Message
         */
-       function msg() {
+       public function msg() {
                $args = func_get_args();
 
                if ( $this->mParent ) {
@@ -266,7 +266,7 @@ abstract class HTMLFormField {
         * @param array $alldata The data collected from the form
         * @return bool
         */
-       function isHidden( $alldata ) {
+       public function isHidden( $alldata ) {
                if ( !$this->mHideIf ) {
                        return false;
                }
@@ -284,7 +284,7 @@ abstract class HTMLFormField {
         *
         * @return bool True to cancel the submission
         */
-       function cancelSubmit( $value, $alldata ) {
+       public function cancelSubmit( $value, $alldata ) {
                return false;
        }
 
@@ -299,7 +299,7 @@ abstract class HTMLFormField {
         * @return bool|string True on success, or String error to display, or
         *   false to fail validation without displaying an error.
         */
-       function validate( $value, $alldata ) {
+       public function validate( $value, $alldata ) {
                if ( $this->isHidden( $alldata ) ) {
                        return true;
                }
@@ -318,7 +318,7 @@ abstract class HTMLFormField {
                return true;
        }
 
-       function filter( $value, $alldata ) {
+       public function filter( $value, $alldata ) {
                if ( isset( $this->mFilterCallback ) ) {
                        $value = call_user_func( $this->mFilterCallback, $value, $alldata, $this->mParent );
                }
@@ -370,7 +370,7 @@ abstract class HTMLFormField {
         * @param WebRequest $request
         * @return string The value
         */
-       function loadDataFromRequest( $request ) {
+       public function loadDataFromRequest( $request ) {
                if ( $request->getCheck( $this->mName ) ) {
                        return $request->getText( $this->mName );
                } else {
@@ -386,7 +386,7 @@ abstract class HTMLFormField {
         * @since 1.22 The 'label' attribute no longer accepts raw HTML, use 'label-raw' instead
         * @throws MWException
         */
-       function __construct( $params ) {
+       public function __construct( $params ) {
                $this->mParams = $params;
 
                if ( isset( $params['parent'] ) && $params['parent'] instanceof HTMLForm ) {
@@ -472,7 +472,7 @@ abstract class HTMLFormField {
         *
         * @return string Complete HTML table row.
         */
-       function getTableRow( $value ) {
+       public function getTableRow( $value ) {
                list( $errors, $errorClass ) = $this->getErrorsAndErrorClass( $value );
                $inputHtml = $this->getInputHTML( $value );
                $fieldType = get_class( $this );
@@ -903,7 +903,7 @@ abstract class HTMLFormField {
         * @since 1.28
         * @return string[]
         */
-       function getNotices() {
+       public function getNotices() {
                $notices = [];
 
                if ( isset( $this->mParams['notice-message'] ) ) {
@@ -924,11 +924,11 @@ abstract class HTMLFormField {
        /**
         * @return string HTML
         */
-       function getLabel() {
+       public function getLabel() {
                return is_null( $this->mLabel ) ? '' : $this->mLabel;
        }
 
-       function getLabelHtml( $cellAttributes = [] ) {
+       public function getLabelHtml( $cellAttributes = [] ) {
                # Don't output a for= attribute for labels with no associated input.
                # Kind of hacky here, possibly we don't want these to be <label>s at all.
                $for = [];
@@ -967,7 +967,7 @@ abstract class HTMLFormField {
                return $html;
        }
 
-       function getDefault() {
+       public function getDefault() {
                if ( isset( $this->mDefault ) ) {
                        return $this->mDefault;
                } else {
@@ -1036,7 +1036,7 @@ abstract class HTMLFormField {
         * @param array $array
         * @return array
         */
-       static function forceToStringRecursive( $array ) {
+       public static function forceToStringRecursive( $array ) {
                if ( is_array( $array ) ) {
                        return array_map( [ __CLASS__, 'forceToStringRecursive' ], $array );
                } else {
index 2c09ea4..d44fc60 100644 (file)
@@ -7,5 +7,5 @@ interface HTMLNestedFilterable {
         *
         * @param array $data
         */
-       function filterDataForSubmit( $data );
+       public function filterDataForSubmit( $data );
 }
index 6fbf15b..46b570d 100644 (file)
@@ -48,7 +48,7 @@ class OOUIHTMLForm extends HTMLForm {
                return $field;
        }
 
-       function getButtons() {
+       public function getButtons() {
                $buttons = '';
 
                // IE<8 has bugs with <button>, so we'll need to avoid them.
@@ -190,7 +190,7 @@ class OOUIHTMLForm extends HTMLForm {
         * @param string $elementsType
         * @return string
         */
-       function getErrorsOrWarnings( $elements, $elementsType ) {
+       public function getErrorsOrWarnings( $elements, $elementsType ) {
                if ( !in_array( $elementsType, [ 'error', 'warning' ] ) ) {
                        throw new DomainException( $elementsType . ' is not a valid type.' );
                }
@@ -230,7 +230,7 @@ class OOUIHTMLForm extends HTMLForm {
                return '';
        }
 
-       function getHeaderText( $section = null ) {
+       public function getHeaderText( $section = null ) {
                if ( is_null( $section ) ) {
                        // We handle $this->mHeader elsewhere, in getBody()
                        return '';
@@ -239,7 +239,7 @@ class OOUIHTMLForm extends HTMLForm {
                }
        }
 
-       function getBody() {
+       public function getBody() {
                $fieldset = parent::getBody();
                // FIXME This only works for forms with no subsections
                if ( $fieldset instanceof OOUI\FieldsetLayout ) {
@@ -273,7 +273,7 @@ class OOUIHTMLForm extends HTMLForm {
                return $fieldset;
        }
 
-       function wrapForm( $html ) {
+       public function wrapForm( $html ) {
                $form = new OOUI\FormLayout( $this->getFormAttributes() + [
                        'classes' => [ 'mw-htmlform-ooui' ],
                        'content' => new OOUI\HtmlSnippet( $html ),
index c920ac3..5d9f7a0 100644 (file)
@@ -50,7 +50,7 @@ class VFormHTMLForm extends HTMLForm {
                return $field;
        }
 
-       function getHTML( $submitResult ) {
+       public function getHTML( $submitResult ) {
                // This is required for VForm HTMLForms that use that style regardless
                // of wgUseMediaWikiUIEverywhere (since they pre-date it).
                // When wgUseMediaWikiUIEverywhere is removed, this should be consolidated
@@ -71,12 +71,12 @@ class VFormHTMLForm extends HTMLForm {
                return $attribs;
        }
 
-       function wrapForm( $html ) {
+       public function wrapForm( $html ) {
                // Always discard $this->mWrapperLegend
                return Html::rawElement( 'form', $this->getFormAttributes(), $html );
        }
 
-       function getButtons() {
+       public function getButtons() {
                $buttons = '';
 
                if ( $this->mShowSubmit ) {
index 76a88d5..0f86ee8 100644 (file)
@@ -29,7 +29,7 @@
 class HTMLAutoCompleteSelectField extends HTMLTextField {
        protected $autocomplete = [];
 
-       function __construct( $params ) {
+       public function __construct( $params ) {
                $params += [
                        'require-match' => false,
                ];
@@ -63,7 +63,7 @@ class HTMLAutoCompleteSelectField extends HTMLTextField {
                }
        }
 
-       function loadDataFromRequest( $request ) {
+       public function loadDataFromRequest( $request ) {
                if ( $request->getCheck( $this->mName ) ) {
                        $val = $request->getText( $this->mName . '-select', 'other' );
 
@@ -80,7 +80,7 @@ class HTMLAutoCompleteSelectField extends HTMLTextField {
                }
        }
 
-       function validate( $value, $alldata ) {
+       public function validate( $value, $alldata ) {
                $p = parent::validate( $value, $alldata );
 
                if ( $p !== true ) {
@@ -116,7 +116,7 @@ class HTMLAutoCompleteSelectField extends HTMLTextField {
                return $attribs;
        }
 
-       function getInputHTML( $value ) {
+       public function getInputHTML( $value ) {
                $oldClass = $this->mClass;
                $this->mClass = (array)$this->mClass;
 
@@ -170,7 +170,7 @@ class HTMLAutoCompleteSelectField extends HTMLTextField {
         * @param string $value
         * @return false
         */
-       function getInputOOUI( $value ) {
+       public function getInputOOUI( $value ) {
                // To be implemented, for now override the function from HTMLTextField
                return false;
        }
index a553839..b080e18 100644 (file)
@@ -4,7 +4,7 @@
  * A checkbox field
  */
 class HTMLCheckField extends HTMLFormField {
-       function getInputHTML( $value ) {
+       public function getInputHTML( $value ) {
                global $wgUseMediaWikiUIEverywhere;
 
                if ( !empty( $this->mParams['invert'] ) ) {
@@ -79,7 +79,7 @@ class HTMLCheckField extends HTMLFormField {
         *
         * @return string
         */
-       function getLabel() {
+       public function getLabel() {
                if ( $this->mParent instanceof OOUIHTMLForm ) {
                        return $this->mLabel;
                } elseif (
@@ -113,7 +113,7 @@ class HTMLCheckField extends HTMLFormField {
         *
         * @return bool
         */
-       function loadDataFromRequest( $request ) {
+       public function loadDataFromRequest( $request ) {
                $invert = isset( $this->mParams['invert'] ) && $this->mParams['invert'];
 
                // GetCheck won't work like we want for checks.
index b324fb6..890cd7c 100644 (file)
@@ -38,7 +38,7 @@ class HTMLCheckMatrix extends HTMLFormField implements HTMLNestedFilterable {
                parent::__construct( $params );
        }
 
-       function validate( $value, $alldata ) {
+       public function validate( $value, $alldata ) {
                $rows = $this->mParams['rows'];
                $columns = $this->mParams['columns'];
 
@@ -79,7 +79,7 @@ class HTMLCheckMatrix extends HTMLFormField implements HTMLNestedFilterable {
         *
         * @return string
         */
-       function getInputHTML( $value ) {
+       public function getInputHTML( $value ) {
                $html = '';
                $tableContents = '';
                $rows = $this->mParams['rows'];
@@ -186,7 +186,7 @@ class HTMLCheckMatrix extends HTMLFormField implements HTMLNestedFilterable {
         *
         * @return string Complete HTML table row
         */
-       function getTableRow( $value ) {
+       public function getTableRow( $value ) {
                list( $errors, $errorClass ) = $this->getErrorsAndErrorClass( $value );
                $inputHtml = $this->getInputHTML( $value );
                $fieldType = get_class( $this );
@@ -224,7 +224,7 @@ class HTMLCheckMatrix extends HTMLFormField implements HTMLNestedFilterable {
         *
         * @return array
         */
-       function loadDataFromRequest( $request ) {
+       public function loadDataFromRequest( $request ) {
                if ( $this->isSubmitAttempt( $request ) ) {
                        // Checkboxes are just not added to the request arrays if they're not checked,
                        // so it's perfectly possible for there not to be an entry at all
@@ -235,7 +235,7 @@ class HTMLCheckMatrix extends HTMLFormField implements HTMLNestedFilterable {
                }
        }
 
-       function getDefault() {
+       public function getDefault() {
                if ( isset( $this->mDefault ) ) {
                        return $this->mDefault;
                } else {
@@ -243,7 +243,7 @@ class HTMLCheckMatrix extends HTMLFormField implements HTMLNestedFilterable {
                }
        }
 
-       function filterDataForSubmit( $data ) {
+       public function filterDataForSubmit( $data ) {
                $columns = HTMLFormField::flattenOptions( $this->mParams['columns'] );
                $rows = HTMLFormField::flattenOptions( $this->mParams['rows'] );
                $res = [];
index 0c3bc5a..3f63c18 100644 (file)
@@ -25,7 +25,7 @@ class HTMLComboboxField extends HTMLTextField {
                return $attribs;
        }
 
-       function getInputHTML( $value ) {
+       public function getInputHTML( $value ) {
                $datalist = new XmlSelect( false, $this->mName . '-datalist' );
                $datalist->setTagName( 'datalist' );
                $datalist->addOptions( $this->getOptions() );
@@ -33,7 +33,7 @@ class HTMLComboboxField extends HTMLTextField {
                return parent::getInputHTML( $value ) . $datalist->getHTML();
        }
 
-       function getInputOOUI( $value ) {
+       public function getInputOOUI( $value ) {
                $disabled = false;
                $allowedParams = [ 'tabindex' ];
                $attribs = OOUI\Element::configFromHtmlAttributes(
index 3390a56..88dcd24 100644 (file)
@@ -75,7 +75,7 @@ class HTMLDateTimeField extends HTMLTextField {
                return $ret;
        }
 
-       function loadDataFromRequest( $request ) {
+       public function loadDataFromRequest( $request ) {
                if ( !$request->getCheck( $this->mName ) ) {
                        return $this->getDefault();
                }
@@ -85,7 +85,7 @@ class HTMLDateTimeField extends HTMLTextField {
                return $date ? $this->formatDate( $date ) : $value;
        }
 
-       function validate( $value, $alldata ) {
+       public function validate( $value, $alldata ) {
                $p = parent::validate( $value, $alldata );
 
                if ( $p !== true ) {
index 2ef4978..d1250c0 100644 (file)
@@ -4,11 +4,11 @@
  * A field that will contain a numeric value
  */
 class HTMLFloatField extends HTMLTextField {
-       function getSize() {
+       public function getSize() {
                return isset( $this->mParams['size'] ) ? $this->mParams['size'] : 20;
        }
 
-       function validate( $value, $alldata ) {
+       public function validate( $value, $alldata ) {
                $p = parent::validate( $value, $alldata );
 
                if ( $p !== true ) {
@@ -17,7 +17,7 @@ class HTMLFloatField extends HTMLTextField {
 
                $value = trim( $value );
 
-               # http://www.w3.org/TR/html5/infrastructure.html#floating-point-numbers
+               # https://www.w3.org/TR/html5/infrastructure.html#floating-point-numbers
                # with the addition that a leading '+' sign is ok.
                if ( !preg_match( '/^((\+|\-)?\d+(\.\d+)?(E(\+|\-)?\d+)?)?$/i', $value ) ) {
                        return $this->msg( 'htmlform-float-invalid' )->parseAsBlock();
index c0fce2b..02562c4 100644 (file)
@@ -11,7 +11,7 @@ class HTMLHiddenField extends HTMLFormField {
                }
 
                # Per HTML5 spec, hidden fields cannot be 'required'
-               # http://www.w3.org/TR/html5/forms.html#hidden-state-%28type=hidden%29
+               # https://www.w3.org/TR/html5/forms.html#hidden-state-%28type=hidden%29
                unset( $this->mParams['required'] );
        }
 
index 6dc5d08..1376d0c 100644 (file)
@@ -19,7 +19,7 @@ class HTMLInfoField extends HTMLFormField {
                parent::__construct( $info );
        }
 
-       function getDefault() {
+       public function getDefault() {
                $default = parent::getDefault();
                if ( $default instanceof Closure ) {
                        $default = call_user_func( $default, $this->mParams );
index b0148d9..c87a778 100644 (file)
@@ -4,14 +4,14 @@
  * A field that must contain a number
  */
 class HTMLIntField extends HTMLFloatField {
-       function validate( $value, $alldata ) {
+       public function validate( $value, $alldata ) {
                $p = parent::validate( $value, $alldata );
 
                if ( $p !== true ) {
                        return $p;
                }
 
-               # http://www.w3.org/TR/html5/infrastructure.html#signed-integers
+               # https://www.w3.org/TR/html5/infrastructure.html#signed-integers
                # with the addition that a leading '+' sign is ok. Note that leading zeros
                # are fine, and will be left in the input, which is useful for things like
                # phone numbers when you know that they are integers (the HTML5 type=tel
index fee5d63..58de763 100644 (file)
@@ -27,7 +27,7 @@ class HTMLMultiSelectField extends HTMLFormField implements HTMLNestedFilterable
                }
        }
 
-       function validate( $value, $alldata ) {
+       public function validate( $value, $alldata ) {
                $p = parent::validate( $value, $alldata );
 
                if ( $p !== true ) {
@@ -50,7 +50,7 @@ class HTMLMultiSelectField extends HTMLFormField implements HTMLNestedFilterable
                }
        }
 
-       function getInputHTML( $value ) {
+       public function getInputHTML( $value ) {
                if ( isset( $this->mParams['dropdown'] ) ) {
                        $this->mParent->getOutput()->addModules( 'jquery.chosen' );
                }
@@ -61,7 +61,7 @@ class HTMLMultiSelectField extends HTMLFormField implements HTMLNestedFilterable
                return $html;
        }
 
-       function formatOptions( $options, $value ) {
+       public function formatOptions( $options, $value ) {
                $html = '';
 
                $attribs = $this->getAttributes( [ 'disabled', 'tabindex' ] );
@@ -151,7 +151,7 @@ class HTMLMultiSelectField extends HTMLFormField implements HTMLNestedFilterable
         *
         * @return string
         */
-       function loadDataFromRequest( $request ) {
+       public function loadDataFromRequest( $request ) {
                if ( $this->isSubmitAttempt( $request ) ) {
                        // Checkboxes are just not added to the request arrays if they're not checked,
                        // so it's perfectly possible for there not to be an entry at all
@@ -162,7 +162,7 @@ class HTMLMultiSelectField extends HTMLFormField implements HTMLNestedFilterable
                }
        }
 
-       function getDefault() {
+       public function getDefault() {
                if ( isset( $this->mDefault ) ) {
                        return $this->mDefault;
                } else {
@@ -170,7 +170,7 @@ class HTMLMultiSelectField extends HTMLFormField implements HTMLNestedFilterable
                }
        }
 
-       function filterDataForSubmit( $data ) {
+       public function filterDataForSubmit( $data ) {
                $data = HTMLFormField::forceToStringRecursive( $data );
                $options = HTMLFormField::flattenOptions( $this->getOptions() );
 
index 42c2fdf..69dc617 100644 (file)
@@ -19,7 +19,7 @@ class HTMLRadioField extends HTMLFormField {
                }
        }
 
-       function validate( $value, $alldata ) {
+       public function validate( $value, $alldata ) {
                $p = parent::validate( $value, $alldata );
 
                if ( $p !== true ) {
@@ -47,13 +47,13 @@ class HTMLRadioField extends HTMLFormField {
         *
         * @return string
         */
-       function getInputHTML( $value ) {
+       public function getInputHTML( $value ) {
                $html = $this->formatOptions( $this->getOptions(), strval( $value ) );
 
                return $html;
        }
 
-       function getInputOOUI( $value ) {
+       public function getInputOOUI( $value ) {
                $options = [];
                foreach ( $this->getOptions() as $label => $data ) {
                        $options[] = [
@@ -76,7 +76,7 @@ class HTMLRadioField extends HTMLFormField {
                return true;
        }
 
-       function formatOptions( $options, $value ) {
+       public function formatOptions( $options, $value ) {
                global $wgUseMediaWikiUIEverywhere;
 
                $html = '';
index 8dc16bf..5a18025 100644 (file)
@@ -32,7 +32,7 @@ class HTMLRestrictionsField extends HTMLTextAreaField {
         * @param WebRequest $request
         * @return string|MWRestrictions Restrictions object or original string if invalid
         */
-       function loadDataFromRequest( $request ) {
+       public function loadDataFromRequest( $request ) {
                if ( !$request->getCheck( $this->mName ) ) {
                        return $this->getDefault();
                }
index e75c2b2..86e8e75 100644 (file)
@@ -11,7 +11,7 @@
  * @todo FIXME: If made 'required', only the text field should be compulsory.
  */
 class HTMLSelectAndOtherField extends HTMLSelectField {
-       function __construct( $params ) {
+       public function __construct( $params ) {
                if ( array_key_exists( 'other', $params ) ) {
                        // Do nothing
                } elseif ( array_key_exists( 'other-message', $params ) ) {
@@ -31,10 +31,9 @@ class HTMLSelectAndOtherField extends HTMLSelectField {
                        $this->mOptions = [ $params['other'] => 'other' ] + $this->mOptions;
                }
                $this->mFlatOptions = self::flattenOptions( $this->getOptions() );
-
        }
 
-       function getInputHTML( $value ) {
+       public function getInputHTML( $value ) {
                $select = parent::getInputHTML( $value[1] );
 
                $textAttribs = [
@@ -64,7 +63,7 @@ class HTMLSelectAndOtherField extends HTMLSelectField {
                return "$select<br />\n$textbox";
        }
 
-       function getInputOOUI( $value ) {
+       public function getInputOOUI( $value ) {
                return false;
        }
 
@@ -73,7 +72,7 @@ class HTMLSelectAndOtherField extends HTMLSelectField {
         *
         * @return array("<overall message>","<select value>","<text field value>")
         */
-       function loadDataFromRequest( $request ) {
+       public function loadDataFromRequest( $request ) {
                if ( $request->getCheck( $this->mName ) ) {
                        $list = $request->getText( $this->mName );
                        $text = $request->getText( $this->mName . '-other' );
@@ -108,11 +107,11 @@ class HTMLSelectAndOtherField extends HTMLSelectField {
                return [ $final, $list, $text ];
        }
 
-       function getSize() {
+       public function getSize() {
                return isset( $this->mParams['size'] ) ? $this->mParams['size'] : 45;
        }
 
-       function validate( $value, $alldata ) {
+       public function validate( $value, $alldata ) {
                # HTMLSelectField forces $value to be one of the options in the select
                # field, which is not useful here.  But we do want the validation further up
                # the chain
index 40b31b5..c1f8e42 100644 (file)
@@ -4,7 +4,7 @@
  * A select dropdown field.  Basically a wrapper for Xmlselect class
  */
 class HTMLSelectField extends HTMLFormField {
-       function validate( $value, $alldata ) {
+       public function validate( $value, $alldata ) {
                $p = parent::validate( $value, $alldata );
 
                if ( $p !== true ) {
@@ -20,7 +20,7 @@ class HTMLSelectField extends HTMLFormField {
                }
        }
 
-       function getInputHTML( $value ) {
+       public function getInputHTML( $value ) {
                $select = new XmlSelect( $this->mName, $this->mID, strval( $value ) );
 
                if ( !empty( $this->mParams['disabled'] ) ) {
@@ -42,7 +42,7 @@ class HTMLSelectField extends HTMLFormField {
                return $select->getHTML();
        }
 
-       function getInputOOUI( $value ) {
+       public function getInputOOUI( $value ) {
                $disabled = false;
                $allowedParams = [ 'tabindex' ];
                $attribs = OOUI\Element::configFromHtmlAttributes(
index e7f1c04..45191d0 100644 (file)
@@ -12,7 +12,7 @@ class HTMLSelectLimitField extends HTMLSelectField {
         * @param array $alldata
         * @return bool
         */
-       function validate( $value, $alldata ) {
+       public function validate( $value, $alldata ) {
                if ( $value == '' ) {
                        return true;
                }
index 230790d..f13aa17 100644 (file)
@@ -9,10 +9,9 @@ class HTMLSelectNamespace extends HTMLFormField {
                $this->mAllValue = array_key_exists( 'all', $params )
                        ? $params['all']
                        : 'all';
-
        }
 
-       function getInputHTML( $value ) {
+       public function getInputHTML( $value ) {
                return Html::namespaceSelector(
                        [
                                'selected' => $value,
index 8f7750c..bb41079 100644 (file)
@@ -7,7 +7,7 @@
  * and should be used instead.
  */
 class HTMLSelectOrOtherField extends HTMLTextField {
-       function __construct( $params ) {
+       public function __construct( $params ) {
                parent::__construct( $params );
                $this->getOptions();
                if ( !in_array( 'other', $this->mOptions, true ) ) {
@@ -18,10 +18,9 @@ class HTMLSelectOrOtherField extends HTMLTextField {
                        // Have 'other' always as first element
                        $this->mOptions = [ $msg => 'other' ] + $this->mOptions;
                }
-
        }
 
-       function getInputHTML( $value ) {
+       public function getInputHTML( $value ) {
                $valInSelect = false;
 
                if ( $value !== false ) {
@@ -65,7 +64,7 @@ class HTMLSelectOrOtherField extends HTMLTextField {
                return "$select<br />\n$textbox";
        }
 
-       function getInputOOUI( $value ) {
+       public function getInputOOUI( $value ) {
                return false;
        }
 
@@ -74,7 +73,7 @@ class HTMLSelectOrOtherField extends HTMLTextField {
         *
         * @return string
         */
-       function loadDataFromRequest( $request ) {
+       public function loadDataFromRequest( $request ) {
                if ( $request->getCheck( $this->mName ) ) {
                        $val = $request->getText( $this->mName );
 
diff --git a/includes/htmlform/fields/HTMLSizeFilterField.php b/includes/htmlform/fields/HTMLSizeFilterField.php
new file mode 100644 (file)
index 0000000..d94eb8d
--- /dev/null
@@ -0,0 +1,72 @@
+<?php
+
+/**
+ * A size filter field for use on query-type special pages. It looks a bit like:
+ *
+ *    (o) Min size  ( ) Max size:  [       ] bytes
+ *
+ * Minimum size limits are represented using a positive integer, while maximum
+ * size limits are represented using a negative integer.
+ */
+class HTMLSizeFilterField extends HTMLIntField {
+       public function getSize() {
+               return isset( $this->mParams['size'] ) ? $this->mParams['size'] : 9;
+       }
+
+       public function getInputHTML( $value ) {
+               $attribs = [];
+               if ( !empty( $this->mParams['disabled'] ) ) {
+                       $attribs['disabled'] = 'disabled';
+               }
+
+               $html = Xml::radioLabel(
+                       $this->msg( 'minimum-size' )->text(),
+                       $this->mName . '-mode',
+                       'min',
+                       $this->mID . '-mode-min',
+                       $value >= 0,
+                       $attribs
+               );
+               $html .= '&#160;' . Xml::radioLabel(
+                       $this->msg( 'maximum-size' )->text(),
+                       $this->mName . '-mode',
+                       'max',
+                       $this->mID . '-mode-max',
+                       $value < 0,
+                       $attribs
+               );
+               $html .= '&#160;' . parent::getInputHTML( $value ? abs( $value ) : '' );
+               $html .= '&#160;' . $this->msg( 'pagesize' )->parse();
+
+               return $html;
+       }
+
+       // No OOUI yet
+       public function getInputOOUI( $value ) {
+               return false;
+       }
+
+       /**
+        * @param WebRequest $request
+        *
+        * @return string
+        */
+       public function loadDataFromRequest( $request ) {
+               $size = $request->getInt( $this->mName );
+               if ( !$size ) {
+                       return $this->getDefault();
+               }
+               $size = abs( $size );
+
+               // negative numbers represent "max", positive numbers represent "min"
+               if ( $request->getVal( $this->mName . '-mode' ) === 'max' ) {
+                       return -$size;
+               } else {
+                       return $size;
+               }
+       }
+
+       protected function needsLabel() {
+               return false;
+       }
+}
index 8075de5..e24541c 100644 (file)
@@ -5,7 +5,7 @@
 class HTMLTagFilter extends HTMLFormField {
        protected $tagFilter;
 
-       function getTableRow( $value ) {
+       public function getTableRow( $value ) {
                $this->tagFilter = ChangeTags::buildTagFilterSelector( $value );
                if ( $this->tagFilter ) {
                        return parent::getTableRow( $value );
@@ -13,7 +13,7 @@ class HTMLTagFilter extends HTMLFormField {
                return '';
        }
 
-       function getDiv( $value ) {
+       public function getDiv( $value ) {
                $this->tagFilter = ChangeTags::buildTagFilterSelector( $value );
                if ( $this->tagFilter ) {
                        return parent::getDiv( $value );
@@ -21,7 +21,7 @@ class HTMLTagFilter extends HTMLFormField {
                return '';
        }
 
-       function getInputHTML( $value ) {
+       public function getInputHTML( $value ) {
                if ( $this->tagFilter ) {
                        // we only need the select field, HTMLForm should handle the label
                        return $this->tagFilter[1];
index 8ffff43..82ec3bf 100644 (file)
@@ -22,15 +22,15 @@ class HTMLTextAreaField extends HTMLFormField {
                }
        }
 
-       function getCols() {
+       public function getCols() {
                return isset( $this->mParams['cols'] ) ? $this->mParams['cols'] : static::DEFAULT_COLS;
        }
 
-       function getRows() {
+       public function getRows() {
                return isset( $this->mParams['rows'] ) ? $this->mParams['rows'] : static::DEFAULT_ROWS;
        }
 
-       function getSpellCheck() {
+       public function getSpellCheck() {
                $val = isset( $this->mParams['spellcheck'] ) ? $this->mParams['spellcheck'] : null;
                if ( is_bool( $val ) ) {
                        // "spellcheck" attribute literally requires "true" or "false" to work.
@@ -39,7 +39,7 @@ class HTMLTextAreaField extends HTMLFormField {
                return null;
        }
 
-       function getInputHTML( $value ) {
+       public function getInputHTML( $value ) {
                $attribs = [
                                'id' => $this->mID,
                                'cols' => $this->getCols(),
index 3ab7176..88f5ec5 100644 (file)
@@ -22,11 +22,11 @@ class HTMLTextField extends HTMLFormField {
                }
        }
 
-       function getSize() {
+       public function getSize() {
                return isset( $this->mParams['size'] ) ? $this->mParams['size'] : 45;
        }
 
-       function getSpellCheck() {
+       public function getSpellCheck() {
                $val = isset( $this->mParams['spellcheck'] ) ? $this->mParams['spellcheck'] : null;
                if ( is_bool( $val ) ) {
                        // "spellcheck" attribute literally requires "true" or "false" to work.
@@ -43,7 +43,7 @@ class HTMLTextField extends HTMLFormField {
                return !( isset( $this->mParams['type'] ) && $this->mParams['type'] === 'password' );
        }
 
-       function getInputHTML( $value ) {
+       public function getInputHTML( $value ) {
                if ( !$this->isPersistent() ) {
                        $value = '';
                }
@@ -119,7 +119,7 @@ class HTMLTextField extends HTMLFormField {
                return $type;
        }
 
-       function getInputOOUI( $value ) {
+       public function getInputOOUI( $value ) {
                if ( !$this->isPersistent() ) {
                        $value = '';
                }
index 458854a..08883ae 100644 (file)
@@ -362,7 +362,6 @@ class MWHttpRequest implements LoggerAwareInterface {
         * @return Status
         */
        public function execute() {
-
                $this->content = "";
 
                if ( strtoupper( $this->method ) == "HEAD" ) {
@@ -378,7 +377,6 @@ class MWHttpRequest implements LoggerAwareInterface {
                if ( !isset( $this->reqHeaders['User-Agent'] ) ) {
                        $this->setUserAgent( Http::userAgent() );
                }
-
        }
 
        /**
@@ -387,7 +385,6 @@ class MWHttpRequest implements LoggerAwareInterface {
         * found in an array in the member variable headerList.
         */
        protected function parseHeader() {
-
                $lastname = "";
 
                foreach ( $this->headerList as $header ) {
@@ -404,7 +401,6 @@ class MWHttpRequest implements LoggerAwareInterface {
                }
 
                $this->parseCookies();
-
        }
 
        /**
@@ -538,7 +534,6 @@ class MWHttpRequest implements LoggerAwareInterface {
         * Parse the cookies in the response headers and store them in the cookie jar.
         */
        protected function parseCookies() {
-
                if ( !$this->cookieJar ) {
                        $this->cookieJar = new CookieJar;
                }
@@ -549,7 +544,6 @@ class MWHttpRequest implements LoggerAwareInterface {
                                $this->cookieJar->parseCookieResponseHeader( $cookie, $url['host'] );
                        }
                }
-
        }
 
        /**
index 331d1a1..50d73de 100644 (file)
@@ -336,7 +336,6 @@ abstract class DatabaseInstaller {
                $services->redefineService( 'DBLoadBalancerFactory', function() use ( $connection ) {
                        return LBFactorySingle::newFromConnection( $connection );
                } );
-
        }
 
        /**
index c5ec72b..5e8ed3f 100644 (file)
@@ -282,7 +282,7 @@ class MssqlInstaller extends DatabaseInstaller {
                // Check to ensure we can grant everything needed as well
                // We can't actually tell if we have WITH GRANT OPTION for a given permission, so we assume we do
                // and just check for the permission
-               // http://technet.microsoft.com/en-us/library/ms178569.aspx
+               // https://technet.microsoft.com/en-us/library/ms178569.aspx
                // The following array sets up which permissions imply whatever permissions we specify
                $implied = [
                        // schema           database  server
index 01327be..d412216 100644 (file)
@@ -24,7 +24,7 @@
 /**
  * Test for PHP+libxml2 bug which breaks XML input subtly with certain versions.
  * Known fixed with PHP 5.2.9 + libxml2-2.7.3
- * @see http://bugs.php.net/bug.php?id=45996
+ * @see https://bugs.php.net/bug.php?id=45996
  * @ingroup PHPBugTests
  */
 class PhpXmlBugTester {
index f3d2860..790fbe7 100644 (file)
@@ -975,7 +975,7 @@ END;
        protected function rebuildTextSearch() {
                if ( $this->updateRowExists( 'patch-textsearch_bug66650.sql' ) ) {
                        $this->output( "...bug 66650 already fixed or not applicable.\n" );
-                       return true;
+                       return;
                };
                $this->applyPatch( 'patch-textsearch_bug66650.sql', false,
                        'Rebuilding text search for bug 66650' );
index 239ad7e..b32f4b1 100644 (file)
@@ -8,7 +8,8 @@
                        "Claw eg",
                        "Kuwaity26",
                        "محمد أحمد عبد الفتاح",
-                       "Maroen1990"
+                       "Maroen1990",
+                       "Super ninja2"
                ]
        },
        "config-desc": "مثبت لميدياويكي",
@@ -47,6 +48,8 @@
        "config-page-existingwiki": "ويكي موجودة",
        "config-help-restart": "هل تريد إزالة البيانات المحفوظة التي قد قمت بإدخالها وإعادة تشغيل عملية التثبيت؟",
        "config-restart": "نعم، إعادة التشغيل",
+       "config-welcome": "سوف يتم الآن التحقق من أن البيئة مناسبة لتنصيب ميديا ويكي.\nتذكر تضمين هذه المعلومات اذا اردت طلب المساعدة عن كيفية إكمال التنصيب.",
+       "config-copyright": "$1\nهذا البرنامج هو برنامج حر؛ يمكنك إعادة توزيعه و/أو تعديله تحت شروط رخصة جنو العامة على أن هذا البرنامج قد نُشر من قِبل مؤسسة البرمجيات الحرة؛ إما النسخة 2 من الرخصة، أو أي نسخة أخرى بعدها (من إختيارك)\n\nتم توزيع هذا البرنامج على أمل ان يكون مفيدًا ولكن <strong> دون أية ضمانات</strong>؛ دون حتى أية ضمانات مفهومة ضمنيًا أو رواجات أو أية أسباب محددة.\nأنظر رخصة جنو العامة لمزيد من المعلومات.\n\nمن المفترض أنك إستملت <doclink href=Copying> نسخة عن رخصة جنو العامة </doclink> مع هذا البرنامج؛ اذا لم تقعل إكتب رسالة إلى مؤسسة البرمجيات الحرة المحدودة، شارع 51 فرانكلين الطابق الخامس، بوسطن  MA 02110-1301 الولايات المتخدة أو [http://www.gnu.org/copyleft/gpl.html read it online].",
        "config-env-good": "جرى التحقق من البيئة. يمكنك تنصيب ميدياويكي.",
        "config-env-bad": "جرى التحقق من البيئة. لا يمكنك تنصيب ميدياويكي.",
        "config-env-php": "بي إتش بي $1 مثبت.",
index eb84cc6..b11734f 100644 (file)
        "config-type-mssql": "Microsoft SQL Server",
        "config-support-info": "MediaWiki падтрымлівае наступныя сыстэмы базаў зьвестак:\n\n$1\n\nКалі Вы ня бачыце сыстэму базаў зьвестак, якую Вы спрабуеце выкарыстоўваць ў сьпісе ніжэй, перайдзіце па спасылцы інструкцыі, якая знаходзіцца ніжэй, каб уключыць падтрымку.",
        "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL] зьяўляецца галоўнай мэтай MediaWiki і падтрымліваецца лепей за ўсё. MediaWiki таксама працуе з [{{int:version-db-mariadb-url}} MariaDB] і [{{int:version-db-percona-url}} Percona Server], якія сумяшчальныя з MySQL. ([http://www.php.net/manual/en/mysqli.installation.php Як скампіляваць PHP з падтрымкай MySQL])",
-       "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] — папулярная сыстэма базы зьвестак з адкрытым кодам, якая зьяўляецца альтэрнатывай MySQL. Яна можа ўтрымліваць дробныя памылкі, і не рэкамэндуецца выкарыстоўваць яе для працуючых праектаў. ([http://www.php.net/manual/en/pgsql.installation.php Як кампіляваць PHP з падтрымкай PostgreSQL])",
+       "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] — папулярная сыстэма базы зьвестак з адкрытым кодам, якая зьяўляецца альтэрнатывай MySQL. ([http://www.php.net/manual/en/pgsql.installation.php Як кампіляваць PHP з падтрымкай PostgreSQL])",
        "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite] — невялікая сыстэма базы зьвестак, якая мае вельмі добрую падтрымку. ([http://www.php.net/manual/en/pdo.installation.php Як кампіляваць PHP з падтрымкай SQLite], выкарыстоўвае PDO)",
        "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] зьяўляецца камэрцыйнай прафэсійнай базай зьвестак. ([http://www.php.net/manual/en/oci8.installation.php Як скампіляваць PHP з падтрымкай OCI8])",
        "config-dbsupport-mssql": "* [{{int:version-db-mssql-url}} Microsoft SQL Server] — камэрцыйная база зьвестак для Windows. ([http://www.php.net/manual/en/sqlsrv.installation.php Як скампіляваць PHP з падтрымкай SQLSRV])",
index d52f8f1..f28e2c5 100644 (file)
        "config-help": "সাহায্য",
        "config-help-tooltip": "প্রসারিত করতে ক্লিক করুন",
        "mainpagetext": "<strong>মিডিয়াউইকি ইনস্টল করা হয়েছে।</strong>",
-       "mainpagedocfooter": "কীভাবে উইকি সফটওয়্যারটি ব্যবহারকার করবেন, তা জানতে [https://meta.wikimedia.org/wiki/Help:Contents ব্যবহারকারী সহায়িকা] দেখুন।\n\n== কোথা থেকে শুরু করবেন ==\n\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings কনফিগারেশন সেটিংস তালিকা]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ প্রশ্নোত্তরে মিডিয়াউইকি]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce মিডিয়াউইকি মুক্তির মেইলিং লিস্ট]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources আপনার ভাষার জন্য মিডিয়াউইকি স্থানীয়করণ করুন]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam আপনার উইকিতে স্প্যামের সাথে লড়াই করার উপায় সম্পর্কে জানুন]"
+       "mainpagedocfooter": "কীভাবে উইকি সফটওয়্যারটি ব্যবহারকার করবেন, তা জানতে [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents ব্যবহারকারী সহায়িকা] দেখুন।\n\n== কোথা থেকে শুরু করবেন ==\n\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings কনফিগারেশন সেটিংস তালিকা]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ প্রশ্নোত্তরে মিডিয়াউইকি]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce মিডিয়াউইকি মুক্তির মেইলিং লিস্ট]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources আপনার ভাষার জন্য মিডিয়াউইকি স্থানীয়করণ করুন]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam আপনার উইকিতে স্প্যামের সাথে লড়াই করার উপায় সম্পর্কে জানুন]"
 }
index 06e54e1..2fee258 100644 (file)
        "config-nofile": "Soubor „$1“ nelze nalézt. Byl smazán?",
        "config-extension-link": "Věděli jste, že vaše wiki podporuje [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions rozšíření]?\n\nMůžete si prohlédnout [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category seznam rozšíření po kategoriích].",
        "mainpagetext": "<strong>MediaWiki byla úspěšně nainstalována.</strong>",
-       "mainpagedocfooter": "[https://meta.wikimedia.org/wiki/Help:Contents Uživatelská příručka] vám napoví, jak používat MediaWiki.\n\n== Začínáme ==\n\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Nastavení konfigurace]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Často kladené otázky o MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce E-mailová konference oznámení MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Překlad MediaWiki do vašeho jazyka]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Naučte se bojovat se spamem na vaší wiki]"
+       "mainpagedocfooter": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Uživatelská příručka] vám napoví, jak používat MediaWiki.\n\n== Začínáme ==\n\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Nastavení konfigurace]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Často kladené otázky o MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce E-mailová konference oznámení MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Překlad MediaWiki do vašeho jazyka]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Naučte se bojovat se spamem na vaší wiki]"
 }
index 3fe893a..c7690e2 100644 (file)
        "config-nofile": "Die Datei „$1“ konnte nicht gefunden werden. Wurde sie gelöscht?",
        "config-extension-link": "Wusstest du, dass dein Wiki die Nutzung von [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions Erweiterungen] unterstützt?\n\nDu kannst die [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category Erweiterungen nach Kategorie] anzeigen oder die [https://www.mediawiki.org/wiki/Extension_Matrix Erweiterungs-Matrix] aufrufen, um eine vollständige Liste der Erweiterungen zu sehen.",
        "mainpagetext": "<strong>MediaWiki wurde installiert.</strong>",
-       "mainpagedocfooter": "Hilfe zur Benutzung und Konfiguration der Wiki-Software findest du im [https://meta.wikimedia.org/wiki/Help:Contents Benutzerhandbuch].\n\n== Starthilfen ==\n\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Liste der Konfigurationsvariablen]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki-FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailingliste neuer MediaWiki-Versionen]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Übersetze MediaWiki für deine Sprache]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Erfahre, wie du Spam auf deinem Wiki bekämpfen kannst]"
+       "mainpagedocfooter": "Hilfe zur Benutzung und Konfiguration der Wiki-Software findest du im [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Benutzerhandbuch].\n\n== Starthilfen ==\n\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Liste der Konfigurationsvariablen]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki-FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailingliste neuer MediaWiki-Versionen]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Übersetze MediaWiki für deine Sprache]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Erfahre, wie du Spam auf deinem Wiki bekämpfen kannst]"
 }
index 1f7333a..b25ff2c 100644 (file)
        "config-nofile": "File \"$1\" could not be found. Has it been deleted?",
        "config-extension-link": "Did you know that your wiki supports [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions extensions]?\n\nYou can browse [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category extensions by category] or the [https://www.mediawiki.org/wiki/Extension_Matrix Extension Matrix] to see the full list of extensions.",
        "mainpagetext": "<strong>MediaWiki has been installed.</strong>",
-       "mainpagedocfooter": "Consult the [https://meta.wikimedia.org/wiki/Help:Contents User's Guide] for information on using the wiki software.\n\n== Getting started ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Configuration settings list]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localise MediaWiki for your language]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Learn how to combat spam on your wiki]"
+       "mainpagedocfooter": "Consult the [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents] for information on using the wiki software.\n\n== Getting started ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Configuration settings list]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localise MediaWiki for your language]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Learn how to combat spam on your wiki]"
 }
index dfcf1d3..46e8d90 100644 (file)
@@ -79,5 +79,5 @@
        "config-install-tables": "Tabelite loomine",
        "config-help": "abi",
        "mainpagetext": "<strong>MediaWiki tarkvara on paigaldatud.</strong>",
-       "mainpagedocfooter": "Vikitarkvara kasutamise kohta leiad lisateavet [https://meta.wikimedia.org/wiki/Help:Contents juhendist].\n\n== Alustamine ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Häälestussätete loend]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki KKK]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki versiooniuuenduste postiloend]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources MediaWiki lokaliseerimine]"
+       "mainpagedocfooter": "Vikitarkvara kasutamise kohta leiad lisateavet [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents siit].\n\n== Alustamine ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Häälestussätete loend]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki KKK]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki versiooniuuenduste postiloend]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources MediaWiki lokaliseerimine]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Loe, kuidas vikis rämpspostitusi tõrjuda]"
 }
index f7d8d07..a2466c3 100644 (file)
        "config-nofile": "Non se puido atopar o ficheiro \"$1\". Se cadra, foi borrado.",
        "config-extension-link": "Sabía que o seu wiki soporta [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions extensións]?\n\nPode explorar as [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category extensións por categoría] ou a [https://www.mediawiki.org/wiki/Extension_Matrix matriz de extensións] para ollar a lista completa de extensións.",
        "mainpagetext": "<strong>Instalouse MediaWiki.</strong>",
-       "mainpagedocfooter": "Consulte a [https://meta.wikimedia.org/wiki/Help:Contents guía de usuario] para obter máis información sobre como usar o software wiki.\n\n== Primeiros pasos ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista das opcións de configuración]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Preguntas máis frecuentes sobre MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de correo dos lanzamentos de MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localice MediaWiki á súa lingua]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Aprenda como combater a publicidade na súa wiki]"
+       "mainpagedocfooter": "Consulte a [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents guía de usuario] para obter máis información sobre como usar o software wiki.\n\n== Primeiros pasos ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista das opcións de configuración]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Preguntas máis frecuentes sobre MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de correo dos lanzamentos de MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localice MediaWiki á súa lingua]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Aprenda como combater a publicidade na súa wiki]"
 }
index 8d4f8be..cedccd1 100644 (file)
        "config-nofile": "Il file \"$1\" non può essere trovato. È stato eliminato?",
        "config-extension-link": "Sapevi che il tuo wiki supporta le  [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions estensioni]?\n\nPuoi navigare tra le [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category estensioni per categoria].",
        "mainpagetext": "<strong>MediaWiki è stato installato.</strong>",
-       "mainpagedocfooter": "Consulta la [https://meta.wikimedia.org/wiki/Special:MyLanguage/Help:Contents Guida utente] per maggiori informazioni sull'uso di questo software wiki.\n\n== Per iniziare ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Impostazioni di configurazione]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Domande frequenti su MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailing list annunci MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Trova MediaWiki nella tua lingua]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Imparare a combattere lo spam sul tuo wiki]"
+       "mainpagedocfooter": "Consulta la [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents guida utente] per maggiori informazioni sull'uso di questo software wiki.\n\n== Per iniziare ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Impostazioni di configurazione]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Domande frequenti su MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailing list annunci MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Trova MediaWiki nella tua lingua]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Imparare a combattere lo spam sul tuo wiki]"
 }
index 5406be1..e9e22a9 100644 (file)
@@ -18,7 +18,8 @@
                        "Macofe",
                        "2nd-player",
                        "Otokoume",
-                       "Rxy"
+                       "Rxy",
+                       "Foresttttttt"
                ]
        },
        "config-desc": "MediaWiki のインストーラー",
@@ -76,6 +77,7 @@
        "config-memory-bad": "<strong>警告:</strong> PHPの<code>memory_limit</code>に$1に設定されています。\nこの値はおそらく小さすぎます。\nインストールが失敗するおそれがあります!",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] がインストール済み",
        "config-apc": "[http://www.php.net/apc APC] がインストール済み",
+       "config-apcu": "[http://www.php.net/apc APC] がインストール済みです。",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] がインストール済み",
        "config-no-cache-apcu": "<strong>警告:</strong> [http://www.php.net/apcu APCu]、 [http://xcache.lighttpd.net/ XCache]、 [http://www.iis.net/download/WinCacheForPhp WinCache] のいずれも見つかりませんでした。\nオブジェクトのキャッシュは有効化されません。",
        "config-mod-security": "<strong>警告:</strong> あなたのウェブサーバーでは [http://modsecurity.org/ mod_security] が有効になっています。正しく構成されていない場合は、MediaWiki や利用者にコンテンツの投稿を許可するその他のソフトウェアに問題が発生する場合があります。\n[http://modsecurity.org/documentation/ mod_security の説明文書]を確認するか、ランダムなエラーが発生した場合はあなたのホストのサポートにお問い合わせください。",
        "config-type-mssql": "マイクロソフト SQL Server",
        "config-support-info": "MediaWiki は以下のデータベース システムに対応しています:\n\n$1\n\n使用しようとしているデータベース システムが下記の一覧にない場合は、上記リンク先の手順に従ってインストールしてください。",
        "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL]はMediaWikiの主要な対象であり、最もよくサポートされています。MediaWikiはMySQLと互換性のある[{{int:version-db-mariadb-url}} MariaDB]、[{{int:version-db-percona-url}} Percona Server]でも動きます。 ([http://www.php.net/manual/ja/mysqli.installation.php PHPをMySQLサポート付きでコンパイルする方法])",
-       "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] は、MySQLの代替として人気があるオープンソースのデータベースシステムです。細部の未解消バグがある場合があるため、プロダクション環境での使用は推奨されません。 ([http://www.php.net/manual/en/pgsql.installation.php PHPをPostgreSQLサポート付きでコンパイルする方法])",
+       "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] は、MySQLの代替として人気がある公開のデータベースシステムです。([http://www.php.net/manual/en/pgsql.installation.php PHPをPostgreSQLサポート付きでコンパイルする方法])",
        "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite]は、良くサポートされている、軽量データベースシステムです。([http://www.php.net/manual/ja/pdo.installation.php SQLiteに対応したPHPをコンパイルする方法]、PDOを使用)",
        "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle]は商業企業のデータベースです。([http://www.php.net/manual/en/oci8.installation.php OCI8サポートなPHPをコンパイルする方法])",
        "config-dbsupport-mssql": "* [{{int:version-db-mssql-url}} Microsoft SQL Server]は商業企業のWindows用データベースです。([http://www.php.net/manual/en/sqlsrv.installation.php SQLSRVサポートなPHPをコンパイルする方法])",
        "config-subscribe": "[https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce リリース告知のメーリングリスト]を購読する。",
        "config-subscribe-help": "これは、リリースの告知 (重要なセキュリティに関する案内を含む) に使用される、流量が少ないメーリングリストです。\nこのメーリングリストを購読して、新しいバージョンが出た場合にMediaWikiを更新してください。",
        "config-subscribe-noemail": "メールアドレスなしでリリースアナウンスのメーリングリストを購読しようとしています。\nメーリングリストを購読する場合にはメールアドレスを入力してください。",
+       "config-pingback": "このインストーレーションに関するデータをメデイアウィキの開発者にシェアしてください。",
+       "config-pingback-help": "もし君がこのオプションを選択したら、メデイアウィキは定期的にhttps://www.mediawiki.orgとメデイアウィキのインスタンスに関する基本的のデータをピンします。このデータはシステムのタイプ、PHPのバージョンと選択されたデータベースのバックエンドなどを含んでいます。メデイアウィキファンデーションは将来の",
        "config-almost-done": "これでほぼ終わりました!\n残りの設定を飛ばして、ウィキを今すぐインストールできます。",
        "config-optional-continue": "私にもっと質問してください。",
        "config-optional-skip": "もう飽きてしまったので、とにかくウィキをインストールしてください。",
index b23288c..d1b1a9b 100644 (file)
        "config-help-tooltip": "klickt fir opzeklappen",
        "config-nofile": "De Fichier \"$1\" gouf net fonnt. Gouf e geläscht?",
        "mainpagetext": "<strong>MediaWiki gouf installéiert.</strong>",
-       "mainpagedocfooter": "Kuckt w.e.g. [https://meta.wikimedia.org/wiki/Help:Contents d'Benotzerhandbuch] fir Informatiounen iwwer de Gebruach vun der Wiki Software.\n\n== Fir  unzefänken ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Hëllef bei der Konfiguratioun]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki-FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailinglëscht vun neie MediaWiki-Versiounen]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Lokaliséiert MediaWiki fir Är Sprooch]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Léiert wéi Spam op Ärer Wiki reduzéiert gi kann]"
+       "mainpagedocfooter": "Kuckt w.e.g. [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents d'Benotzerhandbuch] fir Informatiounen iwwer de Gebruach vun der Wiki Software.\n\n== Fir  unzefänken ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Hëllef bei der Konfiguratioun]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki-FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailinglëscht vun neie MediaWiki-Versiounen]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Lokaliséiert MediaWiki fir Är Sprooch]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Léiert wéi Spam op Ärer Wiki reduzéiert gi kann]"
 }
index 3660b82..8e7d8c1 100644 (file)
@@ -54,6 +54,7 @@
        "config-memory-raised": "PHP <code>memory_limit</code> yra $1, padidintas iki $2.",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] yra įdiegtas",
        "config-apc": "[http://www.php.net/apc APC] yra įdiegtas",
+       "config-apcu": "[http://www.php.net/apcu APCu] yra įdiegtas",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] yra įdiegtas",
        "config-no-cache-apcu": "<strong>Įspėjimas:</strong> Nepavyko rasti [http://www.php.net/apcu APCu], [http://xcache.lighttpd.net/ XCache] or [http://www.iis.net/download/WinCacheForPhp WinCache].\nObjekto spartinimas neįjungtas.",
        "config-diff3-bad": "GNU diff3 nerastas.",
@@ -93,6 +94,7 @@
        "config-postgres-old": "PostgreSQL $1 ar vėlesnė yra reikalinga. Jūs turite $2.",
        "config-sqlite-cant-create-db": "Nepavyko sukurti duomenų bazės failo <code>$1</code>.",
        "config-regenerate": "Pergeneruoti LocalSettings.php →",
+       "config-db-web-account": "Duomenų bazės paskyra dėl internetinės prieigos",
        "config-db-web-account-same": "Naudoti tą pačią paskyrą kaip ir įdiegimui",
        "config-db-web-create": "Sukurti paskyrą, jeigu jos nėra",
        "config-mysql-engine": "Saugojimo variklis:",
index 52b4ca5..f224b5d 100644 (file)
        "config-nofile": "Nie udało się odnaleźć pliku \"$1\". Czy nie został usunięty?",
        "config-extension-link": "Czy wiesz, że twoja wiki obsługuje [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions rozszerzenia]?\n\nMożesz przejrzeć [https://www.mediawiki.org/wiki/Category:Extensions_by_category rozszerzenia według kategorii] lub [https://www.mediawiki.org/wiki/Extension_Matrix Extension Matrix], aby zobaczyć pełną listę rozszerzeń.",
        "mainpagetext": "<strong>Instalacja MediaWiki powiodła się.</strong>",
-       "mainpagedocfooter": "Zobacz [https://meta.wikimedia.org/wiki/Help:Contents/pl przewodnik użytkownika], aby uzyskać informacje o działaniu oprogramowania wiki.\n\n== Na początek ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista ustawień konfiguracyjnych]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Komunikaty o nowych wersjach MediaWiki (lista dyskusyjna)]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Przetłumacz MediaWiki na swój język]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Dowiedz się, jak walczyć ze spamem na swojej wiki]"
+       "mainpagedocfooter": "Zapoznaj się z [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents informacjami o działaniu oprogramowania wiki].\n\n== Na początek ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista ustawień konfiguracyjnych]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Komunikaty o nowych wersjach MediaWiki (lista dyskusyjna)]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Przetłumacz MediaWiki na swój język]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Dowiedz się, jak walczyć ze spamem na swojej wiki]"
 }
index 30fb5f7..0fca08d 100644 (file)
        "config-session-error": "Erro ao iniciar a sessão: $1",
        "config-session-expired": "Os seus dados de sessão parecem ter expirado.\nAs sessões estão configuradas para uma duração de $1.\nPode aumentar esta duração configurando <code>session.gc_maxlifetime</code> no php.ini.\nReinicie o processo de instalação.",
        "config-no-session": "Os seus dados de sessão foram perdidos!\nVerifique o seu php.ini e certifique-se de que em <code>session.save_path</code> está definido um diretório apropriado.",
-       "config-your-language": "O seu idioma:",
+       "config-your-language": "A sua língua:",
        "config-your-language-help": "Selecione o idioma que será usado durante o processo de instalação.",
-       "config-wiki-language": "Idioma da wiki:",
+       "config-wiki-language": "Língua da wiki:",
        "config-wiki-language-help": "Selecione o idioma que será predominante na wiki.",
        "config-back": "← Voltar",
        "config-continue": "Continuar →",
-       "config-page-language": "Idioma",
+       "config-page-language": "Língua",
        "config-page-welcome": "Bem-vindo(a) ao MediaWiki!",
        "config-page-dbconnect": "Ligar à base de dados",
        "config-page-upgrade": "Atualizar a instalação existente",
@@ -55,7 +55,7 @@
        "config-page-existingwiki": "Wiki existente",
        "config-help-restart": "Deseja limpar todos os dados gravados que introduziu e reiniciar o processo de instalação?",
        "config-restart": "Sim, reiniciar",
-       "config-welcome": "=== Verificações do ambiente ===\nSão realizadas verificações básicas para determinar se este ambiente é apropriado para instalação do MediaWiki.\nSe necessitar de pedir ajuda durante a instalação, deve fornecer os resultados destas verificações.",
+       "config-welcome": "=== Verificações do ambiente ===\nSerão agora realizadas verificações básicas para determinar se este ambiente é apropriado para instalação do MediaWiki.\nLembre-se de fornecer esta informação se necessitar de pedir ajuda para concluir a instalação.",
        "config-copyright": "=== Direitos de autor e Condições de uso ===\n\n$1\n\nEste programa é software livre; pode redistribuí-lo e/ou modificá-lo nos termos da licença GNU General Public License, tal como publicada pela Free Software Foundation; tanto a versão 2 da Licença, como (por opção sua) qualquer versão posterior.\n\nEste programa é distribuído na esperança de que seja útil, mas '''sem qualquer garantia'''; inclusive, sem a garantia implícita da '''possibilidade de ser comercializado''' ou de '''adequação para qualquer finalidade específica'''.\nConsulte a licença GNU General Public License para mais detalhes.\n\nEm conjunto com este programa deve ter recebido <doclink href=Copying>uma cópia da licença GNU General Public License</doclink>; se não a recebeu, peça-a por escrito a Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA ou [http://www.gnu.org/copyleft/gpl.html leia-a na internet].",
        "config-sidebar": "* [https://www.mediawiki.org/wiki/MediaWiki/pt Página principal do MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents/pt Ajuda]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents/pt Manual técnico]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ FAQ]\n----\n* <doclink href=Readme>Leia-me</doclink>\n* <doclink href=ReleaseNotes>Notas de lançamento</doclink>\n* <doclink href=Copying>Cópia</doclink>\n* <doclink href=UpgradeDoc>Atualização</doclink>",
        "config-env-good": "O ambiente foi verificado.\nPode instalar o MediaWiki.",
        "config-db-account-oracle-warn": "Há três cenários suportados na instalação do servidor de base de dados Oracle:\n\nSe pretende criar a conta de acesso pela internet na base de dados durante o processo de instalação, forneça como conta para a instalação uma conta com o papel de SYSDBA na base de dados e especifique as credenciais desejadas para a conta de acesso pela internet. Se não pretende criar a conta de acesso pela internet durante a instalação, pode criá-la manualmente e fornecer só essa conta para a instalação (se ela tiver as permissões necessárias para criar os objetos do esquema ''(schema)''). A terceira alternativa é fornecer duas contas diferentes; uma com privilégios de criação e outra com privilégios limitados para o acesso pela internet.\n\nExiste um script para criação de uma conta com os privilégios necessários no diretório \"maintenance/oracle/\" desta instalação. Mantenha em mente que usar uma conta com privilégios limitados impossibilita todas as operações de manutenção com a conta padrão.",
        "config-db-install-account": "Conta do utilizador para a instalação",
        "config-db-username": "Nome do utilizador da base de dados:",
-       "config-db-password": "Palavra-chave do utilizador da base de dados:",
+       "config-db-password": "Palavra-passe do utilizador da base de dados:",
        "config-db-install-username": "Introduza o nome de utilizador que será usado para aceder à base de dados durante o processo de instalação. Este utilizador não é o do MediaWiki; é o utilizador da base de dados.",
-       "config-db-install-password": "Introduza a palavra-chave do utilizador que será usado para aceder à base de dados durante o processo de instalação. Esta palavra-chave não é a do utilizador do MediaWiki; é a palavra-chave do utilizador da base de dados.",
-       "config-db-install-help": "Introduza o nome de utilizador e a palavra-chave que serão usados para aceder à base de dados durante o processo de instalação.",
-       "config-db-account-lock": "Usar o mesmo nome de utilizador e palavra-chave durante a operação normal",
+       "config-db-install-password": "Introduza a palavra-passe do utilizador que será usado para aceder à base de dados durante o processo de instalação.\nEsta palavra-passe não é a do utilizador do MediaWiki; é a palavra-passe do utilizador da base de dados.",
+       "config-db-install-help": "Introduza o nome de utilizador e a palavra-passe que serão usados para aceder à base de dados durante o processo de instalação.",
+       "config-db-account-lock": "Usar o mesmo nome de utilizador e palavra-passe durante a operação normal",
        "config-db-wiki-account": "Conta de utilizador para a operação normal",
-       "config-db-wiki-help": "Introduza o nome de utilizador e a palavra-chave que serão usados para aceder à base de dados durante a operação normal da wiki.\nSe o utilizador não existir na base de dados, mas a conta de instalação tiver privilégios suficientes, o utilizador que introduzir será criado na base de dados com os privilégios mínimos necessários para a operação normal da wiki.",
+       "config-db-wiki-help": "Introduza o nome de utilizador e a palavra-passe que serão usados para aceder à base de dados durante a operação normal da wiki.\nSe o utilizador não existir na base de dados, mas a conta de instalação tiver privilégios suficientes, o utilizador que introduzir será criado na base de dados com os privilégios mínimos necessários para a operação normal da wiki.",
        "config-db-prefix": "Prefixo para as tabelas da base de dados:",
        "config-db-prefix-help": "Se necessitar de partilhar uma só base de dados entre várias wikis, ou entre o MediaWiki e outra aplicação, pode escolher adicionar um prefixo ao nome de todas as tabelas desta instalação, para evitar conflitos.\nNão use espaços.\n\nNormalmente, este campo deve ficar vazio.",
        "config-mysql-old": "É necessário o MySQL $1 ou posterior; tem a versão $2.",
        "config-db-schema-help": "Normalmente, este esquema estará correto.\nAltere-o só se souber que precisa de o fazer.",
        "config-pg-test-error": "Não foi possível criar uma ligação à base de dados '''$1''': $2",
        "config-sqlite-dir": "Diretório de dados do SQLite:",
-       "config-sqlite-dir-help": "O SQLite armazena todos os dados num único ficheiro.\n\nDurante a instalação, o servidor de internet precisa de ter permissão de escrita no diretório que especificar.\n\nEste diretório '''não''' deve poder ser acedido diretamente da internet, por isso está a ser colocado onde estão os seus ficheiros PHP.\n\nJuntamente com o diretório, o instalador irá criar um ficheiro <code>.htaccess</code>, mas se esta operação falhar é possível que alguém venha a ter acesso direto à base de dados.\nIsto inclui acesso aos dados dos utilizadores (endereços de correio eletrónico, palavras-chave encriptadas), às revisões eliminadas e a outros dados de acesso restrito na wiki.\n\nConsidere colocar a base de dados num local completamente diferente, como, por exemplo, em <code>/var/lib/mediawiki/asuawiki</code>.",
+       "config-sqlite-dir-help": "O SQLite armazena todos os dados num único ficheiro.\n\nDurante a instalação, o servidor de Internet precisa de ter permissão de escrita no diretório que especificar.\n\nEste diretório '''não''' deve poder ser acedido diretamente da Internet, por isso está a ser colocado onde estão os seus ficheiros PHP.\n\nJuntamente com o diretório, o instalador irá criar um ficheiro <code>.htaccess</code>, mas se esta operação falhar é possível que alguém venha a ter acesso direto à base de dados.\nIsto inclui acesso aos dados dos utilizadores (endereços de correio eletrónico, palavras-passe encriptadas), às revisões eliminadas e a outros dados de acesso restrito na wiki.\n\nConsidere colocar a base de dados num local completamente diferente, como, por exemplo, em <code>/var/lib/mediawiki/asuawiki</code>.",
        "config-oracle-def-ts": "Tablespace padrão:",
        "config-oracle-temp-ts": "Tablespace temporário:",
        "config-type-mysql": "MySQL (ou compatível)",
        "config-invalid-db-server-oracle": "O TNS da base de dados, \"$1\", é inválido.\nUse \"TNS Name\" ou o método \"Easy Connect\" ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Métodos de Configuração da Conectividade em Oracle])",
        "config-invalid-db-name": "O nome da base de dados, \"$1\",  é inválido.\nUse só letras (a-z, A-Z), algarismos (0-9), sublinhados (_) e hífens (-) dos caracteres ASCII.",
        "config-invalid-db-prefix": "O prefixo da base de dados, \"$1\",  é inválido.\nUse só letras (a-z, A-Z), algarismos (0-9), sublinhados (_) e hífens (-) dos caracteres ASCII.",
-       "config-connection-error": "$1.\n\nVerifique o servidor, o nome do utilizador e a palavra-chave abaixo e tente novamente.",
+       "config-connection-error": "$1.\n\nVerifique o servidor, o nome do utilizador e a palavra-passe e tente novamente.",
        "config-invalid-schema": "O esquema ''(schema)'' do MediaWiki, \"$1\", é inválido.\nUse só letras (a-z, A-Z), algarismos (0-9) e sublinhados (_) dos caracteres ASCII.",
        "config-db-sys-create-oracle": "O instalador só permite criar uma conta nova usando uma conta SYSDBA.",
        "config-db-sys-user-exists-oracle": "A conta \"$1\" já existe. A conta SYSDBA só pode criar uma conta nova!",
        "config-show-table-status": "A consulta <code>SHOW TABLE STATUS</code> falhou!",
        "config-unknown-collation": "'''Aviso:''' A base de dados está a utilizar uma colação ''(collation)'' desconhecida.",
        "config-db-web-account": "Conta na base de dados para acesso pela internet",
-       "config-db-web-help": "Selecione o nome de utilizador e a palavra-chave que o servidor de internet irá utilizar para aceder ao servidor da base de dados, durante a operação normal da wiki.",
+       "config-db-web-help": "Selecione o nome de utilizador e a palavra-passe que o servidor de Internet irá utilizar para aceder ao servidor da base de dados, durante a operação normal da wiki.",
        "config-db-web-account-same": "Usar a mesma conta usada na instalação",
        "config-db-web-create": "Criar a conta se ainda não existir",
        "config-db-web-no-create-privs": "A conta que especificou para a instalação não tem privilégios suficientes para criar uma conta.\nA conta que especificar aqui já tem de existir.",
        "config-ns-conflict": "O espaço nominal que especificou, \"<nowiki>$1</nowiki>\", cria um conflito com um dos espaços nominais padrão do MediaWiki.\nEspecifique um espaço nominal do projeto diferente.",
        "config-admin-box": "Conta de administrador",
        "config-admin-name": "Seu nome de utilizador:",
-       "config-admin-password": "Palavra-chave:",
-       "config-admin-password-confirm": "Repita a palavra-chave:",
+       "config-admin-password": "Palavra-passe:",
+       "config-admin-password-confirm": "Repita a palavra-passe:",
        "config-admin-help": "Introduza aqui o seu nome de utilizador preferido, por exemplo, \"João Beltrão\".\nEste é o nome que irá utilizar para entrar na wiki.",
        "config-admin-name-blank": "Introduza um nome de utilizador para administrador.",
        "config-admin-name-invalid": "O nome de utilizador especificado \"<nowiki>$1</nowiki>\" é inválido.\nIntroduza um nome de utilizador diferente.",
-       "config-admin-password-blank": "Introduza uma palavra-chave para a conta de administrador.",
-       "config-admin-password-mismatch": "As duas palavras-chave que introduziu não coincidem.",
+       "config-admin-password-blank": "Introduza uma palavra-passe para a conta de administrador.",
+       "config-admin-password-mismatch": "As duas palavras-passe que introduziu não coincidem.",
        "config-admin-email": "Correio electrónico:",
-       "config-admin-email-help": "Introduza aqui um correio electrónico que lhe permita receber mensagens de outros utilizadores da wiki, reiniciar a sua palavra-chave e receber notificações de alterações às suas páginas vigiadas. Pode deixar o campo vazio.",
+       "config-admin-email-help": "Introduza aqui um correio eletrónico que lhe permita receber mensagens de outros utilizadores da wiki, reiniciar a sua palavra-passe e receber notificações de alterações às suas páginas vigiadas. Pode deixar o campo vazio.",
        "config-admin-error-user": "Ocorreu um erro interno ao criar um administrador com o nome \"<nowiki>$1</nowiki>\".",
-       "config-admin-error-password": "Ocorreu um erro interno ao definir uma palavra-chave para o administrador \"<nowiki>$1</nowiki>\": <pre>$2</pre>",
+       "config-admin-error-password": "Ocorreu um erro interno ao definir uma palavra-passe para o administrador \"<nowiki>$1</nowiki>\": <pre>$2</pre>",
        "config-admin-error-bademail": "Introduziu um correio electrónico inválido",
        "config-subscribe": "Subscreva a [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce lista de divulgação de anúncios de lançamento].",
        "config-subscribe-help": "Esta é uma lista de divulgação de baixo volume para anúncios de lançamento de versões novas, incluindo anúncios de segurança importantes.\nDeve subscrevê-la e atualizar a sua instalação MediaWiki quando são lançadas versões novas.",
        "config-install-tables": "A criar as tabelas",
        "config-install-tables-exist": "'''Aviso''': As tabelas do MediaWiki parecem já existir.\nA criação das tabelas será saltada.",
        "config-install-tables-failed": "'''Erro''': A criação das tabelas falhou com o seguinte erro: $1",
-       "config-install-interwiki": "A preencher a tabela padrão de interlínguas",
+       "config-install-interwiki": "A preencher a tabela padrão de interwikis",
        "config-install-interwiki-list": "Não foi possível encontrar o ficheiro <code>interwiki.list</code>.",
        "config-install-interwiki-exists": "'''Aviso''': A tabela de interwikis parece já conter entradas.\nO preenchimento padrão desta tabela será saltado.",
        "config-install-stats": "A inicializar as estatísticas",
        "config-nofile": "Não foi possível encontrar o ficheiro \"$1\". Terá sido apagado?",
        "config-extension-link": "Sabia que a sua wiki suporta [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions extensões]?\n\nPode procurar [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category extensões por categoria].",
        "mainpagetext": "<strong>MediaWiki instalado.</strong>",
-       "mainpagedocfooter": "Consulte o [https://meta.wikimedia.org/wiki/Help:Contents Guia de Utilizadores] para informações sobre o uso do software wiki.\n\n== Onde começar ==\n\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista de opções de configuração]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Perguntas e respostas frequentes sobre o MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Subscreva a lista de divulgação de novas versões do MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Regionalize o MediaWiki para seu idioma]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Aprenda a combater spam na sua wiki]"
+       "mainpagedocfooter": "Consulte a [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Ajuda do MediaWiki] para informações sobre o uso do software wiki.\n\n== Onde começar ==\n\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista de opções de configuração]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Perguntas e respostas frequentes sobre o MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Subscreva a lista de divulgação de novas versões do MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Regionalize o MediaWiki para a sua língua]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Aprenda a combater <i>spam</i> na sua wiki]"
 }
index 1ae87d0..c285e73 100644 (file)
        "config-nofile": "Файл \"$1\" не удается найти. Он был удален?",
        "config-extension-link": "Знаете ли вы, что ваш вики-проект поддерживает [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions расширения]?\n\nВы можете просмотреть [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category расширения по категориям] или [https://www.mediawiki.org/wiki/Extension_Matrix матрицу расширений], чтобы увидеть их полный список.",
        "mainpagetext": "<strong>MediaWiki успешно установлена.</strong>",
-       "mainpagedocfooter": "Информацию по работе с этой вики можно найти в [https://meta.wikimedia.org/wiki/Help:Contents/ru справочном руководстве].\n\n== Некоторые полезные ресурсы ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Список возможных настроек];\n* [https://www.mediawiki.org/wiki/Manual:FAQ/ru Часто задаваемые вопросы и ответы по MediaWiki];\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Рассылка уведомлений о выходе новых версий MediaWiki].\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Перевод MediaWiki на свой язык]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Узнайте, как бороться со спамом в вашей вики]"
+       "mainpagedocfooter": "Информацию по работе с этой вики можно найти в [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents справочном руководстве].\n\n== Некоторые полезные ресурсы ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Список возможных настроек];\n* [https://www.mediawiki.org/wiki/Manual:FAQ/ru Часто задаваемые вопросы и ответы по MediaWiki];\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Рассылка уведомлений о выходе новых версий MediaWiki].\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Перевод MediaWiki на свой язык]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Узнайте, как бороться со спамом в вашей вики]"
 }
index d6ee081..86d88a3 100644 (file)
        "config-download-localsettings": "Prenesi <code>LocalSettings.php</code>",
        "config-help": "pomoč",
        "mainpagetext": "<strong>Programje MediaWiki je bilo nameščeno.</strong>",
-       "mainpagedocfooter": "Oglejte si [https://meta.wikimedia.org/wiki/Help:Contents Uporabniški priročnik] za informacije o uporabi programja wiki.\n\n== Kako začeti ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Seznam konfiguracijskih nastavitev]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Poogsto zastavljena vprašanja MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Poštni seznam izdaj MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Prevedite MediaWiki v svoj jezik]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Izvedite, kako se boriti proti smetju na svojem wikiju]"
+       "mainpagedocfooter": "Oglejte si [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Uporabniški priročnik] za informacije o uporabi programja wiki.\n\n== Kako začeti ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Seznam konfiguracijskih nastavitev]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Poogsto zastavljena vprašanja MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Poštni seznam izdaj MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Prevedite MediaWiki v svoj jezik]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Izvedite, kako se boriti proti smetju na svojem wikiju]"
 }
index 5d99079..55654bc 100644 (file)
        "config-header-oracle": "Oracle设置",
        "config-header-mssql": "Microsoft SQL Server设置",
        "config-invalid-db-type": "无效的数据库类型",
-       "config-missing-db-name": "您必须为“{{int:config-db-name}}”输入内容。",
-       "config-missing-db-host": "您必须为“{{int:config-db-host}}”输入内容。",
-       "config-missing-db-server-oracle": "您必须为“{{int:config-db-host-oracle}}”输入内容。",
+       "config-missing-db-name": "您必须为“{{int:config-db-name}}”输入一个值。",
+       "config-missing-db-host": "您必须为“{{int:config-db-host}}”输入一个值。",
+       "config-missing-db-server-oracle": "您必须为“{{int:config-db-host-oracle}}”输入一个值。",
        "config-invalid-db-server-oracle": "无效的数据库TNS“$1”。请使用“TNS 名称”或者一个“轻松连接”字符串([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Oracle 命名方法])",
        "config-invalid-db-name": "无效的数据库名称“$1”。请只使用ASCII字母(a-z、A-Z)、数字(0-9)、下划线(_)和连字号(-)。",
        "config-invalid-db-prefix": "无效的数据库前缀“$1”。请只使用ASCII字母(a-z、A-Z)、数字(0-9)、下划线(_)和连字号(-)。",
        "config-mysql-utf8": "UTF-8",
        "config-mysql-charset-help": "在<strong>二进制模式</strong>下,MediaWiki会将UTF-8编码的文本存于数据库的二进制字段中。相对于MySQL的UTF-8模式,这种方法效率更高,并允许您使用全范围的Unicode字符。\n\n在<strong>UTF-8模式</strong>下,MySQL将知道您数据使用的字符集,并能适当地提供和转换内容。但这样做您将无法在数据库中存储[https://zh.wikipedia.org/wiki/基本多文种平面 基本多文种平面]以外的字符。",
        "config-mssql-auth": "身份验证类型:",
-       "config-mssql-install-auth": "选择安装过程中链接数据库时将采用的身份验证方式。\n如果您选择“{{int:config-mssql-windowsauth}}”,将使用运行服务器的用户的身份凭据。",
-       "config-mssql-web-auth": "选择Web服务器在通常wiki操作期间用来连接数据库服务器的身份验证方式。\n如果您选择“{{int:config-mssql-windowsauth}}”,将使用运行Web服务器的用户的凭据。",
+       "config-mssql-install-auth": "选择安装过程中链接数据库时将采用的身份验证方式。如果您选择“{{int:config-mssql-windowsauth}}”,将使用运行服务器的用户的身份凭据。",
+       "config-mssql-web-auth": "选择Web服务器在通常wiki操作期间用来连接数据库服务器的身份验证方式。如果您选择“{{int:config-mssql-windowsauth}}”,将使用运行Web服务器的用户的凭据。",
        "config-mssql-sqlauth": "SQL Server 身份验证",
        "config-mssql-windowsauth": "Windows 身份验证",
        "config-site-name": "wiki的名称:",
        "config-license-gfdl": "GNU自由文档许可证1.3或更高版本",
        "config-license-pd": "公有领域",
        "config-license-cc-choose": "选择自定义的知识共享许可证",
-       "config-license-help": "许多公共wiki将所有用户贡献置于[http://freedomdefined.org/Definition 自由许可证]之下。这有助于构建社区的主人翁意识,并鼓励长期贡献。对于非公共wiki或公司wiki,这并非必要条件。\n\n如果您希望使用来自维基百科的内容,并希望维基百科能接受复制自您的wiki的内容,您应当选择<strong>{{int:config-license-cc-by-sa}}</strong>\n\nGNU自由文档许可证是维基百科曾经使用过的许可证,并迄今有效。然而,该许可证难以理解,并会增加重用内容的难度。",
+       "config-license-help": "许多公共wiki将所有用户贡献置于[http://freedomdefined.org/Definition 自由许可证]之下。这有助于构建社区的主人翁意识,并鼓励长期贡献。对于非公共wiki或公司wiki,这并非必要条件。\n\n如果您希望使用来自维基百科的内容,并希望维基百科能接受复制自您的wiki的内容,您应当选择<strong>{{int:config-license-cc-by-sa}}</strong>\n\nGNU自由文档许可证是维基百科曾经使用过的许可证,并迄今有效。然而,该许可证难以理解,并会增加重用内容的难度。",
        "config-email-settings": "电子邮件设置",
        "config-enable-email": "启用出站电子邮件",
        "config-enable-email-help": "如果您希望使用电子邮件功能,请正确配置[http://www.php.net/manual/en/mail.configuration.php PHP的邮件设定]。如果您不需要任何电子邮件功能,请在此处禁用它。",
        "config-nofile": "找不到文件“$1”。它是否已被删除?",
        "config-extension-link": "您是否知道您的wiki支持[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions 扩展]?\n\n您可以浏览[https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category 扩展分类]或[https://www.mediawiki.org/wiki/Extension_Matrix 扩展矩阵]以查看完整的扩展列表。",
        "mainpagetext": "<strong>已安装MediaWiki。</strong>",
-       "mainpagedocfooter": "请查阅[https://meta.wikimedia.org/wiki/Help:Contents 用户指南]以获取使用本wiki软件的信息!\n\n== 入门 ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings MediaWiki配置设置列表]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/zh-hans MediaWiki常见问题]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki发布邮件列表]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources 本地化MediaWiki到您的语言]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam 了解如何在您的wiki上打击破坏]"
+       "mainpagedocfooter": "请查阅[https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents]以获取使用本wiki软件的信息!\n\n== 入门 ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings MediaWiki配置设置列表]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/zh-hans MediaWiki常见问题]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki发布邮件列表]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources 本地化MediaWiki到您的语言]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam 了解如何在您的wiki上打击破坏]"
 }
diff --git a/includes/interwiki/InterwikiLookupAdapter.php b/includes/interwiki/InterwikiLookupAdapter.php
new file mode 100644 (file)
index 0000000..60d6f43
--- /dev/null
@@ -0,0 +1,175 @@
+<?php
+namespace MediaWiki\Interwiki;
+
+/**
+ * InterwikiLookupAdapter on top of SiteLookup
+ *
+ * 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.29
+ * @ingroup InterwikiLookup
+ *
+ * @license GNU GPL v2+
+ */
+
+use Interwiki;
+use Site;
+use SiteLookup;
+use MediaWikiSite;
+
+class InterwikiLookupAdapter implements InterwikiLookup {
+
+       /**
+        * @var SiteLookup
+        */
+       private $siteLookup;
+
+       /**
+        * @var Interwiki[]|null associative array mapping interwiki prefixes to Interwiki objects
+        */
+       private $interwikiMap;
+
+       function __construct(
+               SiteLookup $siteLookup,
+               array $interwikiMap = null
+       ) {
+               $this->siteLookup = $siteLookup;
+               $this->interwikiMap = $interwikiMap;
+       }
+
+       /**
+        * See InterwikiLookup::isValidInterwiki
+        * It loads the whole interwiki map.
+        *
+        * @param string $prefix Interwiki prefix to use
+        * @return bool Whether it exists
+        */
+       public function isValidInterwiki( $prefix ) {
+
+               return array_key_exists( $prefix, $this->getInterwikiMap() );
+       }
+
+       /**
+        * See InterwikiLookup::fetch
+        * It loads the whole interwiki map.
+        *
+        * @param string $prefix Interwiki prefix to use
+        * @return Interwiki|null|bool
+        */
+       public function fetch( $prefix ) {
+               if ( $prefix == '' ) {
+                       return null;
+               }
+
+               if ( !$this->isValidInterwiki( $prefix ) ) {
+                       return false;
+               }
+
+               return $this->interwikiMap[$prefix];
+       }
+
+       /**
+        * See InterwikiLookup::getAllPrefixes
+        *
+        * @param string|null $local If set, limits output to local/non-local interwikis
+        * @return string[] List of prefixes
+        */
+       public function getAllPrefixes( $local = null ) {
+               if ( $local === null ) {
+                       return array_keys( $this->getInterwikiMap() );
+               }
+               $res = [];
+               foreach ( $this->getInterwikiMap() as $interwikiId => $interwiki ) {
+                       if ( $interwiki->isLocal() === $local ) {
+                               $res[] = $interwikiId;
+                       }
+               }
+               return $res;
+       }
+
+       /**
+        * See InterwikiLookup::invalidateCache
+        *
+        * @param string $prefix
+        */
+       public function invalidateCache( $prefix ) {
+               if ( !isset( $this->interwikiMap[$prefix] ) ) {
+                       return;
+               }
+               $globalId = $this->interwikiMap[$prefix]->getWikiID();
+               unset( $this->interwikiMap[$prefix] );
+
+               // Reload the interwiki
+               $site = $this->siteLookup->getSites()->getSite( $globalId );
+               $interwikis = $this->getSiteInterwikis( $site );
+               $this->interwikiMap = array_merge( $this->interwikiMap, [ $interwikis[$prefix] ] );
+       }
+
+       /**
+        * Load interwiki map to use as cache
+        */
+       private function loadInterwikiMap() {
+               $interwikiMap = [];
+               $siteList = $this->siteLookup->getSites();
+               foreach ( $siteList as $site ) {
+                       $interwikis = $this->getSiteInterwikis( $site );
+                       $interwikiMap = array_merge( $interwikiMap, $interwikis );
+               }
+               $this->interwikiMap = $interwikiMap;
+       }
+
+       /**
+        * Get interwikiMap attribute, load if needed.
+        *
+        * @return Interwiki[]
+        */
+       private function getInterwikiMap() {
+               if ( $this->interwikiMap === null ) {
+                       $this->loadInterwikiMap();
+               }
+               return $this->interwikiMap;
+       }
+
+       /**
+        * Load interwikis for the given site
+        *
+        * @param Site $site
+        * @return Interwiki[]
+        */
+       private function getSiteInterwikis( Site $site ) {
+               $interwikis = [];
+               foreach ( $site->getInterwikiIds() as $interwiki ) {
+                       $url = $site->getPageUrl();
+                       if ( $site instanceof MediaWikiSite ) {
+                               $path = $site->getFileUrl( 'api.php' );
+                       } else {
+                               $path = '';
+                       }
+                       $local = $site->getSource() === 'local';
+                       // TODO: How to adapt trans?
+                       $interwikis[$interwiki] = new Interwiki(
+                               $interwiki,
+                               $url,
+                               $path,
+                               $site->getGlobalId(),
+                               $local
+                       );
+               }
+               return $interwikis;
+       }
+}
index aa01768..0a8ae7f 100644 (file)
@@ -69,7 +69,7 @@ class JobQueueDB extends JobQueue {
         * @return bool
         */
        protected function doIsEmpty() {
-               $dbr = $this->getSlaveDB();
+               $dbr = $this->getReplicaDB();
                try {
                        $found = $dbr->selectField( // unclaimed job
                                'job', '1', [ 'job_cmd' => $this->type, 'job_token' => '' ], __METHOD__
@@ -94,7 +94,7 @@ class JobQueueDB extends JobQueue {
                }
 
                try {
-                       $dbr = $this->getSlaveDB();
+                       $dbr = $this->getReplicaDB();
                        $size = (int)$dbr->selectField( 'job', 'COUNT(*)',
                                [ 'job_cmd' => $this->type, 'job_token' => '' ],
                                __METHOD__
@@ -123,7 +123,7 @@ class JobQueueDB extends JobQueue {
                        return $count;
                }
 
-               $dbr = $this->getSlaveDB();
+               $dbr = $this->getReplicaDB();
                try {
                        $count = (int)$dbr->selectField( 'job', 'COUNT(*)',
                                [ 'job_cmd' => $this->type, "job_token != {$dbr->addQuotes( '' )}" ],
@@ -154,7 +154,7 @@ class JobQueueDB extends JobQueue {
                        return $count;
                }
 
-               $dbr = $this->getSlaveDB();
+               $dbr = $this->getReplicaDB();
                try {
                        $count = (int)$dbr->selectField( 'job', 'COUNT(*)',
                                [
@@ -324,7 +324,7 @@ class JobQueueDB extends JobQueue {
                $invertedDirection = false; // whether one job_random direction was already scanned
                // This uses a replication safe method for acquiring jobs. One could use UPDATE+LIMIT
                // instead, but that either uses ORDER BY (in which case it deadlocks in MySQL) or is
-               // not replication safe. Due to http://bugs.mysql.com/bug.php?id=6980, subqueries cannot
+               // not replication safe. Due to https://bugs.mysql.com/bug.php?id=6980, subqueries cannot
                // be used here with MySQL.
                do {
                        if ( $tinyQueue ) { // queue has <= MAX_OFFSET rows
@@ -398,7 +398,7 @@ class JobQueueDB extends JobQueue {
                $row = false; // the row acquired
                do {
                        if ( $dbw->getType() === 'mysql' ) {
-                               // Per http://bugs.mysql.com/bug.php?id=6980, we can't use subqueries on the
+                               // Per https://bugs.mysql.com/bug.php?id=6980, we can't use subqueries on the
                                // same table being changed in an UPDATE query in MySQL (gives Error: 1093).
                                // Oracle and Postgre have no such limitation. However, MySQL offers an
                                // alternative here by supporting ORDER BY + LIMIT for UPDATE queries.
@@ -566,7 +566,7 @@ class JobQueueDB extends JobQueue {
         * @return Iterator
         */
        protected function getJobIterator( array $conds ) {
-               $dbr = $this->getSlaveDB();
+               $dbr = $this->getReplicaDB();
                try {
                        return new MappedIterator(
                                $dbr->select( 'job', self::selectFields(), $conds ),
@@ -594,7 +594,7 @@ class JobQueueDB extends JobQueue {
        }
 
        protected function doGetSiblingQueuesWithJobs( array $types ) {
-               $dbr = $this->getSlaveDB();
+               $dbr = $this->getReplicaDB();
                // @note: this does not check whether the jobs are claimed or not.
                // This is useful so JobQueueGroup::pop() also sees queues that only
                // have stale jobs. This lets recycleAndDeleteStaleJobs() re-enqueue
@@ -611,7 +611,7 @@ class JobQueueDB extends JobQueue {
        }
 
        protected function doGetSiblingQueueSizes( array $types ) {
-               $dbr = $this->getSlaveDB();
+               $dbr = $this->getReplicaDB();
                $res = $dbr->select( 'job', [ 'job_cmd', 'COUNT(*) AS count' ],
                        [ 'job_cmd' => $types ], __METHOD__, [ 'GROUP BY' => 'job_cmd' ] );
 
@@ -737,7 +737,7 @@ class JobQueueDB extends JobQueue {
         * @throws JobQueueConnectionError
         * @return DBConnRef
         */
-       protected function getSlaveDB() {
+       protected function getReplicaDB() {
                try {
                        return $this->getDB( DB_REPLICA );
                } catch ( DBConnectionError $e ) {
index 0469eeb..990f112 100644 (file)
@@ -336,7 +336,7 @@ class JobRunner implements LoggerAwareInterface {
         */
        private function getMaxRssKb() {
                $info = wfGetRusage() ?: [];
-               // see http://linux.die.net/man/2/getrusage
+               // see https://linux.die.net/man/2/getrusage
                return isset( $info['ru_maxrss'] ) ? (int)$info['ru_maxrss'] : null;
        }
 
index 775ab43..41541ef 100644 (file)
@@ -271,7 +271,7 @@ class FormatJson {
         */
        public static function stripComments( $json ) {
                // Ensure we have a string
-               $str = (string) $json;
+               $str = (string)$json;
                $buffer = '';
                $maxLen = strlen( $str );
                $mark = 0;
index 6e40f4c..bc99672 100644 (file)
@@ -319,7 +319,7 @@ class CSSMin {
                                                        );
 
                                                        $url = $match['file'] . $match['query'];
-                                                       $file = $local . $match['file'];
+                                                       $file = "{$local}/{$match['file']}";
                                                        if (
                                                                !self::isRemoteUrl( $url ) && !self::isLocalUrl( $url )
                                                                && file_exists( $file )
@@ -357,7 +357,6 @@ class CSSMin {
                }, $source );
 
                return $source;
-
        }
 
        /**
index a870204..f0b44a5 100644 (file)
@@ -215,7 +215,7 @@ class MultiHttpClient {
                                // Wait (if possible) for available work...
                                if ( $active > 0 && $mrc == CURLM_OK ) {
                                        if ( curl_multi_select( $chm, 10 ) == -1 ) {
-                                               // PHP bug 63411; http://curl.haxx.se/libcurl/c/curl_multi_fdset.html
+                                               // PHP bug 63411; https://curl.haxx.se/libcurl/c/curl_multi_fdset.html
                                                usleep( 5000 ); // 5ms
                                        }
                                }
index 62baaf1..57c253d 100644 (file)
@@ -36,9 +36,9 @@ use Psr\Log\NullLogger;
  *   getEntryByName().
  *
  * The in-line documentation incorporates content from the User Timing Specification
- * http://www.w3.org/TR/user-timing/
+ * https://www.w3.org/TR/user-timing/
  * Copyright © 2013 World Wide Web Consortium, (MIT, ERCIM, Keio, Beihang).
- * http://www.w3.org/Consortium/Legal/2015/doc-license
+ * https://www.w3.org/Consortium/Legal/2015/doc-license
  *
  * @since 1.27
  */
index 5764cc3..15f13b9 100644 (file)
@@ -928,7 +928,7 @@ abstract class FileBackend implements LoggerAwareInterface {
         * @return ScopedCallback|null
         */
        final protected function getScopedPHPBehaviorForOps() {
-               if ( PHP_SAPI != 'cli' ) { // http://bugs.php.net/bug.php?id=47540
+               if ( PHP_SAPI != 'cli' ) { // https://bugs.php.net/bug.php?id=47540
                        $old = ignore_user_abort( true ); // avoid half-finished operations
                        return new ScopedCallback( function () use ( $old ) {
                                ignore_user_abort( $old );
index 4bc0ce6..08cb388 100644 (file)
@@ -176,7 +176,6 @@ class SwiftFileBackend extends FileBackendStore {
                return isset( $params['headers'] )
                        ? $this->getCustomHeaders( $params['headers'] )
                        : [];
-
        }
 
        /**
@@ -1209,7 +1208,7 @@ class SwiftFileBackend extends FileBackendStore {
                                        $this->rgwS3SecretKey,
                                        true // raw
                                ) );
-                               // See http://s3.amazonaws.com/doc/s3-developer-guide/RESTAuthentication.html.
+                               // See https://s3.amazonaws.com/doc/s3-developer-guide/RESTAuthentication.html.
                                // Note: adding a newline for empty CanonicalizedAmzHeaders does not work.
                                // Note: S3 API is the rgw default; remove the /swift/ URL bit.
                                return str_replace( '/swift/v1', '', $this->storageUrl( $auth ) . $spath ) .
@@ -1305,7 +1304,7 @@ class SwiftFileBackend extends FileBackendStore {
        /**
         * Set read/write permissions for a Swift container.
         *
-        * @see http://swift.openstack.org/misc.html#acls
+        * @see http://docs.openstack.org/developer/swift/misc.html#acls
         *
         * In general, we don't allow listings to end-users. It's not useful, isn't well-defined
         * (lists are truncated to 10000 item with no way to page), and is just a performance risk.
index 99cf399..40f22c5 100644 (file)
@@ -6,9 +6,9 @@
  * Minifies a javascript file using a javascript parser
  *
  * This implements a PHP port of Brendan Eich's Narcissus open source javascript engine (in javascript)
- * References: http://en.wikipedia.org/wiki/Narcissus_(JavaScript_engine)
- * Narcissus sourcecode: http://mxr.mozilla.org/mozilla/source/js/narcissus/
- * JSMinPlus weblog: http://crisp.tweakblogs.net/blog/cat/716
+ * References: https://en.wikipedia.org/wiki/Narcissus_(JavaScript_engine)
+ * Narcissus sourcecode: https://mxr.mozilla.org/mozilla/source/js/narcissus/
+ * JSMinPlus weblog: https://crisp.tweakblogs.net/blog/cat/716
  *
  * Tino Zijdel <crisp@tweakers.net>
  *
@@ -936,7 +936,7 @@ class JSParser
                                {
                                        // <script language="JavaScript"> (without version hints) may need
                                        // automatic semicolon insertion without a newline after do-while.
-                                       // See http://bugzilla.mozilla.org/show_bug.cgi?id=238945.
+                                       // See https://bugzilla.mozilla.org/show_bug.cgi?id=238945.
                                        $this->t->match(OP_SEMICOLON);
                                        return $n;
                                }
index 5f4d7c9..e42d1a9 100644 (file)
@@ -861,7 +861,7 @@ EOT;
                        'text-web',
                        'text' ];
 
-               // http://lists.oasis-open.org/archives/office/200505/msg00006.html
+               // https://lists.oasis-open.org/archives/office/200505/msg00006.html
                $types = '(?:' . implode( '|', $opendocTypes ) . ')';
                $opendocRegex = "/^mimetype(application\/vnd\.oasis\.opendocument\.$types)/";
 
index f057140..3958f8c 100644 (file)
@@ -175,7 +175,6 @@ class XmlTypeCheck {
        }
 
        private function validate( $reader ) {
-
                // First, move through anything that isn't an element, and
                // handle any processing instructions with the callback
                do {
@@ -240,7 +239,6 @@ class XmlTypeCheck {
                                        // NOTATION, or XML_DECLARATION
                                        // xml_parse didn't send these to the filter, so we won't.
                        }
-
                } while ( $this->readNext( $reader ) );
 
                if ( $this->stackDepth !== 0 ) {
@@ -248,7 +246,6 @@ class XmlTypeCheck {
                } elseif ( $this->wellFormed === null ) {
                        $this->wellFormed = true;
                }
-
        }
 
        /**
index ba63432..3d35d76 100644 (file)
@@ -898,7 +898,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
 
                if ( false === $ret ) {
                        # Deadlocks cause the entire transaction to abort, not just the statement.
-                       # http://dev.mysql.com/doc/refman/5.7/en/innodb-error-handling.html
+                       # https://dev.mysql.com/doc/refman/5.7/en/innodb-error-handling.html
                        # https://www.postgresql.org/docs/9.1/static/explicit-locking.html
                        if ( $this->wasDeadlock() ) {
                                if ( $this->explicitTrxActive() || $priorWritesPending ) {
@@ -1721,9 +1721,9 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
                } elseif ( count( $dbDetails ) == 2 ) {
                        list( $database, $table ) = $dbDetails;
                        # We don't want any prefix added in this case
+                       $prefix = '';
                        # In dbs that support it, $database may actually be the schema
                        # but that doesn't affect any of the functionality here
-                       $prefix = '';
                        $schema = '';
                } else {
                        list( $table ) = $dbDetails;
@@ -1745,29 +1745,35 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
                # Quote $table and apply the prefix if not quoted.
                # $tableName might be empty if this is called from Database::replaceVars()
                $tableName = "{$prefix}{$table}";
-               if ( $format == 'quoted'
-                       && !$this->isQuotedIdentifier( $tableName ) && $tableName !== ''
+               if ( $format === 'quoted'
+                       && !$this->isQuotedIdentifier( $tableName )
+                       && $tableName !== ''
                ) {
                        $tableName = $this->addIdentifierQuotes( $tableName );
                }
 
-               # Quote $schema and merge it with the table name if needed
-               if ( strlen( $schema ) ) {
-                       if ( $format == 'quoted' && !$this->isQuotedIdentifier( $schema ) ) {
-                               $schema = $this->addIdentifierQuotes( $schema );
-                       }
-                       $tableName = $schema . '.' . $tableName;
-               }
+               # Quote $schema and $database and merge them with the table name if needed
+               $tableName = $this->prependDatabaseOrSchema( $schema, $tableName, $format );
+               $tableName = $this->prependDatabaseOrSchema( $database, $tableName, $format );
+
+               return $tableName;
+       }
 
-               # Quote $database and merge it with the table name if needed
-               if ( $database !== '' ) {
-                       if ( $format == 'quoted' && !$this->isQuotedIdentifier( $database ) ) {
-                               $database = $this->addIdentifierQuotes( $database );
+       /**
+        * @param string|null $namespace Database or schema
+        * @param string $relation Name of table, view, sequence, etc...
+        * @param string $format One of (raw, quoted)
+        * @return string Relation name with quoted and merged $namespace as needed
+        */
+       private function prependDatabaseOrSchema( $namespace, $relation, $format ) {
+               if ( strlen( $namespace ) ) {
+                       if ( $format === 'quoted' && !$this->isQuotedIdentifier( $namespace ) ) {
+                               $namespace = $this->addIdentifierQuotes( $namespace );
                        }
-                       $tableName = $database . '.' . $tableName;
+                       $relation = $namespace . '.' . $relation;
                }
 
-               return $tableName;
+               return $relation;
        }
 
        public function tableNames() {
index 3b7681e..668443b 100644 (file)
@@ -94,7 +94,7 @@ abstract class DatabaseMysqlBase extends Database {
        /**
         * @return string
         */
-       function getType() {
+       public function getType() {
                return 'mysql';
        }
 
@@ -106,7 +106,7 @@ abstract class DatabaseMysqlBase extends Database {
         * @throws Exception|DBConnectionError
         * @return bool
         */
-       function open( $server, $user, $password, $dbName ) {
+       public function open( $server, $user, $password, $dbName ) {
                # Close/unset connection handle
                $this->close();
 
@@ -237,7 +237,7 @@ abstract class DatabaseMysqlBase extends Database {
         * @param ResultWrapper|resource $res
         * @throws DBUnexpectedError
         */
-       function freeResult( $res ) {
+       public function freeResult( $res ) {
                if ( $res instanceof ResultWrapper ) {
                        $res = $res->result;
                }
@@ -262,7 +262,7 @@ abstract class DatabaseMysqlBase extends Database {
         * @return stdClass|bool
         * @throws DBUnexpectedError
         */
-       function fetchObject( $res ) {
+       public function fetchObject( $res ) {
                if ( $res instanceof ResultWrapper ) {
                        $res = $res->result;
                }
@@ -274,7 +274,7 @@ abstract class DatabaseMysqlBase extends Database {
                // Unfortunately, mysql_fetch_object does not reset the last errno.
                // Only check for CR_SERVER_LOST and CR_UNKNOWN_ERROR, as
                // these are the only errors mysql_fetch_object can cause.
-               // See http://dev.mysql.com/doc/refman/5.0/en/mysql-fetch-row.html.
+               // See https://dev.mysql.com/doc/refman/5.0/en/mysql-fetch-row.html.
                if ( $errno == 2000 || $errno == 2013 ) {
                        throw new DBUnexpectedError(
                                $this,
@@ -298,7 +298,7 @@ abstract class DatabaseMysqlBase extends Database {
         * @return array|bool
         * @throws DBUnexpectedError
         */
-       function fetchRow( $res ) {
+       public function fetchRow( $res ) {
                if ( $res instanceof ResultWrapper ) {
                        $res = $res->result;
                }
@@ -310,7 +310,7 @@ abstract class DatabaseMysqlBase extends Database {
                // Unfortunately, mysql_fetch_array does not reset the last errno.
                // Only check for CR_SERVER_LOST and CR_UNKNOWN_ERROR, as
                // these are the only errors mysql_fetch_array can cause.
-               // See http://dev.mysql.com/doc/refman/5.0/en/mysql-fetch-row.html.
+               // See https://dev.mysql.com/doc/refman/5.0/en/mysql-fetch-row.html.
                if ( $errno == 2000 || $errno == 2013 ) {
                        throw new DBUnexpectedError(
                                $this,
@@ -345,7 +345,7 @@ abstract class DatabaseMysqlBase extends Database {
                // Unfortunately, mysql_num_rows does not reset the last errno.
                // We are not checking for any errors here, since
                // these are no errors mysql_num_rows can cause.
-               // See http://dev.mysql.com/doc/refman/5.0/en/mysql-fetch-row.html.
+               // See https://dev.mysql.com/doc/refman/5.0/en/mysql-fetch-row.html.
                // See https://phabricator.wikimedia.org/T44430
                return $n;
        }
@@ -362,7 +362,7 @@ abstract class DatabaseMysqlBase extends Database {
         * @param ResultWrapper|resource $res
         * @return int
         */
-       function numFields( $res ) {
+       public function numFields( $res ) {
                if ( $res instanceof ResultWrapper ) {
                        $res = $res->result;
                }
@@ -383,7 +383,7 @@ abstract class DatabaseMysqlBase extends Database {
         * @param int $n
         * @return string
         */
-       function fieldName( $res, $n ) {
+       public function fieldName( $res, $n ) {
                if ( $res instanceof ResultWrapper ) {
                        $res = $res->result;
                }
@@ -428,7 +428,7 @@ abstract class DatabaseMysqlBase extends Database {
         * @param int $row
         * @return bool
         */
-       function dataSeek( $res, $row ) {
+       public function dataSeek( $res, $row ) {
                if ( $res instanceof ResultWrapper ) {
                        $res = $res->result;
                }
@@ -448,7 +448,7 @@ abstract class DatabaseMysqlBase extends Database {
        /**
         * @return string
         */
-       function lastError() {
+       public function lastError() {
                if ( $this->mConn ) {
                        # Even if it's non-zero, it can still be invalid
                        MediaWiki\suppressWarnings();
@@ -482,7 +482,7 @@ abstract class DatabaseMysqlBase extends Database {
         * @param string $fname
         * @return ResultWrapper
         */
-       function replace( $table, $uniqueIndexes, $rows, $fname = __METHOD__ ) {
+       public function replace( $table, $uniqueIndexes, $rows, $fname = __METHOD__ ) {
                return $this->nativeReplace( $table, $rows, $fname );
        }
 
@@ -518,7 +518,7 @@ abstract class DatabaseMysqlBase extends Database {
                return (int)$rows;
        }
 
-       function tableExists( $table, $fname = __METHOD__ ) {
+       public function tableExists( $table, $fname = __METHOD__ ) {
                $table = $this->tableName( $table, 'raw' );
                if ( isset( $this->mSessionTempTables[$table] ) ) {
                        return true; // already known to exist and won't show in SHOW TABLES anyway
@@ -534,7 +534,7 @@ abstract class DatabaseMysqlBase extends Database {
         * @param string $field
         * @return bool|MySQLField
         */
-       function fieldInfo( $table, $field ) {
+       public function fieldInfo( $table, $field ) {
                $table = $this->tableName( $table );
                $res = $this->query( "SELECT * FROM $table LIMIT 1", __METHOD__, true );
                if ( !$res ) {
@@ -569,10 +569,10 @@ abstract class DatabaseMysqlBase extends Database {
         * @param string $fname
         * @return bool|array|null False or null on failure
         */
-       function indexInfo( $table, $index, $fname = __METHOD__ ) {
+       public function indexInfo( $table, $index, $fname = __METHOD__ ) {
                # SHOW INDEX works in MySQL 3.23.58, but SHOW INDEXES does not.
                # SHOW INDEX should work for 3.x and up:
-               # http://dev.mysql.com/doc/mysql/en/SHOW_INDEX.html
+               # https://dev.mysql.com/doc/mysql/en/SHOW_INDEX.html
                $table = $this->tableName( $table );
                $index = $this->indexName( $index );
 
@@ -598,7 +598,7 @@ abstract class DatabaseMysqlBase extends Database {
         * @param string $s
         * @return string
         */
-       function strencode( $s ) {
+       public function strencode( $s ) {
                return $this->mysqlRealEscapeString( $s );
        }
 
@@ -638,7 +638,7 @@ abstract class DatabaseMysqlBase extends Database {
                return strlen( $name ) && $name[0] == '`' && substr( $name, -1, 1 ) == '`';
        }
 
-       function getLag() {
+       public function getLag() {
                if ( $this->getLagDetectionMethod() === 'pt-heartbeat' ) {
                        return $this->getLagFromPtHeartbeat();
                } else {
@@ -768,7 +768,7 @@ abstract class DatabaseMysqlBase extends Database {
                return [ $row ? $row->ts : null, microtime( true ) ];
        }
 
-       public function getApproximateLagStatus() {
+       protected function getApproximateLagStatus() {
                if ( $this->getLagDetectionMethod() === 'pt-heartbeat' ) {
                        // Disable caching since this is fast enough and we don't wan't
                        // to be *too* pessimistic by having both the cache TTL and the
@@ -786,7 +786,7 @@ abstract class DatabaseMysqlBase extends Database {
                return $approxLag;
        }
 
-       function masterPosWait( DBMasterPos $pos, $timeout ) {
+       public function masterPosWait( DBMasterPos $pos, $timeout ) {
                if ( !( $pos instanceof MySQLMasterPos ) ) {
                        throw new InvalidArgumentException( "Position not an instance of MySQLMasterPos" );
                }
@@ -839,7 +839,7 @@ abstract class DatabaseMysqlBase extends Database {
         *
         * @return MySQLMasterPos|bool
         */
-       function getReplicaPos() {
+       public function getReplicaPos() {
                $res = $this->query( 'SHOW SLAVE STATUS', __METHOD__ );
                $row = $this->fetchObject( $res );
 
@@ -867,7 +867,7 @@ abstract class DatabaseMysqlBase extends Database {
         *
         * @return MySQLMasterPos|bool
         */
-       function getMasterPos() {
+       public function getMasterPos() {
                $res = $this->query( 'SHOW MASTER STATUS', __METHOD__ );
                $row = $this->fetchObject( $res );
 
@@ -1013,7 +1013,7 @@ abstract class DatabaseMysqlBase extends Database {
 
        /**
         * FROM MYSQL DOCS:
-        * http://dev.mysql.com/doc/refman/5.0/en/miscellaneous-functions.html#function_release-lock
+        * https://dev.mysql.com/doc/refman/5.0/en/miscellaneous-functions.html#function_release-lock
         * @param string $lockName
         * @param string $method
         * @return bool
@@ -1034,7 +1034,7 @@ abstract class DatabaseMysqlBase extends Database {
        }
 
        private function makeLockName( $lockName ) {
-               // http://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_get-lock
+               // https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_get-lock
                // Newer version enforce a 64 char length limit.
                return ( strlen( $lockName ) > 64 ) ? sha1( $lockName ) : $lockName;
        }
@@ -1108,7 +1108,9 @@ abstract class DatabaseMysqlBase extends Database {
         * @throws DBUnexpectedError
         * @return bool|ResultWrapper
         */
-       function deleteJoin( $delTable, $joinTable, $delVar, $joinVar, $conds, $fname = __METHOD__ ) {
+       public function deleteJoin(
+               $delTable, $joinTable, $delVar, $joinVar, $conds, $fname = __METHOD__
+       ) {
                if ( !$conds ) {
                        throw new DBUnexpectedError( $this, __METHOD__ . ' called with empty $conds' );
                }
@@ -1162,7 +1164,7 @@ abstract class DatabaseMysqlBase extends Database {
         *
         * @return int
         */
-       function getServerUptime() {
+       public function getServerUptime() {
                $vars = $this->getMysqlStatus( 'Uptime' );
 
                return (int)$vars['Uptime'];
@@ -1173,7 +1175,7 @@ abstract class DatabaseMysqlBase extends Database {
         *
         * @return bool
         */
-       function wasDeadlock() {
+       public function wasDeadlock() {
                return $this->lastErrno() == 1213;
        }
 
@@ -1182,11 +1184,11 @@ abstract class DatabaseMysqlBase extends Database {
         *
         * @return bool
         */
-       function wasLockTimeout() {
+       public function wasLockTimeout() {
                return $this->lastErrno() == 1205;
        }
 
-       function wasErrorReissuable() {
+       public function wasErrorReissuable() {
                return $this->lastErrno() == 2013 || $this->lastErrno() == 2006;
        }
 
@@ -1195,12 +1197,12 @@ abstract class DatabaseMysqlBase extends Database {
         *
         * @return bool
         */
-       function wasReadOnlyError() {
+       public function wasReadOnlyError() {
                return $this->lastErrno() == 1223 ||
                        ( $this->lastErrno() == 1290 && strpos( $this->lastError(), '--read-only' ) !== false );
        }
 
-       function wasConnectionError( $errno ) {
+       public function wasConnectionError( $errno ) {
                return $errno == 2013 || $errno == 2006;
        }
 
@@ -1211,7 +1213,9 @@ abstract class DatabaseMysqlBase extends Database {
         * @param string $fname
         * @return bool
         */
-       function duplicateTableStructure( $oldName, $newName, $temporary = false, $fname = __METHOD__ ) {
+       public function duplicateTableStructure(
+               $oldName, $newName, $temporary = false, $fname = __METHOD__
+       ) {
                $tmp = $temporary ? 'TEMPORARY ' : '';
                $newName = $this->addIdentifierQuotes( $newName );
                $oldName = $this->addIdentifierQuotes( $oldName );
@@ -1227,7 +1231,7 @@ abstract class DatabaseMysqlBase extends Database {
         * @param string $fname Calling function name
         * @return array
         */
-       function listTables( $prefix = null, $fname = __METHOD__ ) {
+       public function listTables( $prefix = null, $fname = __METHOD__ ) {
                $result = $this->query( "SHOW TABLES", $fname );
 
                $endArray = [];
@@ -1263,7 +1267,7 @@ abstract class DatabaseMysqlBase extends Database {
         * @param string $which
         * @return array
         */
-       function getMysqlStatus( $which = "%" ) {
+       private function getMysqlStatus( $which = "%" ) {
                $res = $this->query( "SHOW STATUS LIKE '{$which}'" );
                $status = [];
 
index 7acd8dc..41aa5e0 100644 (file)
@@ -48,19 +48,19 @@ class DatabasePostgres extends Database {
                parent::__construct( $params );
        }
 
-       function getType() {
+       public function getType() {
                return 'postgres';
        }
 
-       function implicitGroupby() {
+       public function implicitGroupby() {
                return false;
        }
 
-       function implicitOrderby() {
+       public function implicitOrderby() {
                return false;
        }
 
-       function hasConstraint( $name ) {
+       public function hasConstraint( $name ) {
                $conn = $this->getBindingHandle();
 
                $sql = "SELECT 1 FROM pg_catalog.pg_constraint c, pg_catalog.pg_namespace n " .
@@ -72,16 +72,7 @@ class DatabasePostgres extends Database {
                return $this->numRows( $res );
        }
 
-       /**
-        * Usually aborts on failure
-        * @param string $server
-        * @param string $user
-        * @param string $password
-        * @param string $dbName
-        * @throws DBConnectionError|Exception
-        * @return resource|bool|null
-        */
-       function open( $server, $user, $password, $dbName ) {
+       public function open( $server, $user, $password, $dbName ) {
                # Test for Postgres support, to avoid suppressed fatal error
                if ( !function_exists( 'pg_connect' ) ) {
                        throw new DBConnectionError(
@@ -152,6 +143,8 @@ class DatabasePostgres extends Database {
                }
 
                $this->determineCoreSchema( $this->mSchema );
+               // The schema to be used is now in the search path; no need for explicit qualification
+               $this->mSchema = '';
 
                return $this->mConn;
        }
@@ -162,7 +155,7 @@ class DatabasePostgres extends Database {
         * @param string $db
         * @return bool
         */
-       function selectDB( $db ) {
+       public function selectDB( $db ) {
                if ( $this->mDBname !== $db ) {
                        return (bool)$this->open( $this->mServer, $this->mUser, $this->mPassword, $db );
                } else {
@@ -170,7 +163,11 @@ class DatabasePostgres extends Database {
                }
        }
 
-       function makeConnectionString( $vars ) {
+       /**
+        * @param string[] $vars
+        * @return string
+        */
+       private function makeConnectionString( $vars ) {
                $s = '';
                foreach ( $vars as $name => $value ) {
                        $s .= "$name='" . str_replace( "'", "\\'", $value ) . "' ";
@@ -179,11 +176,6 @@ class DatabasePostgres extends Database {
                return $s;
        }
 
-       /**
-        * Closes a database connection, if it is open
-        * Returns success, true if already closed
-        * @return bool
-        */
        protected function closeConnection() {
                return $this->mConn ? pg_close( $this->mConn ) : true;
        }
@@ -229,7 +221,7 @@ class DatabasePostgres extends Database {
                }
        }
 
-       function reportQueryError( $error, $errno, $sql, $fname, $tempIgnore = false ) {
+       public function reportQueryError( $error, $errno, $sql, $fname, $tempIgnore = false ) {
                if ( $tempIgnore ) {
                        /* Check for constraint violation */
                        if ( $errno === '23505' ) {
@@ -247,15 +239,7 @@ class DatabasePostgres extends Database {
                parent::reportQueryError( $error, $errno, $sql, $fname, false );
        }
 
-       function queryIgnore( $sql, $fname = __METHOD__ ) {
-               return $this->query( $sql, $fname, true );
-       }
-
-       /**
-        * @param stdClass|ResultWrapper $res
-        * @throws DBUnexpectedError
-        */
-       function freeResult( $res ) {
+       public function freeResult( $res ) {
                if ( $res instanceof ResultWrapper ) {
                        $res = $res->result;
                }
@@ -267,12 +251,7 @@ class DatabasePostgres extends Database {
                }
        }
 
-       /**
-        * @param ResultWrapper|stdClass $res
-        * @return stdClass
-        * @throws DBUnexpectedError
-        */
-       function fetchObject( $res ) {
+       public function fetchObject( $res ) {
                if ( $res instanceof ResultWrapper ) {
                        $res = $res->result;
                }
@@ -294,7 +273,7 @@ class DatabasePostgres extends Database {
                return $row;
        }
 
-       function fetchRow( $res ) {
+       public function fetchRow( $res ) {
                if ( $res instanceof ResultWrapper ) {
                        $res = $res->result;
                }
@@ -313,7 +292,7 @@ class DatabasePostgres extends Database {
                return $row;
        }
 
-       function numRows( $res ) {
+       public function numRows( $res ) {
                if ( $res instanceof ResultWrapper ) {
                        $res = $res->result;
                }
@@ -332,7 +311,7 @@ class DatabasePostgres extends Database {
                return $n;
        }
 
-       function numFields( $res ) {
+       public function numFields( $res ) {
                if ( $res instanceof ResultWrapper ) {
                        $res = $res->result;
                }
@@ -340,7 +319,7 @@ class DatabasePostgres extends Database {
                return pg_num_fields( $res );
        }
 
-       function fieldName( $res, $n ) {
+       public function fieldName( $res, $n ) {
                if ( $res instanceof ResultWrapper ) {
                        $res = $res->result;
                }
@@ -354,16 +333,11 @@ class DatabasePostgres extends Database {
         *
         * @return int|null
         */
-       function insertId() {
+       public function insertId() {
                return $this->mInsertId;
        }
 
-       /**
-        * @param mixed $res
-        * @param int $row
-        * @return bool
-        */
-       function dataSeek( $res, $row ) {
+       public function dataSeek( $res, $row ) {
                if ( $res instanceof ResultWrapper ) {
                        $res = $res->result;
                }
@@ -371,7 +345,7 @@ class DatabasePostgres extends Database {
                return pg_result_seek( $res, $row );
        }
 
-       function lastError() {
+       public function lastError() {
                if ( $this->mConn ) {
                        if ( $this->mLastResult ) {
                                return pg_result_error( $this->mLastResult );
@@ -383,7 +357,7 @@ class DatabasePostgres extends Database {
                return $this->getLastPHPError() ?: 'No database connection';
        }
 
-       function lastErrno() {
+       public function lastErrno() {
                if ( $this->mLastResult ) {
                        return pg_result_error_field( $this->mLastResult, PGSQL_DIAG_SQLSTATE );
                } else {
@@ -391,7 +365,7 @@ class DatabasePostgres extends Database {
                }
        }
 
-       function affectedRows() {
+       public function affectedRows() {
                if ( !is_null( $this->mAffectedRows ) ) {
                        // Forced result for simulated queries
                        return $this->mAffectedRows;
@@ -417,7 +391,7 @@ class DatabasePostgres extends Database {
         * @param array $options
         * @return int
         */
-       function estimateRowCount( $table, $vars = '*', $conds = '',
+       public function estimateRowCount( $table, $vars = '*', $conds = '',
                $fname = __METHOD__, $options = []
        ) {
                $options['EXPLAIN'] = true;
@@ -434,16 +408,7 @@ class DatabasePostgres extends Database {
                return $rows;
        }
 
-       /**
-        * 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__ ) {
+       public function indexInfo( $table, $index, $fname = __METHOD__ ) {
                $sql = "SELECT indexname FROM pg_indexes WHERE tablename='$table'";
                $res = $this->query( $sql, $fname );
                if ( !$res ) {
@@ -458,15 +423,7 @@ class DatabasePostgres extends Database {
                return false;
        }
 
-       /**
-        * Returns is of attributes used in index
-        *
-        * @since 1.19
-        * @param string $index
-        * @param bool|string $schema
-        * @return array
-        */
-       function indexAttributes( $index, $schema = false ) {
+       public function indexAttributes( $index, $schema = false ) {
                if ( $schema === false ) {
                        $schema = $this->getCoreSchema();
                }
@@ -523,7 +480,7 @@ __INDEXATTR__;
                return $a;
        }
 
-       function indexUnique( $table, $index, $fname = __METHOD__ ) {
+       public function indexUnique( $table, $index, $fname = __METHOD__ ) {
                $sql = "SELECT indexname FROM pg_indexes WHERE tablename='{$table}'" .
                        " AND indexdef LIKE 'CREATE UNIQUE%(" .
                        $this->strencode( $this->indexName( $index ) ) .
@@ -536,7 +493,7 @@ __INDEXATTR__;
                return $res->numRows() > 0;
        }
 
-       function selectSQLText(
+       public function selectSQLText(
                $table, $vars, $conds = '', $fname = __METHOD__, $options = [], $join_conds = []
        ) {
                // Change the FOR UPDATE option as necessary based on the join conditions. Then pass
@@ -578,7 +535,7 @@ __INDEXATTR__;
         * @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 = [] ) {
+       public function insert( $table, $args, $fname = __METHOD__, $options = [] ) {
                if ( !count( $args ) ) {
                        return true;
                }
@@ -704,8 +661,10 @@ __INDEXATTR__;
         * @param array $selectOptions
         * @return bool
         */
-       function nativeInsertSelect( $destTable, $srcTable, $varMap, $conds, $fname = __METHOD__,
-               $insertOptions = [], $selectOptions = [] ) {
+       public function nativeInsertSelect(
+               $destTable, $srcTable, $varMap, $conds, $fname = __METHOD__,
+               $insertOptions = [], $selectOptions = []
+       ) {
                $destTable = $this->tableName( $destTable );
 
                if ( !is_array( $insertOptions ) ) {
@@ -767,30 +726,38 @@ __INDEXATTR__;
                return $res;
        }
 
-       function tableName( $name, $format = 'quoted' ) {
-               # Replace reserved words with better ones
-               switch ( $name ) {
-                       case 'user':
-                               return $this->realTableName( 'mwuser', $format );
-                       case 'text':
-                               return $this->realTableName( 'pagecontent', $format );
-                       default:
-                               return $this->realTableName( $name, $format );
-               }
-       }
+       public function tableName( $name, $format = 'quoted' ) {
+               // Replace reserved words with better ones
+               $name = $this->remappedTableName( $name );
 
-       /* Don't cheat on installer */
-       function realTableName( $name, $format = 'quoted' ) {
                return parent::tableName( $name, $format );
        }
 
        /**
-        * Return the next in a sequence, save the value for retrieval via insertId()
-        *
-        * @param string $seqName
-        * @return int|null
+        * @param string $name
+        * @return string Value of $name or remapped name if $name is a reserved keyword
+        * @TODO: dependency inject these...
+        */
+       public function remappedTableName( $name ) {
+               if ( $name === 'user' ) {
+                       return 'mwuser';
+               } elseif ( $name === 'text' ) {
+                       return 'pagecontent';
+               }
+
+               return $name;
+       }
+
+       /**
+        * @param string $name
+        * @param string $format
+        * @return string Qualified and encoded (if requested) table name
         */
-       function nextSequenceValue( $seqName ) {
+       public function realTableName( $name, $format = 'quoted' ) {
+               return parent::tableName( $name, $format );
+       }
+
+       public function nextSequenceValue( $seqName ) {
                $safeseq = str_replace( "'", "''", $seqName );
                $res = $this->query( "SELECT nextval('$safeseq')" );
                $row = $this->fetchRow( $res );
@@ -805,7 +772,7 @@ __INDEXATTR__;
         * @param string $seqName
         * @return int
         */
-       function currentSequenceValue( $seqName ) {
+       public function currentSequenceValue( $seqName ) {
                $safeseq = str_replace( "'", "''", $seqName );
                $res = $this->query( "SELECT currval('$safeseq')" );
                $row = $this->fetchRow( $res );
@@ -814,8 +781,7 @@ __INDEXATTR__;
                return $currval;
        }
 
-       # Returns the size of a text field, or -1 for "unlimited"
-       function textFieldSize( $table, $field ) {
+       public function textFieldSize( $table, $field ) {
                $table = $this->tableName( $table );
                $sql = "SELECT t.typname as ftype,a.atttypmod as size
                        FROM pg_class c, pg_attribute a, pg_type t
@@ -832,15 +798,15 @@ __INDEXATTR__;
                return $size;
        }
 
-       function limitResult( $sql, $limit, $offset = false ) {
+       public function limitResult( $sql, $limit, $offset = false ) {
                return "$sql LIMIT $limit " . ( is_numeric( $offset ) ? " OFFSET {$offset} " : '' );
        }
 
-       function wasDeadlock() {
+       public function wasDeadlock() {
                return $this->lastErrno() == '40P01';
        }
 
-       function duplicateTableStructure(
+       public function duplicateTableStructure(
                $oldName, $newName, $temporary = false, $fname = __METHOD__
        ) {
                $newName = $this->addIdentifierQuotes( $newName );
@@ -850,7 +816,7 @@ __INDEXATTR__;
                        "(LIKE $oldName INCLUDING DEFAULTS)", $fname );
        }
 
-       function listTables( $prefix = null, $fname = __METHOD__ ) {
+       public function listTables( $prefix = null, $fname = __METHOD__ ) {
                $eschema = $this->addQuotes( $this->getCoreSchema() );
                $result = $this->query(
                        "SELECT tablename FROM pg_tables WHERE schemaname = $eschema", $fname );
@@ -867,7 +833,7 @@ __INDEXATTR__;
                return $endArray;
        }
 
-       function timestamp( $ts = 0 ) {
+       public function timestamp( $ts = 0 ) {
                $ct = new ConvertibleTimestamp( $ts );
 
                return $ct->getTimestamp( TS_POSTGRES );
@@ -875,7 +841,7 @@ __INDEXATTR__;
 
        /**
         * Posted by cc[plus]php[at]c2se[dot]com on 25-Mar-2009 09:12
-        * to http://www.php.net/manual/en/ref.pgsql.php
+        * to https://secure.php.net/manual/en/ref.pgsql.php
         *
         * Parsing a postgres array can be a tricky problem, he's my
         * take on this, it handles multi-dimensional arrays plus
@@ -891,7 +857,7 @@ __INDEXATTR__;
         * @param int $offset
         * @return string
         */
-       function pg_array_parse( $text, &$output, $limit = false, $offset = 1 ) {
+       private function pg_array_parse( $text, &$output, $limit = false, $offset = 1 ) {
                if ( false === $limit ) {
                        $limit = strlen( $text ) - 1;
                        $output = [];
@@ -918,19 +884,10 @@ __INDEXATTR__;
                return $output;
        }
 
-       /**
-        * Return aggregated value function call
-        * @param array $valuedata
-        * @param string $valuename
-        * @return array
-        */
        public function aggregateValue( $valuedata, $valuename = 'value' ) {
                return $valuedata;
        }
 
-       /**
-        * @return string Wikitext of a link to the server software's web site
-        */
        public function getSoftwareLink() {
                return '[{{int:version-db-postgres-url}} PostgreSQL]';
        }
@@ -942,7 +899,7 @@ __INDEXATTR__;
         * @since 1.19
         * @return string Default schema for the current session
         */
-       function getCurrentSchema() {
+       public function getCurrentSchema() {
                $res = $this->query( "SELECT current_schema()", __METHOD__ );
                $row = $this->fetchRow( $res );
 
@@ -959,7 +916,7 @@ __INDEXATTR__;
         * @since 1.19
         * @return array List of actual schemas for the current sesson
         */
-       function getSchemas() {
+       public function getSchemas() {
                $res = $this->query( "SELECT current_schemas(false)", __METHOD__ );
                $row = $this->fetchRow( $res );
                $schemas = [];
@@ -978,7 +935,7 @@ __INDEXATTR__;
         * @since 1.19
         * @return array How to search for table names schemas for the current user
         */
-       function getSearchPath() {
+       public function getSearchPath() {
                $res = $this->query( "SHOW search_path", __METHOD__ );
                $row = $this->fetchRow( $res );
 
@@ -994,7 +951,7 @@ __INDEXATTR__;
         *
         * @param array $search_path List of schemas to be searched by default
         */
-       function setSearchPath( $search_path ) {
+       private function setSearchPath( $search_path ) {
                $this->query( "SET search_path = " . implode( ", ", $search_path ) );
        }
 
@@ -1012,7 +969,7 @@ __INDEXATTR__;
         *
         * @param string $desiredSchema
         */
-       function determineCoreSchema( $desiredSchema ) {
+       public function determineCoreSchema( $desiredSchema ) {
                $this->begin( __METHOD__, self::TRANSACTION_INTERNAL );
                if ( $this->schemaExists( $desiredSchema ) ) {
                        if ( in_array( $desiredSchema, $this->getSchemas() ) ) {
@@ -1049,14 +1006,11 @@ __INDEXATTR__;
         * @since 1.19
         * @return string Core schema name
         */
-       function getCoreSchema() {
+       public function getCoreSchema() {
                return $this->mCoreSchema;
        }
 
-       /**
-        * @return string Version information from the database
-        */
-       function getServerVersion() {
+       public function getServerVersion() {
                if ( !isset( $this->numericVersion ) ) {
                        $conn = $this->getBindingHandle();
                        $versionInfo = pg_version( $conn );
@@ -1083,14 +1037,13 @@ __INDEXATTR__;
         * @param bool|string $schema
         * @return bool
         */
-       function relationExists( $table, $types, $schema = false ) {
+       private function relationExists( $table, $types, $schema = false ) {
                if ( !is_array( $types ) ) {
                        $types = [ $types ];
                }
                if ( $schema === false ) {
                        $schema = $this->getCoreSchema();
                }
-               $table = $this->realTableName( $table, 'raw' );
                $etable = $this->addQuotes( $table );
                $eschema = $this->addQuotes( $schema );
                $sql = "SELECT 1 FROM pg_catalog.pg_class c, pg_catalog.pg_namespace n "
@@ -1103,22 +1056,21 @@ __INDEXATTR__;
        }
 
        /**
-        * For backward compatibility, this function checks both tables and
-        * views.
+        * 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 ) {
+       public function tableExists( $table, $fname = __METHOD__, $schema = false ) {
                return $this->relationExists( $table, [ 'r', 'v' ], $schema );
        }
 
-       function sequenceExists( $sequence, $schema = false ) {
+       public function sequenceExists( $sequence, $schema = false ) {
                return $this->relationExists( $sequence, 'S', $schema );
        }
 
-       function triggerExists( $table, $trigger ) {
+       public function triggerExists( $table, $trigger ) {
                $q = <<<SQL
        SELECT 1 FROM pg_class, pg_namespace, pg_trigger
                WHERE relnamespace=pg_namespace.oid AND relkind='r'
@@ -1141,7 +1093,7 @@ SQL;
                return $rows;
        }
 
-       function ruleExists( $table, $rule ) {
+       public function ruleExists( $table, $rule ) {
                $exists = $this->selectField( 'pg_rules', 'rulename',
                        [
                                'rulename' => $rule,
@@ -1153,7 +1105,7 @@ SQL;
                return $exists === $rule;
        }
 
-       function constraintExists( $table, $constraint ) {
+       public function constraintExists( $table, $constraint ) {
                $sql = sprintf( "SELECT 1 FROM information_schema.table_constraints " .
                        "WHERE constraint_schema = %s AND table_name = %s AND constraint_name = %s",
                        $this->addQuotes( $this->getCoreSchema() ),
@@ -1174,9 +1126,13 @@ SQL;
         * @param string $schema
         * @return bool
         */
-       function schemaExists( $schema ) {
-               $exists = $this->selectField( '"pg_catalog"."pg_namespace"', 1,
-                       [ 'nspname' => $schema ], __METHOD__ );
+       public function schemaExists( $schema ) {
+               if ( !strlen( $schema ) ) {
+                       return false; // short-circuit
+               }
+
+               $exists = $this->selectField(
+                       '"pg_catalog"."pg_namespace"', 1, [ 'nspname' => $schema ], __METHOD__ );
 
                return (bool)$exists;
        }
@@ -1186,7 +1142,7 @@ SQL;
         * @param string $roleName
         * @return bool
         */
-       function roleExists( $roleName ) {
+       public function roleExists( $roleName ) {
                $exists = $this->selectField( '"pg_catalog"."pg_roles"', 1,
                        [ 'rolname' => $roleName ], __METHOD__ );
 
@@ -1198,7 +1154,7 @@ SQL;
         * @var string $field
         * @return PostgresField|null
         */
-       function fieldInfo( $table, $field ) {
+       public function fieldInfo( $table, $field ) {
                return PostgresField::fromText( $this, $table, $field );
        }
 
@@ -1208,7 +1164,7 @@ SQL;
         * @param int $index Field number, starting from 0
         * @return string
         */
-       function fieldType( $res, $index ) {
+       public function fieldType( $res, $index ) {
                if ( $res instanceof ResultWrapper ) {
                        $res = $res->result;
                }
@@ -1216,15 +1172,11 @@ SQL;
                return pg_field_type( $res, $index );
        }
 
-       /**
-        * @param string $b
-        * @return Blob
-        */
-       function encodeBlob( $b ) {
+       public function encodeBlob( $b ) {
                return new PostgresBlob( pg_escape_bytea( $b ) );
        }
 
-       function decodeBlob( $b ) {
+       public function decodeBlob( $b ) {
                if ( $b instanceof PostgresBlob ) {
                        $b = $b->fetch();
                } elseif ( $b instanceof Blob ) {
@@ -1234,16 +1186,12 @@ SQL;
                return pg_unescape_bytea( $b );
        }
 
-       function strencode( $s ) {
+       public function strencode( $s ) {
                // Should not be called by us
                return pg_escape_string( $this->getBindingHandle(), $s );
        }
 
-       /**
-        * @param string|int|null|bool|Blob $s
-        * @return string|int
-        */
-       function addQuotes( $s ) {
+       public function addQuotes( $s ) {
                $conn = $this->getBindingHandle();
 
                if ( is_null( $s ) ) {
@@ -1284,14 +1232,7 @@ SQL;
                return $ins;
        }
 
-       /**
-        * Various select options
-        *
-        * @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 ) {
+       public function makeSelectOptions( $options ) {
                $preLimitTail = $postLimitTail = '';
                $startOpts = $useIndex = $ignoreIndex = '';
 
@@ -1326,15 +1267,15 @@ SQL;
                return [ $startOpts, $useIndex, $preLimitTail, $postLimitTail, $ignoreIndex ];
        }
 
-       function getDBname() {
+       public function getDBname() {
                return $this->mDBname;
        }
 
-       function getServer() {
+       public function getServer() {
                return $this->mServer;
        }
 
-       function buildConcat( $stringList ) {
+       public function buildConcat( $stringList ) {
                return implode( ' || ', $stringList );
        }
 
@@ -1346,11 +1287,6 @@ SQL;
                return '(' . $this->selectSQLText( $table, $fld, $conds, null, [], $join_conds ) . ')';
        }
 
-       /**
-        * @param string $field Field or column to cast
-        * @return string
-        * @since 1.28
-        */
        public function buildStringCast( $field ) {
                return $field . '::text';
        }
@@ -1368,16 +1304,8 @@ SQL;
                return parent::streamStatementEnd( $sql, $newLine );
        }
 
-       /**
-        * 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 bool
-        * @since 1.20
-        */
        public function lockIsFree( $lockName, $method ) {
+               // http://www.postgresql.org/docs/8.2/static/functions-admin.html#FUNCTIONS-ADVISORY-LOCKS
                $key = $this->addQuotes( $this->bigintFromLockName( $lockName ) );
                $result = $this->query( "SELECT (CASE(pg_try_advisory_lock($key))
                        WHEN 'f' THEN 'f' ELSE pg_advisory_unlock($key) END) AS lockstatus", $method );
@@ -1386,14 +1314,8 @@ SQL;
                return ( $row->lockstatus === 't' );
        }
 
-       /**
-        * See http://www.postgresql.org/docs/8.2/static/functions-admin.html#FUNCTIONS-ADVISORY-LOCKS
-        * @param string $lockName
-        * @param string $method
-        * @param int $timeout
-        * @return bool
-        */
        public function lock( $lockName, $method, $timeout = 5 ) {
+               // http://www.postgresql.org/docs/8.2/static/functions-admin.html#FUNCTIONS-ADVISORY-LOCKS
                $key = $this->addQuotes( $this->bigintFromLockName( $lockName ) );
                $loop = new WaitConditionLoop(
                        function () use ( $lockName, $key, $timeout, $method ) {
@@ -1412,14 +1334,8 @@ SQL;
                return ( $loop->invoke() === $loop::CONDITION_REACHED );
        }
 
-       /**
-        * 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 string $lockName
-        * @param string $method
-        * @return bool
-        */
        public function unlock( $lockName, $method ) {
+               // http://www.postgresql.org/docs/8.2/static/functions-admin.html#FUNCTIONS-ADVISORY-LOCKS
                $key = $this->addQuotes( $this->bigintFromLockName( $lockName ) );
                $result = $this->query( "SELECT pg_advisory_unlock($key) as lockstatus", $method );
                $row = $this->fetchObject( $result );
index 46f7a5b..7317d54 100644 (file)
@@ -196,6 +196,10 @@ class DatabaseSqlite extends Database {
                return false;
        }
 
+       public function selectDB( $db ) {
+               return false; // doesn't make sense
+       }
+
        /**
         * @return string SQLite DB file path
         * @since 1.25
@@ -264,7 +268,7 @@ class DatabaseSqlite extends Database {
        }
 
        /**
-        * Attaches external database to our connection, see http://sqlite.org/lang_attach.html
+        * Attaches external database to our connection, see https://sqlite.org/lang_attach.html
         * for details.
         *
         * @param string $name Database name to be used in queries like
index c80fdec..48d76c4 100644 (file)
@@ -386,7 +386,7 @@ interface IDatabase {
 
        /**
         * Get the number of fields in a result object
-        * @see http://www.php.net/mysql_num_fields
+        * @see https://secure.php.net/mysql_num_fields
         *
         * @param mixed $res A SQL result
         * @return int
@@ -395,7 +395,7 @@ interface IDatabase {
 
        /**
         * Get a field name in a result object
-        * @see http://www.php.net/mysql_field_name
+        * @see https://secure.php.net/mysql_field_name
         *
         * @param mixed $res A SQL result
         * @param int $n
@@ -419,7 +419,7 @@ interface IDatabase {
 
        /**
         * Change the position of the cursor in a result object
-        * @see http://www.php.net/mysql_data_seek
+        * @see https://secure.php.net/mysql_data_seek
         *
         * @param mixed $res A SQL result
         * @param int $row
@@ -428,7 +428,7 @@ interface IDatabase {
 
        /**
         * Get the last error number
-        * @see http://www.php.net/mysql_errno
+        * @see https://secure.php.net/mysql_errno
         *
         * @return int
         */
@@ -436,7 +436,7 @@ interface IDatabase {
 
        /**
         * Get a description of the last error
-        * @see http://www.php.net/mysql_error
+        * @see https://secure.php.net/mysql_error
         *
         * @return string
         */
@@ -455,7 +455,7 @@ interface IDatabase {
 
        /**
         * Get the number of rows affected by the last write query
-        * @see http://www.php.net/mysql_affected_rows
+        * @see https://secure.php.net/mysql_affected_rows
         *
         * @return int
         */
@@ -463,7 +463,7 @@ interface IDatabase {
 
        /**
         * Returns a wikitext link to the DB's website, e.g.,
-        *   return "[http://www.mysql.com/ MySQL]";
+        *   return "[https://www.mysql.com/ MySQL]";
         * Should at least contain plain text, if for some reason
         * your database has no website.
         *
@@ -1088,7 +1088,7 @@ interface IDatabase {
         *
         * 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.
+        * See https://bugs.mysql.com/bug.php?id=30767 for details.
         * @param string $seqName
         * @return null|int
         */
@@ -1633,7 +1633,7 @@ interface IDatabase {
         * IDatabase::insert().
         *
         * @param string $b
-        * @return string
+        * @return string|Blob
         */
        public function encodeBlob( $b );
 
index 71fbe7e..7b49ce9 100644 (file)
@@ -117,8 +117,8 @@ class MySQLMasterPos implements DBMasterPos {
        }
 
        /**
-        * @see http://dev.mysql.com/doc/refman/5.7/en/show-master-status.html
-        * @see http://dev.mysql.com/doc/refman/5.7/en/show-slave-status.html
+        * @see https://dev.mysql.com/doc/refman/5.7/en/show-master-status.html
+        * @see https://dev.mysql.com/doc/refman/5.7/en/show-slave-status.html
         * @return array|bool (binlog, (integer file number, integer position)) or false
         */
        protected function getBinlogCoordinates() {
index ec4d09f..8ae78e9 100644 (file)
@@ -47,7 +47,7 @@ class SavepointPostgres {
                $this->didbegin = false;
                /* If we are not in a transaction, we need to be for savepoint trickery */
                if ( !$dbw->trxLevel() ) {
-                       $dbw->begin( "FOR SAVEPOINT", DatabasePostgres::TRANSACTION_INTERNAL );
+                       $dbw->begin( __CLASS__, DatabasePostgres::TRANSACTION_INTERNAL );
                        $this->didbegin = true;
                }
        }
@@ -61,7 +61,7 @@ class SavepointPostgres {
 
        public function commit() {
                if ( $this->didbegin ) {
-                       $this->dbw->commit();
+                       $this->dbw->commit( __CLASS__, DatabasePostgres::FLUSHING_INTERNAL );
                        $this->didbegin = false;
                }
        }
index c00082c..864dea0 100644 (file)
@@ -25,6 +25,6 @@
  */
 class DBAccessError extends DBUnexpectedError {
        public function __construct() {
-               parent::__construct( "Database access has been disabled." );
+               parent::__construct( null, "Database access has been disabled." );
        }
 }
index 36337e2..d34c125 100644 (file)
@@ -9,7 +9,7 @@ class PostgresField implements Field {
         * @param string $field
         * @return null|PostgresField
         */
-       static function fromText( $db, $table, $field ) {
+       static function fromText( DatabasePostgres $db, $table, $field ) {
                $q = <<<SQL
 SELECT
  attnotnull, attlen, conname AS conname,
@@ -34,7 +34,7 @@ AND relname=%s
 AND attname=%s;
 SQL;
 
-               $table = $db->tableName( $table, 'raw' );
+               $table = $db->remappedTableName( $table );
                $res = $db->query(
                        sprintf( $q,
                                $db->addQuotes( $db->getCoreSchema() ),
index ff1bd43..5288c24 100644 (file)
@@ -106,6 +106,22 @@ interface ILBFactory {
         */
        public function getExternalLB( $cluster );
 
+       /**
+        * Get cached (tracked) load balancers for all main database clusters
+        *
+        * @return LoadBalancer[] Map of (cluster name => LoadBalancer)
+        * @since 1.29
+        */
+       public function getAllMainLBs();
+
+       /**
+        * Get cached (tracked) load balancers for all external database clusters
+        *
+        * @return LoadBalancer[] Map of (cluster name => LoadBalancer)
+        * @since 1.29
+        */
+       public function getAllExternalLBs();
+
        /**
         * Execute a function for each tracked load balancer
         * The callback is called with the load balancer as the first parameter,
index d21289b..15a5c0d 100644 (file)
@@ -355,6 +355,7 @@ abstract class LBFactory implements ILBFactory {
 
                if ( $failed ) {
                        throw new DBReplicationWaitError(
+                               null,
                                "Could not wait for replica DBs to catch up to " .
                                implode( ', ', $failed )
                        );
@@ -554,7 +555,7 @@ abstract class LBFactory implements ILBFactory {
         * @return ScopedCallback|null
         */
        final protected function getScopedPHPBehaviorForCommit() {
-               if ( PHP_SAPI != 'cli' ) { // http://bugs.php.net/bug.php?id=47540
+               if ( PHP_SAPI != 'cli' ) { // https://bugs.php.net/bug.php?id=47540
                        $old = ignore_user_abort( true ); // avoid half-finished operations
                        return new ScopedCallback( function () use ( $old ) {
                                ignore_user_abort( $old );
index a7cc16c..1d22873 100644 (file)
@@ -284,6 +284,26 @@ class LBFactoryMulti extends LBFactory {
                return $this->extLBs[$cluster];
        }
 
+       public function getAllMainLBs() {
+               $lbs = [];
+               foreach ( $this->sectionsByDB as $db => $section ) {
+                       if ( !isset( $lbs[$section] ) ) {
+                               $lbs[$section] = $this->getMainLB( $db );
+                       }
+               }
+
+               return $lbs;
+       }
+
+       public function getAllExternalLBs() {
+               $lbs = [];
+               foreach ( $this->externalLoads as $cluster => $unused ) {
+                       $lbs[$cluster] = $this->getExternalLB( $cluster );
+               }
+
+               return $lbs;
+       }
+
        /**
         * Make a new load balancer object based on template and load array
         *
index 1e69d8f..5bf5032 100644 (file)
@@ -108,6 +108,19 @@ class LBFactorySimple extends LBFactory {
                return $this->extLBs[$cluster];
        }
 
+       public function getAllMainLBs() {
+               return [ 'DEFAULT' => $this->getMainLB() ];
+       }
+
+       public function getAllExternalLBs() {
+               $lbs = [];
+               foreach ( $this->externalClusters as $cluster => $unused ) {
+                       $lbs[$cluster] = $this->getExternalLB( $cluster );
+               }
+
+               return $lbs;
+       }
+
        private function newLoadBalancer( array $servers ) {
                $lb = new LoadBalancer( array_merge(
                        $this->baseLoadBalancerParams(),
index e116888..819375d 100644 (file)
@@ -70,20 +70,26 @@ class LBFactorySingle extends LBFactory {
                return $this->lb;
        }
 
+       public function newExternalLB( $cluster ) {
+               throw new BadMethodCallException( "Method is not supported." );
+       }
+
+       public function getExternalLB( $cluster ) {
+               throw new BadMethodCallException( "Method is not supported." );
+       }
+
        /**
-        * @param string $cluster External storage cluster name (unused)
-        * @return LoadBalancerSingle
+        * @return LoadBalancerSingle[] Map of (cluster name => LoadBalancer)
         */
-       public function newExternalLB( $cluster ) {
-               return $this->lb;
+       public function getAllMainLBs() {
+               return [ 'DEFAULT' => $this->lb ];
        }
 
        /**
-        * @param string $cluster External storage cluster name (unused)
-        * @return LoadBalancerSingle
+        * @return LoadBalancerSingle[] Map of (cluster name => LoadBalancer)
         */
-       public function getExternalLB( $cluster ) {
-               return $this->lb;
+       public function getAllExternalLBs() {
+               return [];
        }
 
        /**
index a86e1de..d42fed9 100644 (file)
@@ -1529,7 +1529,7 @@ class LoadBalancer implements ILoadBalancer {
         * @return ScopedCallback|null
         */
        final protected function getScopedPHPBehaviorForCommit() {
-               if ( PHP_SAPI != 'cli' ) { // http://bugs.php.net/bug.php?id=47540
+               if ( PHP_SAPI != 'cli' ) { // https://bugs.php.net/bug.php?id=47540
                        $old = ignore_user_abort( true ); // avoid half-finished operations
                        return new ScopedCallback( function () use ( $old ) {
                                ignore_user_abort( $old );
index babd609..45b1d83 100644 (file)
@@ -52,7 +52,7 @@ class LoadMonitorMySQL extends LoadMonitor {
                                $host = $this->parent->getServerName( $index );
                                $this->replLogger->error( __METHOD__ . ": could not get status for $host" );
                        } else {
-                               // http://dev.mysql.com/doc/refman/5.7/en/server-status-variables.html
+                               // https://dev.mysql.com/doc/refman/5.7/en/server-status-variables.html
                                if ( $s->Innodb_buffer_pool_pages_total > 0 ) {
                                        $ratio = $s->Innodb_buffer_pool_pages_data / $s->Innodb_buffer_pool_pages_total;
                                } elseif ( $s->Qcache_total_blocks > 0 ) {
index b02985a..c830b4e 100644 (file)
@@ -90,7 +90,7 @@ class ConvertibleTimestamp {
                        # TS_MW
                } elseif ( preg_match( '/^(-?\d{1,13})(\.\d+)?$/D', $ts, $m ) ) {
                        # TS_UNIX
-                       $strtime = "@{$m[1]}"; // http://php.net/manual/en/datetime.formats.compound.php
+                       $strtime = "@{$m[1]}"; // https://secure.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",
index da47d35..a148a39 100644 (file)
@@ -103,7 +103,6 @@ class ParsoidVirtualRESTService extends VirtualRESTService {
                                continue;
                        }
                        if ( $targetWiki !== 'local' ) {
-
                                throw new Exception( "Only 'local' target wiki is currently supported" );
                        }
                        if ( $reqType !== 'page' && $reqType !== 'transform' ) {
@@ -150,7 +149,6 @@ class ParsoidVirtualRESTService extends VirtualRESTService {
         * API.  We now translate these to the "real" Parsoid v3 API.
         */
        public function onParsoid1Request( array $req, Closure $idGeneratorFunc ) {
-
                $parts = explode( '/', $req['url'] );
                list(
                        $targetWiki, // 'local'
@@ -221,7 +219,6 @@ class ParsoidVirtualRESTService extends VirtualRESTService {
                }
 
                return $req;
-
        }
 
 }
index 3afbaa3..35c45de 100644 (file)
@@ -78,7 +78,6 @@ class RestbaseVirtualRESTService extends VirtualRESTService {
        }
 
        public function onRequests( array $reqs, Closure $idGenFunc ) {
-
                if ( $this->params['parsoidCompat'] ) {
                        return $this->onParsoidRequests( $reqs, $idGenFunc );
                }
@@ -117,7 +116,6 @@ class RestbaseVirtualRESTService extends VirtualRESTService {
         * Remaps Parsoid v1/v3 requests to RESTBase v1 requests.
         */
        public function onParsoidRequests( array $reqs, Closure $idGeneratorFunc ) {
-
                $result = [];
                foreach ( $reqs as $key => $req ) {
                        $version = explode( '/', $req['url'] )[1];
@@ -131,7 +129,6 @@ class RestbaseVirtualRESTService extends VirtualRESTService {
                }
 
                return $result;
-
        }
 
        /**
@@ -223,7 +220,6 @@ class RestbaseVirtualRESTService extends VirtualRESTService {
                }
 
                return $req;
-
        }
 
        /**
@@ -241,7 +237,6 @@ class RestbaseVirtualRESTService extends VirtualRESTService {
         *   * $revision is optional
         */
        public function onParsoid3Request( array $req, Closure $idGeneratorFunc ) {
-
                $parts = explode( '/', $req['url'] );
                list(
                        $targetWiki, // 'local'
@@ -272,7 +267,6 @@ class RestbaseVirtualRESTService extends VirtualRESTService {
                }
 
                return $req;
-
        }
 
 }
index 1059d7b..c8e9999 100644 (file)
@@ -283,7 +283,7 @@ class UserMailer {
                        ->getFullURL( '', false, PROTO_CANONICAL ) . '>';
 
                // Line endings need to be different on Unix and Windows due to
-               // the bug described at http://trac.wordpress.org/ticket/2603
+               // the bug described at https://core.trac.wordpress.org/ticket/2603
                $endl = PHP_EOL;
 
                if ( is_array( $body ) ) {
index ed361eb..5e8f8c8 100644 (file)
@@ -254,7 +254,7 @@ class DjVuImage {
 
                if ( isset( $wgDjvuDump ) ) {
                        # djvudump is faster as of version 3.5
-                       # http://sourceforge.net/tracker/index.php?func=detail&aid=1704049&group_id=32953&atid=406583
+                       # https://sourceforge.net/p/djvu/bugs/71/
                        $cmd = wfEscapeShellArg( $wgDjvuDump ) . ' ' . wfEscapeShellArg( $this->mFilename );
                        $dump = wfShellExec( $cmd );
                        $xml = $this->convertDumpToXML( $dump );
index 78b0296..51a0135 100644 (file)
@@ -102,7 +102,6 @@ class FormatMetadata extends ContextSource {
                unset( $tags['ResolutionUnit'] );
 
                foreach ( $tags as $tag => &$vals ) {
-
                        // This seems ugly to wrap non-array's in an array just to unwrap again,
                        // especially when most of the time it is not an array
                        if ( !is_array( $tags[$tag] ) ) {
@@ -165,7 +164,6 @@ class FormatMetadata extends ContextSource {
                        }
 
                        foreach ( $vals as &$val ) {
-
                                switch ( $tag ) {
                                        case 'Compression':
                                                switch ( $val ) {
@@ -866,6 +864,7 @@ class FormatMetadata extends ContextSource {
                                        // are included here as we really don't want
                                        // commas inserted.
                                        case 'ImageDescription':
+                                       case 'UserComment':
                                        case 'Artist':
                                        case 'Copyright':
                                        case 'RelatedSoundFile':
@@ -1682,7 +1681,6 @@ class FormatMetadata extends ContextSource {
        protected function getExtendedMetadataFromHook( File $file, array $extendedMetadata,
                &$maxCacheTime
        ) {
-
                Hooks::run( 'GetExtendedMetadata', [
                        &$extendedMetadata,
                        $file,
@@ -1806,7 +1804,6 @@ class FormatMetadata extends ContextSource {
                                $field['value'] = $this->resolveMultivalueValue( $field['value'] );
                        }
                }
-
        }
 
        /**
index 4bc36ba..2a735a2 100644 (file)
@@ -104,7 +104,7 @@ abstract class MediaHandler {
         *   Warning, FSFile::getPropsFromPath might pass an FSFile instead of File (!)
         * @param string $path The filename
         * @return array|bool Follow the format of PHP getimagesize() internal function.
-        *   See http://www.php.net/getimagesize. MediaWiki will only ever use the
+        *   See https://secure.php.net/getimagesize. MediaWiki will only ever use the
         *   first two array keys (the width and height), and the 'bits' associative
         *   key. All other array keys are ignored. Returning a 'bits' key is optional
         *   as not all formats have a notion of "bitdepth". Returns false on failure.
index f4f29dd..d0517d7 100644 (file)
@@ -47,7 +47,7 @@ class PNGMetadataExtractor {
                self::$pngSig = pack( "C8", 137, 80, 78, 71, 13, 10, 26, 10 );
                self::$crcSize = 4;
                /* based on list at http://owl.phy.queensu.ca/~phil/exiftool/TagNames/PNG.html#TextualData
-                * and http://www.w3.org/TR/PNG/#11keywords
+                * and https://www.w3.org/TR/PNG/#11keywords
                 */
                self::$textChunks = [
                        'xml:com.adobe.xmp' => 'xmp',
@@ -123,7 +123,7 @@ class PNGMetadataExtractor {
                                }
                                $bitDepth = ord( substr( $buf, 8, 1 ) );
                                // Detect the color type in British English as per the spec
-                               // http://www.w3.org/TR/PNG/#11IHDR
+                               // https://www.w3.org/TR/PNG/#11IHDR
                                switch ( ord( substr( $buf, 9, 1 ) ) ) {
                                        case 0:
                                                $colorType = 'greyscale';
index 62b5c2c..6a974c7 100644 (file)
@@ -264,7 +264,7 @@ class SVGReader {
                        ) {
                                $sysLang = $this->reader->getAttribute( 'systemLanguage' );
                                if ( !is_null( $sysLang ) && $sysLang !== '' ) {
-                                       // See http://www.w3.org/TR/SVG/struct.html#SystemLanguageAttribute
+                                       // See https://www.w3.org/TR/SVG/struct.html#SystemLanguageAttribute
                                        $langList = explode( ',', $sysLang );
                                        foreach ( $langList as $langItem ) {
                                                $langItem = trim( $langItem );
@@ -369,7 +369,7 @@ class SVGReader {
 
        /**
         * Return a rounded pixel equivalent for a labeled CSS/SVG length.
-        * http://www.w3.org/TR/SVG11/coords.html#UnitIdentifiers
+        * https://www.w3.org/TR/SVG11/coords.html#Units
         *
         * @param string $length CSS/SVG length.
         * @param float|int $viewportSize Optional scale for percentage units...
index 108d6fb..c419524 100644 (file)
@@ -67,7 +67,7 @@ class XCFHandler extends BitmapHandler {
                }
 
                # Forge a return array containing metadata information just like getimagesize()
-               # See PHP documentation at: http://www.php.net/getimagesize
+               # See PHP documentation at: https://secure.php.net/getimagesize
                return [
                        0 => $header['width'],
                        1 => $header['height'],
index 15f5238..9a2a8e2 100644 (file)
@@ -1184,10 +1184,6 @@ class Article implements Page {
                        return false;
                }
 
-               $rcid = $rc->getAttribute( 'rc_id' );
-
-               $token = $user->getEditToken( $rcid );
-
                $outputPage->preventClickjacking();
                if ( $wgEnableAPI && $wgEnableWriteAPI && $user->isAllowed( 'writeapi' ) ) {
                        $outputPage->addModules( 'mediawiki.page.patrol.ajax' );
@@ -1199,8 +1195,7 @@ class Article implements Page {
                        [],
                        [
                                'action' => 'markpatrolled',
-                               'rcid' => $rcid,
-                               'token' => $token,
+                               'rcid' => $rc->getAttribute( 'rc_id' ),
                        ]
                );
 
index af77868..db3ec14 100644 (file)
@@ -215,7 +215,6 @@ class ImagePage extends Article {
                        'filepage', // always show the local local Filepage.css, bug 29277
                        'mediawiki.action.view.filepage', // Add MediaWiki styles for a file page
                ] );
-
        }
 
        /**
index 54bc6f6..a5ac78f 100644 (file)
@@ -624,7 +624,7 @@ class WikiPage implements Page, IDBAccessObject {
                        // SELECT. Thus we need S1 to also gets the revision row FOR UPDATE; otherwise, it
                        // may not find it since a page row UPDATE and revision row INSERT by S2 may have
                        // happened after the first S1 SELECT.
-                       // http://dev.mysql.com/doc/refman/5.0/en/set-transaction.html#isolevel_repeatable-read
+                       // https://dev.mysql.com/doc/refman/5.0/en/set-transaction.html#isolevel_repeatable-read
                        $flags = Revision::READ_LOCKING;
                        $revision = Revision::newFromPageId( $this->getId(), $latest, $flags );
                } elseif ( $this->mDataLoadedFrom == self::READ_LATEST ) {
@@ -2485,13 +2485,13 @@ class WikiPage implements Page, IDBAccessObject {
                }
 
                if ( !$protect ) { // No protection at all means unprotection
-                       $revCommentMsg = 'unprotectedarticle';
+                       $revCommentMsg = 'unprotectedarticle-comment';
                        $logAction = 'unprotect';
                } elseif ( $isProtected ) {
-                       $revCommentMsg = 'modifiedarticleprotection';
+                       $revCommentMsg = 'modifiedarticleprotection-comment';
                        $logAction = 'modify';
                } else {
-                       $revCommentMsg = 'protectedarticle';
+                       $revCommentMsg = 'protectedarticle-comment';
                        $logAction = 'protect';
                }
 
@@ -2675,16 +2675,14 @@ class WikiPage implements Page, IDBAccessObject {
        public function insertProtectNullRevision( $revCommentMsg, array $limit,
                array $expiry, $cascade, $reason, $user = null
        ) {
-               global $wgContLang;
                $dbw = wfGetDB( DB_MASTER );
 
                // Prepare a null revision to be added to the history
-               $editComment = $wgContLang->ucfirst(
-                       wfMessage(
-                               $revCommentMsg,
-                               $this->mTitle->getPrefixedText()
-                       )->inContentLanguage()->text()
-               );
+               $editComment = wfMessage(
+                       $revCommentMsg,
+                       $this->mTitle->getPrefixedText(),
+                       $user ? $user->getName() : ''
+               )->inContentLanguage()->text();
                if ( $reason ) {
                        $editComment .= wfMessage( 'colon-separator' )->inContentLanguage()->text() . $reason;
                }
@@ -2926,17 +2924,13 @@ class WikiPage implements Page, IDBAccessObject {
                        $content = null;
                }
 
+               $fields = Revision::selectFields();
+               $bitfield = false;
+
                // Bitfields to further suppress the content
                if ( $suppress ) {
-                       $bitfield = 0;
-                       // This should be 15...
-                       $bitfield |= Revision::DELETED_TEXT;
-                       $bitfield |= Revision::DELETED_COMMENT;
-                       $bitfield |= Revision::DELETED_USER;
-                       $bitfield |= Revision::DELETED_RESTRICTED;
-                       $deletionFields = [ $dbw->addQuotes( $bitfield ) . ' AS deleted' ];
-               } else {
-                       $deletionFields = [ 'rev_deleted AS deleted' ];
+                       $bitfield = Revision::SUPPRESSED_ALL;
+                       $fields = array_diff( $fields, [ 'rev_deleted' ] );
                }
 
                // For now, shunt the revision data into the archive table.
@@ -2947,10 +2941,9 @@ class WikiPage implements Page, IDBAccessObject {
                // the rev_deleted field, which is reserved for this purpose.
 
                // Get all of the page revisions
-               $fields = array_diff( Revision::selectFields(), [ 'rev_deleted' ] );
                $res = $dbw->select(
                        'revision',
-                       array_merge( $fields, $deletionFields ),
+                       $fields,
                        [ 'rev_page' => $id ],
                        __METHOD__,
                        'FOR UPDATE'
@@ -2973,7 +2966,7 @@ class WikiPage implements Page, IDBAccessObject {
                                'ar_flags'      => '',
                                'ar_len'        => $row->rev_len,
                                'ar_page_id'    => $id,
-                               'ar_deleted'    => $row->deleted,
+                               'ar_deleted'    => $suppress ? $bitfield : $row->rev_deleted,
                                'ar_sha1'       => $row->rev_sha1,
                        ];
                        if ( $wgContentHandlerUseDB ) {
@@ -3556,107 +3549,103 @@ class WikiPage implements Page, IDBAccessObject {
         * Update all the appropriate counts in the category table, given that
         * we've added the categories $added and deleted the categories $deleted.
         *
+        * This should only be called from deferred updates or jobs to avoid contention.
+        *
         * @param array $added The names of categories that were added
         * @param array $deleted The names of categories that were deleted
         * @param integer $id Page ID (this should be the original deleted page ID)
         */
        public function updateCategoryCounts( array $added, array $deleted, $id = 0 ) {
                $id = $id ?: $this->getId();
+               $ns = $this->getTitle()->getNamespace();
+
+               $addFields = [ 'cat_pages = cat_pages + 1' ];
+               $removeFields = [ 'cat_pages = cat_pages - 1' ];
+               if ( $ns == NS_CATEGORY ) {
+                       $addFields[] = 'cat_subcats = cat_subcats + 1';
+                       $removeFields[] = 'cat_subcats = cat_subcats - 1';
+               } elseif ( $ns == NS_FILE ) {
+                       $addFields[] = 'cat_files = cat_files + 1';
+                       $removeFields[] = 'cat_files = cat_files - 1';
+               }
+
                $dbw = wfGetDB( DB_MASTER );
-               $method = __METHOD__;
-               // Do this at the end of the commit to reduce lock wait timeouts
-               $dbw->onTransactionPreCommitOrIdle(
-                       function () use ( $dbw, $added, $deleted, $id, $method ) {
-                               $ns = $this->getTitle()->getNamespace();
-
-                               $addFields = [ 'cat_pages = cat_pages + 1' ];
-                               $removeFields = [ 'cat_pages = cat_pages - 1' ];
-                               if ( $ns == NS_CATEGORY ) {
-                                       $addFields[] = 'cat_subcats = cat_subcats + 1';
-                                       $removeFields[] = 'cat_subcats = cat_subcats - 1';
-                               } elseif ( $ns == NS_FILE ) {
-                                       $addFields[] = 'cat_files = cat_files + 1';
-                                       $removeFields[] = 'cat_files = cat_files - 1';
-                               }
 
-                               if ( count( $added ) ) {
-                                       $existingAdded = $dbw->selectFieldValues(
-                                               'category',
-                                               'cat_title',
-                                               [ 'cat_title' => $added ],
-                                               $method
-                                       );
+               if ( count( $added ) ) {
+                       $existingAdded = $dbw->selectFieldValues(
+                               'category',
+                               'cat_title',
+                               [ 'cat_title' => $added ],
+                               __METHOD__
+                       );
 
-                                       // For category rows that already exist, do a plain
-                                       // UPDATE instead of INSERT...ON DUPLICATE KEY UPDATE
-                                       // to avoid creating gaps in the cat_id sequence.
-                                       if ( count( $existingAdded ) ) {
-                                               $dbw->update(
-                                                       'category',
-                                                       $addFields,
-                                                       [ 'cat_title' => $existingAdded ],
-                                                       $method
-                                               );
-                                       }
+                       // For category rows that already exist, do a plain
+                       // UPDATE instead of INSERT...ON DUPLICATE KEY UPDATE
+                       // to avoid creating gaps in the cat_id sequence.
+                       if ( count( $existingAdded ) ) {
+                               $dbw->update(
+                                       'category',
+                                       $addFields,
+                                       [ 'cat_title' => $existingAdded ],
+                                       __METHOD__
+                               );
+                       }
 
-                                       $missingAdded = array_diff( $added, $existingAdded );
-                                       if ( count( $missingAdded ) ) {
-                                               $insertRows = [];
-                                               foreach ( $missingAdded as $cat ) {
-                                                       $insertRows[] = [
-                                                               'cat_title'   => $cat,
-                                                               'cat_pages'   => 1,
-                                                               'cat_subcats' => ( $ns == NS_CATEGORY ) ? 1 : 0,
-                                                               'cat_files'   => ( $ns == NS_FILE ) ? 1 : 0,
-                                                       ];
-                                               }
-                                               $dbw->upsert(
-                                                       'category',
-                                                       $insertRows,
-                                                       [ 'cat_title' ],
-                                                       $addFields,
-                                                       $method
-                                               );
-                                       }
+                       $missingAdded = array_diff( $added, $existingAdded );
+                       if ( count( $missingAdded ) ) {
+                               $insertRows = [];
+                               foreach ( $missingAdded as $cat ) {
+                                       $insertRows[] = [
+                                               'cat_title'   => $cat,
+                                               'cat_pages'   => 1,
+                                               'cat_subcats' => ( $ns == NS_CATEGORY ) ? 1 : 0,
+                                               'cat_files'   => ( $ns == NS_FILE ) ? 1 : 0,
+                                       ];
                                }
+                               $dbw->upsert(
+                                       'category',
+                                       $insertRows,
+                                       [ 'cat_title' ],
+                                       $addFields,
+                                       __METHOD__
+                               );
+                       }
+               }
 
-                               if ( count( $deleted ) ) {
-                                       $dbw->update(
-                                               'category',
-                                               $removeFields,
-                                               [ 'cat_title' => $deleted ],
-                                               $method
-                                       );
-                               }
+               if ( count( $deleted ) ) {
+                       $dbw->update(
+                               'category',
+                               $removeFields,
+                               [ 'cat_title' => $deleted ],
+                               __METHOD__
+                       );
+               }
 
-                               foreach ( $added as $catName ) {
-                                       $cat = Category::newFromName( $catName );
-                                       Hooks::run( 'CategoryAfterPageAdded', [ $cat, $this ] );
-                               }
+               foreach ( $added as $catName ) {
+                       $cat = Category::newFromName( $catName );
+                       Hooks::run( 'CategoryAfterPageAdded', [ $cat, $this ] );
+               }
 
-                               foreach ( $deleted as $catName ) {
-                                       $cat = Category::newFromName( $catName );
-                                       Hooks::run( 'CategoryAfterPageRemoved', [ $cat, $this, $id ] );
-                               }
+               foreach ( $deleted as $catName ) {
+                       $cat = Category::newFromName( $catName );
+                       Hooks::run( 'CategoryAfterPageRemoved', [ $cat, $this, $id ] );
+               }
 
-                               // Refresh counts on categories that should be empty now, to
-                               // trigger possible deletion. Check master for the most
-                               // up-to-date cat_pages.
-                               if ( count( $deleted ) ) {
-                                       $rows = $dbw->select(
-                                               'category',
-                                               [ 'cat_id', 'cat_title', 'cat_pages', 'cat_subcats', 'cat_files' ],
-                                               [ 'cat_title' => $deleted, 'cat_pages <= 0' ],
-                                               $method
-                                       );
-                                       foreach ( $rows as $row ) {
-                                               $cat = Category::newFromRow( $row );
-                                               $cat->refreshCounts();
-                                       }
-                               }
-                       },
-                       __METHOD__
-               );
+               // Refresh counts on categories that should be empty now, to
+               // trigger possible deletion. Check master for the most
+               // up-to-date cat_pages.
+               if ( count( $deleted ) ) {
+                       $rows = $dbw->select(
+                               'category',
+                               [ 'cat_id', 'cat_title', 'cat_pages', 'cat_subcats', 'cat_files' ],
+                               [ 'cat_title' => $deleted, 'cat_pages <= 0' ],
+                               __METHOD__
+                       );
+                       foreach ( $rows as $row ) {
+                               $cat = Category::newFromRow( $row );
+                               $cat->refreshCounts();
+                       }
+               }
        }
 
        /**
index 4895b4f..6f325c9 100644 (file)
@@ -80,7 +80,7 @@ abstract class ReverseChronologicalPager extends IndexPager {
 
                // If year and month are false, don't update the mOffset
                if ( !$this->mYear && !$this->mMonth ) {
-                       return;
+                       return null;
                }
 
                // Given an optional year, month, and day, we need to generate a timestamp
@@ -150,7 +150,13 @@ abstract class ReverseChronologicalPager extends IndexPager {
                $timestamp = MWTimestamp::getInstance( "${ymd}000000" );
                $timestamp->setTimezone( $this->getConfig()->get( 'Localtimezone' ) );
 
-               $this->mOffset = $this->mDb->timestamp( $timestamp->getTimestamp() );
+               try {
+                       $this->mOffset = $this->mDb->timestamp( $timestamp->getTimestamp() );
+               } catch ( TimestampException $e ) {
+                       // Invalid user provided timestamp (T149257)
+                       return null;
+               }
+
                return $this->mOffset;
        }
 }
index 0a89e4e..f2fca68 100644 (file)
@@ -315,7 +315,7 @@ abstract class TablePager extends IndexPager {
                foreach ( $labels as $type => $label ) {
                        // We want every cell to have the same width. We could use table-layout: fixed; in CSS,
                        // but it only works if we specify the width of a cell or the table and we don't want to.
-                       // There is no better way. <http://www.w3.org/TR/CSS2/tables.html#fixed-table-layout>
+                       // There is no better way. <https://www.w3.org/TR/CSS2/tables.html#fixed-table-layout>
                        $s .= Html::rawElement( 'td',
                                [ 'style' => "width: $width;", 'class' => "TablePager_nav-$type" ],
                                $links[$type] ) . "\n";
index ef26db6..01cce02 100644 (file)
@@ -487,58 +487,40 @@ class CoreParserFunctions {
                return $mwObject->matchStartToEnd( $value );
        }
 
-       public static function formatRaw( $num, $raw, Language $language ) {
+       public static function formatRaw( $num, $raw ) {
                if ( self::matchAgainstMagicword( 'rawsuffix', $raw ) ) {
                        return $num;
                } else {
-                       return $language->formatNum( $num );
+                       global $wgContLang;
+                       return $wgContLang->formatNum( $num );
                }
        }
-
        public static function numberofpages( $parser, $raw = null ) {
-               return self::formatRaw( SiteStats::pages(), $raw, $parser->getFunctionLang() );
+               return self::formatRaw( SiteStats::pages(), $raw );
        }
-
        public static function numberofusers( $parser, $raw = null ) {
-               return self::formatRaw( SiteStats::users(), $raw, $parser->getFunctionLang() );
+               return self::formatRaw( SiteStats::users(), $raw );
        }
        public static function numberofactiveusers( $parser, $raw = null ) {
-               return self::formatRaw( SiteStats::activeUsers(), $raw, $parser->getFunctionLang() );
+               return self::formatRaw( SiteStats::activeUsers(), $raw );
        }
-
        public static function numberofarticles( $parser, $raw = null ) {
-               return self::formatRaw( SiteStats::articles(), $raw, $parser->getFunctionLang() );
+               return self::formatRaw( SiteStats::articles(), $raw );
        }
-
        public static function numberoffiles( $parser, $raw = null ) {
-               return self::formatRaw( SiteStats::images(), $raw, $parser->getFunctionLang() );
+               return self::formatRaw( SiteStats::images(), $raw );
        }
-
        public static function numberofadmins( $parser, $raw = null ) {
-               return self::formatRaw(
-                       SiteStats::numberingroup( 'sysop' ),
-                       $raw,
-                       $parser->getFunctionLang()
-               );
+               return self::formatRaw( SiteStats::numberingroup( 'sysop' ), $raw );
        }
-
        public static function numberofedits( $parser, $raw = null ) {
-               return self::formatRaw( SiteStats::edits(), $raw, $parser->getFunctionLang() );
+               return self::formatRaw( SiteStats::edits(), $raw );
        }
-
        public static function pagesinnamespace( $parser, $namespace = 0, $raw = null ) {
-               return self::formatRaw(
-                       SiteStats::pagesInNs( intval( $namespace ) ),
-                       $raw,
-                       $parser->getFunctionLang()
-               );
+               return self::formatRaw( SiteStats::pagesInNs( intval( $namespace ) ), $raw );
        }
        public static function numberingroup( $parser, $name = '', $raw = null ) {
-               return self::formatRaw(
-                       SiteStats::numberingroup( strtolower( $name ) ),
-                       $raw,
-                       $parser->getFunctionLang()
-               );
+               return self::formatRaw( SiteStats::numberingroup( strtolower( $name ) ), $raw );
        }
 
        /**
@@ -745,7 +727,7 @@ class CoreParserFunctions {
 
                $title = Title::makeTitleSafe( NS_CATEGORY, $name );
                if ( !$title ) { # invalid title
-                       return self::formatRaw( 0, $raw, $parser->getFunctionLang() );
+                       return self::formatRaw( 0, $raw );
                }
                $wgContLang->findVariantLink( $name, $title, true );
 
@@ -771,7 +753,7 @@ class CoreParserFunctions {
                }
 
                $count = $cache[$name][$type];
-               return self::formatRaw( $count, $raw, $parser->getFunctionLang() );
+               return self::formatRaw( $count, $raw );
        }
 
        /**
@@ -787,7 +769,7 @@ class CoreParserFunctions {
                $title = Title::newFromText( $page );
 
                if ( !is_object( $title ) ) {
-                       return self::formatRaw( 0, $raw, $parser->getFunctionLang() );
+                       return self::formatRaw( 0, $raw );
                }
 
                // fetch revision from cache/database and return the value
@@ -797,7 +779,7 @@ class CoreParserFunctions {
                        // We've had bugs where rev_len was not being recorded for empty pages, see T135414
                        $length = 0;
                }
-               return self::formatRaw( $length, $raw, $parser->getFunctionLang() );
+               return self::formatRaw( $length, $raw );
        }
 
        /**
index b32f43b..e7712f2 100644 (file)
@@ -267,10 +267,8 @@ class LinkHolderArray {
         * @param string $text
         */
        public function replace( &$text ) {
-
                $this->replaceInternal( $text );
                $this->replaceInterwiki( $text );
-
        }
 
        /**
@@ -414,7 +412,6 @@ class LinkHolderArray {
                        $replacer->cb(),
                        $text
                );
-
        }
 
        /**
@@ -614,7 +611,6 @@ class LinkHolderArray {
         * @return string
         */
        public function replaceText( $text ) {
-
                $text = preg_replace_callback(
                        '/<!--(LINK|IWLINK) (.*?)-->/',
                        [ &$this, 'replaceTextCallback' ],
index 2c15235..c7db8a1 100644 (file)
@@ -507,46 +507,60 @@ class Parser {
                                [ $this->mHighestExpansionDepth, $this->mOptions->getMaxPPExpandDepth() ]
                        );
                        $this->mOutput->setLimitReportData( 'limitreport-expensivefunctioncount',
-                               [ $this->mExpensiveFunctionCount,
-                                       $this->mOptions->getExpensiveParserFunctionLimit() ]
+                               [ $this->mExpensiveFunctionCount, $this->mOptions->getExpensiveParserFunctionLimit() ]
                        );
                        Hooks::run( 'ParserLimitReportPrepare', [ $this, $this->mOutput ] );
 
-                       $limitReport = '';
-                       Hooks::run( 'ParserLimitReport', [ $this, &$limitReport ] );
-                       if ( $limitReport != '' ) {
-                               // Sanitize for comment. Note '‐' in the replacement is U+2010,
-                               // which looks much like the problematic '-'.
-                               $limitReport = str_replace( [ '-', '&' ], [ '‐', '&amp;' ], $limitReport );
-                               $text .= "\n<!-- \nNewPP limit report\n$limitReport-->\n";
+                       $limitReport = "NewPP limit report\n";
+                       if ( $wgShowHostnames ) {
+                               $limitReport .= 'Parsed by ' . wfHostname() . "\n";
                        }
+                       $limitReport .= 'Cached time: ' . $this->mOutput->getCacheTime() . "\n";
+                       $limitReport .= 'Cache expiry: ' . $this->mOutput->getCacheExpiry() . "\n";
+                       $limitReport .= 'Dynamic content: ' .
+                               ( $this->mOutput->hasDynamicContent() ? 'true' : 'false' ) .
+                               "\n";
+
+                       foreach ( $this->mOutput->getLimitReportData() as $key => $value ) {
+                               if ( Hooks::run( 'ParserLimitReportFormat',
+                                       [ $key, &$value, &$limitReport, false, false ]
+                               ) ) {
+                                       $keyMsg = wfMessage( $key )->inLanguage( 'en' )->useDatabase( false );
+                                       $valueMsg = wfMessage( [ "$key-value-text", "$key-value" ] )
+                                               ->inLanguage( 'en' )->useDatabase( false );
+                                       if ( !$valueMsg->exists() ) {
+                                               $valueMsg = new RawMessage( '$1' );
+                                       }
+                                       if ( !$keyMsg->isDisabled() && !$valueMsg->isDisabled() ) {
+                                               $valueMsg->params( $value );
+                                               $limitReport .= "{$keyMsg->text()}: {$valueMsg->text()}\n";
+                                       }
+                               }
+                       }
+                       // Since we're not really outputting HTML, decode the entities and
+                       // then re-encode the things that need hiding inside HTML comments.
+                       $limitReport = htmlspecialchars_decode( $limitReport );
+                       Hooks::run( 'ParserLimitReport', [ $this, &$limitReport ] );
 
-                       // Add on template profiling data in human/machine readable way
+                       // Sanitize for comment. Note '‐' in the replacement is U+2010,
+                       // which looks much like the problematic '-'.
+                       $limitReport = str_replace( [ '-', '&' ], [ '‐', '&amp;' ], $limitReport );
+                       $text .= "\n<!-- \n$limitReport-->\n";
+
+                       // Add on template profiling data
                        $dataByFunc = $this->mProfiler->getFunctionStats();
                        uasort( $dataByFunc, function ( $a, $b ) {
                                return $a['real'] < $b['real']; // descending order
                        } );
-                       $profileReport = [];
+                       $profileReport = "Transclusion expansion time report (%,ms,calls,template)\n";
                        foreach ( array_slice( $dataByFunc, 0, 10 ) as $item ) {
-                               $profileReport[] = sprintf( "%6.2f%% %8.3f %6d %s",
-                                       $item['%real'], $item['real'], $item['calls'], $item['name'] );
+                               $profileReport .= sprintf( "%6.2f%% %8.3f %6d - %s\n",
+                                       $item['%real'], $item['real'], $item['calls'],
+                                       htmlspecialchars( $item['name'] ) );
                        }
-                       $this->mOutput->setLimitReportData( 'limitreport-timingprofile', $profileReport );
+                       $text .= "\n<!-- \n$profileReport-->\n";
 
-                       // Add other cache related metadata
-                       if ( $wgShowHostnames ) {
-                               $this->mOutput->setLimitReportData( 'cachereport-origin', wfHostname() );
-                       }
-                       $this->mOutput->setLimitReportData( 'cachereport-timestamp',
-                               $this->mOutput->getCacheTime() );
-                       $this->mOutput->setLimitReportData( 'cachereport-ttl',
-                               $this->mOutput->getCacheExpiry() );
-                       $this->mOutput->setLimitReportData( 'cachereport-transientcontent',
-                               $this->mOutput->hasDynamicContent() );
-
-                       if ( $this->mGeneratedPPNodeCount
-                               > $this->mOptions->getMaxGeneratedPPNodeCount() / 10
-                       ) {
+                       if ( $this->mGeneratedPPNodeCount > $this->mOptions->getMaxGeneratedPPNodeCount() / 10 ) {
                                wfDebugLog( 'generated-pp-node-count', $this->mGeneratedPPNodeCount . ' ' .
                                        $this->mTitle->getPrefixedDBkey() );
                        }
@@ -1446,7 +1460,7 @@ class Parser {
                                $keyword = 'RFC';
                                $urlmsg = 'rfcurl';
                                $cssClass = 'mw-magiclink-rfc';
-                               $trackingCategory = 'magiclinks-rfc-category';
+                               $trackingCat = 'magiclink-tracking-rfc';
                                $id = $m[5];
                        } elseif ( substr( $m[0], 0, 4 ) === 'PMID' ) {
                                if ( !$this->mOptions->getMagicPMIDLinks() ) {
@@ -1455,14 +1469,14 @@ class Parser {
                                $keyword = 'PMID';
                                $urlmsg = 'pubmedurl';
                                $cssClass = 'mw-magiclink-pmid';
-                               $trackingCategory = 'magiclinks-pmid-category';
+                               $trackingCat = 'magiclink-tracking-pmid';
                                $id = $m[5];
                        } else {
                                throw new MWException( __METHOD__ . ': unrecognised match type "' .
                                        substr( $m[0], 0, 20 ) . '"' );
                        }
                        $url = wfMessage( $urlmsg, $id )->inContentLanguage()->text();
-                       $this->addTrackingCategory( $trackingCategory );
+                       $this->addTrackingCategory( $trackingCat );
                        return Linker::makeExternalLink( $url, "{$keyword} {$id}", true, $cssClass, [], $this->mTitle );
                } elseif ( isset( $m[6] ) && $m[6] !== ''
                        && $this->mOptions->getMagicISBNLinks()
@@ -1476,7 +1490,7 @@ class Parser {
                                ' ' => '',
                                'x' => 'X',
                        ] );
-                       $this->addTrackingCategory( 'magiclinks-isbn-category' );
+                       $this->addTrackingCategory( 'magiclink-tracking-isbn' );
                        return $this->getLinkRenderer()->makeKnownLink(
                                SpecialPage::getTitleFor( 'Booksources', $num ),
                                "ISBN $isbn",
@@ -3805,11 +3819,10 @@ class Parser {
                        return $attrText;
                }
 
+               // We can't safely check if the expansion for $content resulted in an
+               // error, because the content could happen to be the error string
+               // (T149622).
                $content = !isset( $params['inner'] ) ? null : $frame->expand( $params['inner'] );
-               if ( substr( $content, 0, $errorLen ) === $errorStr ) {
-                       // See above
-                       return $content;
-               }
 
                $marker = self::MARKER_PREFIX . "-$name-"
                        . sprintf( '%08X', $this->mMarkerIndex++ ) . self::MARKER_SUFFIX;
@@ -4218,7 +4231,7 @@ class Parser {
 
                        # HTML names must be case-insensitively unique (bug 10721).
                        # This does not apply to Unicode characters per
-                       # http://www.w3.org/TR/html5/infrastructure.html#case-sensitivity-and-string-comparison
+                       # https://www.w3.org/TR/html5/infrastructure.html#case-sensitivity-and-string-comparison
                        # @todo FIXME: We may be changing them depending on the current locale.
                        $arrayKey = strtolower( $safeHeadline );
                        if ( $legacyHeadline === false ) {
index 9a10878..2900f41 100644 (file)
@@ -733,7 +733,6 @@ class ParserOptions {
                $this->mThumbSize = $user->getOption( 'thumbsize' );
                $this->mStubThreshold = $user->getStubThreshold();
                $this->mUserLang = $lang;
-
        }
 
        /**
index 9dfa97c..d2ef5e3 100644 (file)
@@ -188,7 +188,9 @@ class ParserOutput extends CacheTime {
         */
        private $mExtensionData = [];
 
-       /** @var array $mLimitReportData Parser limit report data. */
+       /**
+        * @var array $mLimitReportData Parser limit report data.
+        */
        private $mLimitReportData = [];
 
        /**
@@ -991,34 +993,24 @@ class ParserOutput extends CacheTime {
        /**
         * Sets parser limit report data for a key
         *
-        * If $value consist of a list of two floats, it will be interpreted as
-        * (actual value, maximum allowed value). The presence of a "-" in $key will cause
-        * the first part of the key to be interpreted as a namespace.
+        * The key is used as the prefix for various messages used for formatting:
+        *  - $key: The label for the field in the limit report
+        *  - $key-value-text: Message used to format the value in the "NewPP limit
+        *      report" HTML comment. If missing, uses $key-format.
+        *  - $key-value-html: Message used to format the value in the preview
+        *      limit report table. If missing, uses $key-format.
+        *  - $key-value: Message used to format the value. If missing, uses "$1".
+        *
+        * Note that all values are interpreted as wikitext, and so should be
+        * encoded with htmlspecialchars() as necessary, but should avoid complex
+        * HTML for sanity of display in the "NewPP limit report" comment.
         *
         * @since 1.22
-        * @param string $key Data key
-        * @param mixed $value Data value One of (float, string, bool, JSON serializable array)
+        * @param string $key Message key
+        * @param mixed $value Appropriate for Message::params()
         */
        public function setLimitReportData( $key, $value ) {
-               if ( is_array( $value ) ) {
-                       if ( array_keys( $value ) === [ 0, 1 ]
-                               && is_numeric( $value[0] )
-                               && is_numeric( $value[1] )
-                       ) {
-                               $data = [ 'value' => $value[0], 'limit' => $value[1] ];
-                       } else {
-                               $data = $value;
-                       }
-               } else {
-                       $data = $value;
-               }
-
-               if ( strpos( $key, '-' ) ) {
-                       list( $ns, $name ) = explode( '-', $key, 2 );
-                       $this->mLimitReportData[$ns][$name] = $data;
-               } else {
-                       $this->mLimitReportData[$key] = $data;
-               }
+               $this->mLimitReportData[$key] = $value;
        }
 
        /**
index 0236ea2..b5c70e9 100644 (file)
@@ -187,6 +187,19 @@ class ExtensionRegistry {
                        if ( !is_array( $info ) ) {
                                throw new Exception( "$path is not a valid JSON file." );
                        }
+
+                       // Check any constraints against MediaWiki core
+                       $requires = $processor->getRequirements( $info );
+                       if ( isset( $requires[self::MEDIAWIKI_CORE] )
+                               && !$coreVersionParser->check( $requires[self::MEDIAWIKI_CORE] )
+                       ) {
+                               // Doesn't match, mark it as incompatible.
+                               $incompatible[] = "{$info['name']} is not compatible with the current "
+                                       . "MediaWiki core (version {$wgVersion}), it requires: " . $requires[self::MEDIAWIKI_CORE]
+                                       . '.';
+                               continue;
+                       }
+
                        if ( !isset( $info['manifest_version'] ) ) {
                                // For backwards-compatability, assume a version of 1
                                $info['manifest_version'] = 1;
@@ -195,21 +208,12 @@ class ExtensionRegistry {
                        if ( $version < self::OLDEST_MANIFEST_VERSION || $version > self::MANIFEST_VERSION ) {
                                throw new Exception( "$path: unsupported manifest_version: {$version}" );
                        }
+
                        $autoload = $this->processAutoLoader( dirname( $path ), $info );
                        // Set up the autoloader now so custom processors will work
                        $GLOBALS['wgAutoloadClasses'] += $autoload;
                        $autoloadClasses += $autoload;
-                       // Check any constraints against MediaWiki core
-                       $requires = $processor->getRequirements( $info );
-                       if ( isset( $requires[self::MEDIAWIKI_CORE] )
-                               && !$coreVersionParser->check( $requires[self::MEDIAWIKI_CORE] )
-                       ) {
-                               // Doesn't match, mark it as incompatible.
-                               $incompatible[] = "{$info['name']} is not compatible with the current "
-                                       . "MediaWiki core (version {$wgVersion}), it requires: " . $requires[self::MEDIAWIKI_CORE]
-                                       . '.';
-                               continue;
-                       }
+
                        // Get extra paths for later inclusion
                        $autoloaderPaths = array_merge( $autoloaderPaths,
                                $processor->getExtraAutoloaderPaths( dirname( $path ), $info ) );
index 143f5cc..1073de0 100644 (file)
@@ -388,7 +388,6 @@ class ResourceLoader implements LoggerAwareInterface {
                                }
                        }
                }
-
        }
 
        /**
@@ -428,7 +427,6 @@ class ResourceLoader implements LoggerAwareInterface {
                        // Keep track of their names so that they can be loaded together
                        $this->testModuleNames[$id] = array_keys( $testModules[$id] );
                }
-
        }
 
        /**
@@ -670,7 +668,7 @@ class ResourceLoader implements LoggerAwareInterface {
                // back for subsequent output, resulting in invalid GZIP. So we have to wrap
                // the whole thing in our own output buffer to be sure the active buffer
                // doesn't use ob_gzhandler.
-               // See http://bugs.php.net/bug.php?id=36514
+               // See https://bugs.php.net/bug.php?id=36514
                ob_start();
 
                // Find out which modules are missing and instantiate the others
@@ -716,7 +714,7 @@ class ResourceLoader implements LoggerAwareInterface {
                }
 
                // See RFC 2616 § 3.11 Entity Tags
-               // http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.11
+               // https://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.11
                $etag = 'W/"' . $versionHash . '"';
 
                // Try the client-side cache first
@@ -779,7 +777,6 @@ class ResourceLoader implements LoggerAwareInterface {
 
                $this->errors = [];
                echo $response;
-
        }
 
        /**
@@ -824,7 +821,7 @@ class ResourceLoader implements LoggerAwareInterface {
                        header( 'Content-Type: text/javascript; charset=utf-8' );
                }
                // See RFC 2616 § 14.19 ETag
-               // http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.19
+               // https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.19
                header( 'ETag: ' . $etag );
                if ( $context->getDebug() ) {
                        // Do not cache debug responses
@@ -849,7 +846,7 @@ class ResourceLoader implements LoggerAwareInterface {
         */
        protected function tryRespondNotModified( ResourceLoaderContext $context, $etag ) {
                // See RFC 2616 § 14.26 If-None-Match
-               // http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.26
+               // https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.26
                $clientKeys = $context->getRequest()->getHeader( 'If-None-Match', WebRequest::GETHEADER_LIST );
                // Never send 304s in debug mode
                if ( $clientKeys !== false && !$context->getDebug() && in_array( $etag, $clientKeys ) ) {
@@ -859,7 +856,7 @@ class ResourceLoader implements LoggerAwareInterface {
                        // response (because the gzip header is always there). This is
                        // a problem because 304 responses have to be completely empty
                        // per the HTTP spec, and Firefox behaves buggily when they're not.
-                       // See also http://bugs.php.net/bug.php?id=51579
+                       // See also https://bugs.php.net/bug.php?id=51579
                        // To work around this, we tear down all output buffering before
                        // sending the 304.
                        wfResetOutputBuffers( /* $resetGzipEncoding = */ true );
@@ -1142,7 +1139,6 @@ MESSAGE;
        protected static function makeLoaderImplementScript(
                $name, $scripts, $styles, $messages, $templates
        ) {
-
                if ( $scripts instanceof XmlJsCode ) {
                        $scripts = new XmlJsCode( "function ( $, jQuery, require, module ) {\n{$scripts->value}\n}" );
                } elseif ( !is_string( $scripts ) && !is_array( $scripts ) ) {
@@ -1434,14 +1430,13 @@ MESSAGE;
         * the given value.
         *
         * @param array $configuration List of configuration values keyed by variable name
-        * @param bool $pretty Pretty-print with extra whitespace
         * @return string
         */
-       public static function makeConfigSetScript( array $configuration, $pretty = null ) {
+       public static function makeConfigSetScript( array $configuration ) {
                return Xml::encodeJsCall(
                        'mw.config.set',
                        [ $configuration ],
-                       ( $pretty === null ) ? ResourceLoader::inDebugMode() : $pretty
+                       ResourceLoader::inDebugMode()
                );
        }
 
index 8ba49b6..5a50b17 100644 (file)
@@ -62,7 +62,6 @@ class SearchPostgres extends SearchDatabase {
         * @return string
         */
        function parseQuery( $term ) {
-
                wfDebug( "parseQuery received: $term \n" );
 
                # # No backslashes allowed
@@ -115,7 +114,6 @@ class SearchPostgres extends SearchDatabase {
                wfDebug( "parseQuery returned: $searchstring \n" );
 
                return $searchstring;
-
        }
 
        /**
index 695ce5a..084ac05 100644 (file)
@@ -162,12 +162,39 @@ class PHPSessionHandler implements \SessionHandlerInterface {
                }
        }
 
+       /**
+        * Workaround for PHP5 bug
+        *
+        * PHP5 has a bug in handling boolean return values for
+        * SessionHandlerInterface methods, it expects 0 or -1 instead of true or
+        * false. See <https://wiki.php.net/rfc/session.user.return-value>.
+        *
+        * PHP7 and HHVM are not affected.
+        *
+        * @todo When we drop support for Zend PHP 5, this can be removed.
+        * @return bool|int
+        * @codeCoverageIgnore
+        */
+       protected static function returnSuccess() {
+               return defined( 'HHVM_VERSION' ) || version_compare( PHP_VERSION, '7.0.0', '>=' ) ? true : 0;
+       }
+
+       /**
+        * Workaround for PHP5 bug
+        * @see self::returnSuccess()
+        * @return bool|int
+        * @codeCoverageIgnore
+        */
+       protected static function returnFailure() {
+               return defined( 'HHVM_VERSION' ) || version_compare( PHP_VERSION, '7.0.0', '>=' ) ? false : -1;
+       }
+
        /**
         * Initialize the session (handler)
         * @private For internal use only
         * @param string $save_path Path used to store session files (ignored)
         * @param string $session_name Session name (ignored)
-        * @return bool Success
+        * @return bool|int Success (see self::returnSuccess())
         */
        public function open( $save_path, $session_name ) {
                if ( self::$instance !== $this ) {
@@ -176,20 +203,20 @@ class PHPSessionHandler implements \SessionHandlerInterface {
                if ( !$this->enable ) {
                        throw new \BadMethodCallException( 'Attempt to use PHP session management' );
                }
-               return true;
+               return self::returnSuccess();
        }
 
        /**
         * Close the session (handler)
         * @private For internal use only
-        * @return bool Success
+        * @return bool|int Success (see self::returnSuccess())
         */
        public function close() {
                if ( self::$instance !== $this ) {
                        throw new \UnexpectedValueException( __METHOD__ . ': Wrong instance called!' );
                }
                $this->sessionFieldCache = [];
-               return true;
+               return self::returnSuccess();
        }
 
        /**
@@ -224,7 +251,7 @@ class PHPSessionHandler implements \SessionHandlerInterface {
         * @param string $dataStr Session data. Not that you should ever call this
         *   directly, but note that this has the same issues with code injection
         *   via user-controlled data as does PHP's unserialize function.
-        * @return bool Success
+        * @return bool|int Success (see self::returnSuccess())
         */
        public function write( $id, $dataStr ) {
                if ( self::$instance !== $this ) {
@@ -243,14 +270,14 @@ class PHPSessionHandler implements \SessionHandlerInterface {
                                [
                                        'session' => $id,
                        ] );
-                       return true;
+                       return self::returnSuccess();
                }
 
                // First, decode the string PHP handed us
                $data = \Wikimedia\PhpSessionSerializer::decode( $dataStr );
                if ( $data === null ) {
                        // @codeCoverageIgnoreStart
-                       return false;
+                       return self::returnFailure();
                        // @codeCoverageIgnoreEnd
                }
 
@@ -323,14 +350,14 @@ class PHPSessionHandler implements \SessionHandlerInterface {
 
                $session->persist();
 
-               return true;
+               return self::returnSuccess();
        }
 
        /**
         * Destroy a session
         * @private For internal use only
         * @param string $id Session id
-        * @return bool Success
+        * @return bool|int Success (see self::returnSuccess())
         */
        public function destroy( $id ) {
                if ( self::$instance !== $this ) {
@@ -343,14 +370,15 @@ class PHPSessionHandler implements \SessionHandlerInterface {
                if ( $session ) {
                        $session->clear();
                }
-               return true;
+               return self::returnSuccess();
        }
 
        /**
         * Execute garbage collection.
         * @private For internal use only
         * @param int $maxlifetime Maximum session life time (ignored)
-        * @return bool Success
+        * @return bool|int Success (see self::returnSuccess())
+        * @codeCoverageIgnore See T135576
         */
        public function gc( $maxlifetime ) {
                if ( self::$instance !== $this ) {
@@ -358,6 +386,6 @@ class PHPSessionHandler implements \SessionHandlerInterface {
                }
                $before = date( 'YmdHis', time() );
                $this->store->deleteObjectsExpiringBefore( $before );
-               return true;
+               return self::returnSuccess();
        }
 }
index 6ea8b89..65eb9b7 100644 (file)
@@ -289,7 +289,6 @@ abstract class BaseTemplate extends QuickTemplate {
                if ( $content !== '' ) {
                        echo "<div class='after-portlet after-portlet-$name'>$content</div>";
                }
-
        }
 
        /**
index 3efbd3b..9c5600d 100644 (file)
@@ -196,7 +196,6 @@ class SkinTemplate extends Skin {
        }
 
        protected function setupTemplateForOutput() {
-
                $request = $this->getRequest();
                $user = $this->getUser();
                $title = $this->getTitle();
@@ -257,7 +256,6 @@ class SkinTemplate extends Skin {
                if ( $oldContext ) {
                        $this->setContext( $oldContext );
                }
-
        }
 
        /**
@@ -1171,7 +1169,6 @@ class SkinTemplate extends Skin {
         * @return array
         */
        private function buildContentActionUrls( $content_navigation ) {
-
                // content_actions has been replaced with content_navigation for backwards
                // compatibility and also for skins that just want simple tabs content_actions
                // is now built by flattening the content_navigation arrays into one
index 275e121..1e03774 100644 (file)
@@ -156,7 +156,7 @@ abstract class LoginSignupSpecialPage extends AuthManagerSpecialPage {
                        [
                                'returnto' => $this->mReturnTo,
                                'returntoquery' => $this->mReturnToQuery,
-                               'uselang' => $this->mLanguage,
+                               'uselang' => $this->mLanguage ?: null,
                                'fromhttp' => $wgSecureLogin && $this->mFromHTTP ? '1' : null,
                        ]
                );
@@ -508,7 +508,11 @@ abstract class LoginSignupSpecialPage extends AuthManagerSpecialPage {
                }
 
                // warning header for non-standard workflows (e.g. security reauthentication)
-               if ( !$this->isSignup() && $this->getUser()->isLoggedIn() ) {
+               if (
+                       !$this->isSignup() &&
+                       $this->getUser()->isLoggedIn() &&
+                       $this->authAction !== AuthManager::ACTION_LOGIN_CONTINUE
+               ) {
                        $reauthMessage = $this->securityLevel ? 'userlogin-reauth' : 'userlogin-loggedin';
                        $submitStatus->warning( $reauthMessage, $this->getUser()->getName() );
                }
@@ -615,7 +619,7 @@ abstract class LoginSignupSpecialPage extends AuthManagerSpecialPage {
                $form = HTMLForm::factory( 'vform', $formDescriptor, $context );
 
                $form->addHiddenField( 'authAction', $this->authAction );
-               if ( $wgLoginLanguageSelector ) {
+               if ( $wgLoginLanguageSelector && $this->mLanguage ) {
                        $form->addHiddenField( 'uselang', $this->mLanguage );
                }
                $form->addHiddenField( 'force', $this->securityLevel );
@@ -655,7 +659,7 @@ abstract class LoginSignupSpecialPage extends AuthManagerSpecialPage {
                // make a best effort to get the value of fields which used to be fixed in the old login
                // template but now might or might not exist depending on what providers are used
                $request = $this->getRequest();
-               $data = (object) [
+               $data = (object)[
                        'mUsername' => $request->getText( 'wpName' ),
                        'mPassword' => $request->getText( 'wpPassword' ),
                        'mRetype' => $request->getText( 'wpRetype' ),
@@ -759,14 +763,21 @@ abstract class LoginSignupSpecialPage extends AuthManagerSpecialPage {
                $wgAuth->modifyUITemplate( $template, $action );
 
                $oldTemplate = $template;
-               $hookName = $this->isSignup() ? 'UserCreateForm' : 'UserLoginForm';
-               Hooks::run( $hookName, [ &$template ] );
-               if ( $oldTemplate !== $template ) {
-                       wfDeprecated( "reference in $hookName hook", '1.27' );
+
+               // Both Hooks::run are explicit here to make findHooks.php happy
+               if ( $this->isSignup() ) {
+                       Hooks::run( 'UserCreateForm', [ &$template ] );
+                       if ( $oldTemplate !== $template ) {
+                               wfDeprecated( "reference in UserCreateForm hook", '1.27' );
+                       }
+               } else {
+                       Hooks::run( 'UserLoginForm', [ &$template ] );
+                       if ( $oldTemplate !== $template ) {
+                               wfDeprecated( "reference in UserLoginForm hook", '1.27' );
+                       }
                }
 
                return $template;
-
        }
 
        public function onAuthChangeFormFields(
index 97f004f..3bb3f85 100644 (file)
@@ -36,17 +36,7 @@ abstract class PageQueryPage extends QueryPage {
         * @param ResultWrapper $res
         */
        public function preprocessResults( $db, $res ) {
-               if ( !$res->numRows() ) {
-                       return;
-               }
-
-               $batch = new LinkBatch();
-               foreach ( $res as $row ) {
-                       $batch->add( $row->namespace, $row->title );
-               }
-               $batch->execute();
-
-               $res->seek( 0 );
+               $this->executeLBFromResultWrapper( $res );
        }
 
        /**
index afbc581..3592500 100644 (file)
@@ -825,4 +825,28 @@ abstract class QueryPage extends SpecialPage {
        function feedUrl() {
                return $this->getPageTitle()->getFullURL();
        }
+
+       /**
+        * Creates a new LinkBatch object, adds all pages from the passed ResultWrapper (MUST include
+        * title and optional the namespace field) and executes the batch. This operation will pre-cache
+        * LinkCache information like page existence and information for stub color and redirect hints.
+        *
+        * @param ResultWrapper $res The ResultWrapper object to process. Needs to include the title
+        *  field and namespace field, if the $ns parameter isn't set.
+        * @param null $ns Use this namespace for the given titles in the ResultWrapper object,
+        *  instead of the namespace value of $res.
+        */
+       protected function executeLBFromResultWrapper( ResultWrapper $res, $ns = null ) {
+               if ( !$res->numRows() ) {
+                       return;
+               }
+
+               $batch = new LinkBatch;
+               foreach ( $res as $row ) {
+                       $batch->add( $ns !== null ? $ns : $row->namespace, $row->title );
+               }
+               $batch->execute();
+
+               $res->seek( 0 );
+       }
 }
index 1c19f3c..39e3649 100644 (file)
@@ -41,18 +41,7 @@ abstract class WantedQueryPage extends QueryPage {
         * @param ResultWrapper $res
         */
        function preprocessResults( $db, $res ) {
-               if ( !$res->numRows() ) {
-                       return;
-               }
-
-               $batch = new LinkBatch;
-               foreach ( $res as $row ) {
-                       $batch->add( $row->namespace, $row->title );
-               }
-               $batch->execute();
-
-               // Back to start for display
-               $res->seek( 0 );
+               $this->executeLBFromResultWrapper( $res );
        }
 
        /**
index 2da441b..531c330 100644 (file)
@@ -51,8 +51,7 @@ class SpecialActiveUsers extends SpecialPage {
                $opts = new FormOptions();
 
                $opts->add( 'username', '' );
-               $opts->add( 'hidebots', false, FormOptions::BOOL );
-               $opts->add( 'hidesysops', false, FormOptions::BOOL );
+               $opts->add( 'groups', [] );
 
                $opts->fetchValuesFromRequest( $this->getRequest() );
 
@@ -60,32 +59,32 @@ class SpecialActiveUsers extends SpecialPage {
                        $opts->setValue( 'username', $par );
                }
 
-               // Mention the level of cache staleness...
-               $cacheText = '';
-               $dbr = wfGetDB( DB_REPLICA, 'recentchanges' );
-               $rcMax = $dbr->selectField( 'recentchanges', 'MAX(rc_timestamp)', '', __METHOD__ );
-               if ( $rcMax ) {
-                       $cTime = $dbr->selectField( 'querycache_info',
-                               'qci_timestamp',
-                               [ 'qci_type' => 'activeusers' ],
-                               __METHOD__
+               $pager = new ActiveUsersPager( $this->getContext(), $opts );
+               $usersBody = $pager->getBody();
+
+               $this->buildForm();
+
+               if ( $usersBody ) {
+                       $out->addHTML(
+                               $pager->getNavigationBar() .
+                               Html::rawElement( 'ul', [], $usersBody ) .
+                               $pager->getNavigationBar()
                        );
-                       if ( $cTime ) {
-                               $secondsOld = wfTimestamp( TS_UNIX, $rcMax ) - wfTimestamp( TS_UNIX, $cTime );
-                       } else {
-                               $rcMin = $dbr->selectField( 'recentchanges', 'MIN(rc_timestamp)' );
-                               $secondsOld = time() - wfTimestamp( TS_UNIX, $rcMin );
-                       }
-                       if ( $secondsOld > 0 ) {
-                               $cacheTxt = '<br>' . $this->msg( 'cachedspecial-viewing-cached-ttl' )
-                                       ->durationParams( $secondsOld );
-                       }
+               } else {
+                       $out->addWikiMsg( 'activeusers-noresult' );
                }
+       }
 
-               $pager = new ActiveUsersPager( $this->getContext(), $opts );
-               $usersBody = $pager->getBody();
+       /**
+        * Generate and output the form
+        */
+       protected function buildForm() {
+               $groups = User::getAllGroups();
 
-               $days = $this->getConfig()->get( 'ActiveUserDays' );
+               foreach ( $groups as $group ) {
+                       $msg = User::getGroupName( $group );
+                       $options[$msg] = $group;
+               }
 
                $formDescriptor = [
                        'username' => [
@@ -94,38 +93,60 @@ class SpecialActiveUsers extends SpecialPage {
                                'label-message' => 'activeusers-from',
                        ],
 
-                       'hidebots' => [
-                               'type' => 'check',
-                               'name' => 'hidebots',
-                               'label-message' => 'activeusers-hidebots',
-                               'default' => false,
-                       ],
-
-                       'hidesysops' => [
-                               'type' => 'check',
-                               'name' => 'hidesysops',
-                               'label-message' => 'activeusers-hidesysops',
-                               'default' => false,
+                       'groups' => [
+                               'type' => 'multiselect',
+                               'dropdown' => true,
+                               'flatlist' => true,
+                               'name' => 'groups',
+                               'label-message' => 'activeusers-groups',
+                               'options' => $options,
                        ],
                ];
 
-               $htmlForm = HTMLForm::factory( 'ooui', $formDescriptor, $this->getContext() )
-                       ->setIntro( $this->msg( 'activeusers-intro' )->numParams( $days ) . $cacheText )
+               HTMLForm::factory( 'ooui', $formDescriptor, $this->getContext() )
+                       // For the 'multiselect' field values to be preserved on submit
+                       ->setFormIdentifier( 'specialactiveusers' )
+                       ->setIntro( $this->getIntroText() )
                        ->setWrapperLegendMsg( 'activeusers' )
                        ->setSubmitTextMsg( 'activeusers-submit' )
+                       // prevent setting subpage and 'username' parameter at the same time
+                       ->setAction( $this->getPageTitle()->getLocalURL() )
                        ->setMethod( 'get' )
                        ->prepareForm()
                        ->displayForm( false );
+       }
 
-               if ( $usersBody ) {
-                       $out->addHTML(
-                               $pager->getNavigationBar() .
-                               Html::rawElement( 'ul', [], $usersBody ) .
-                               $pager->getNavigationBar()
+       /**
+        * Return introductory message.
+        * @return string
+        */
+       protected function getIntroText() {
+               $days = $this->getConfig()->get( 'ActiveUserDays' );
+
+               $intro = $this->msg( 'activeusers-intro' )->numParams( $days )->parse();
+
+               // Mention the level of cache staleness...
+               $dbr = wfGetDB( DB_REPLICA, 'recentchanges' );
+               $rcMax = $dbr->selectField( 'recentchanges', 'MAX(rc_timestamp)', '', __METHOD__ );
+               if ( $rcMax ) {
+                       $cTime = $dbr->selectField( 'querycache_info',
+                               'qci_timestamp',
+                               [ 'qci_type' => 'activeusers' ],
+                               __METHOD__
                        );
-               } else {
-                       $out->addWikiMsg( 'activeusers-noresult' );
+                       if ( $cTime ) {
+                               $secondsOld = wfTimestamp( TS_UNIX, $rcMax ) - wfTimestamp( TS_UNIX, $cTime );
+                       } else {
+                               $rcMin = $dbr->selectField( 'recentchanges', 'MIN(rc_timestamp)' );
+                               $secondsOld = time() - wfTimestamp( TS_UNIX, $rcMin );
+                       }
+                       if ( $secondsOld > 0 ) {
+                               $intro .= $this->msg( 'cachedspecial-viewing-cached-ttl' )
+                                       ->durationParams( $secondsOld )->parseAsBlock();
+                       }
                }
+
+               return $intro;
        }
 
        protected function getGroupName() {
index 724435b..9ee1b75 100644 (file)
@@ -64,6 +64,10 @@ class AncientPagesPage extends QueryPage {
                return false;
        }
 
+       public function preprocessResults( $db, $res ) {
+               $this->executeLBFromResultWrapper( $res );
+       }
+
        /**
         * @param Skin $skin
         * @param object $result Result row
index 39ca8dd..0899d58 100644 (file)
@@ -105,6 +105,7 @@ class SpecialBlockList extends SpecialPage {
                $form = HTMLForm::factory( 'ooui', $fields, $context );
                $form
                        ->setMethod( 'get' )
+                       ->setFormIdentifier( 'blocklist' )
                        ->setWrapperLegendMsg( 'ipblocklist-legend' )
                        ->setSubmitTextMsg( 'ipblocklist-submit' )
                        ->setSubmitProgressive()
index b9b2051..1753396 100644 (file)
@@ -171,18 +171,7 @@ class BrokenRedirectsPage extends QueryPage {
         * @param ResultWrapper $res
         */
        function preprocessResults( $db, $res ) {
-               if ( !$res->numRows() ) {
-                       return;
-               }
-
-               $batch = new LinkBatch;
-               foreach ( $res as $row ) {
-                       $batch->add( $row->namespace, $row->title );
-               }
-               $batch->execute();
-
-               // Back to start for display
-               $res->seek( 0 );
+               $this->executeLBFromResultWrapper( $res );
        }
 
        protected function getGroupName() {
index 0858b18..3cd4d4d 100644 (file)
@@ -554,7 +554,7 @@ class SpecialContributions extends IncludableSpecialPage {
                                $this->msg( 'namespace' )->text(),
                                'namespace',
                                ''
-                       ) .
+                       ) . '&#160;' .
                        Html::namespaceSelector(
                                [ 'selected' => $this->opts['namespace'], 'all' => '' ],
                                [
index 307d6c3..a2fa844 100644 (file)
@@ -225,16 +225,7 @@ class LinkSearchPage extends QueryPage {
         * @param ResultWrapper $res
         */
        function preprocessResults( $db, $res ) {
-               if ( $res->numRows() > 0 ) {
-                       $linkBatch = new LinkBatch();
-
-                       foreach ( $res as $row ) {
-                               $linkBatch->add( $row->namespace, $row->title );
-                       }
-
-                       $res->seek( 0 );
-                       $linkBatch->execute();
-               }
+               $this->executeLBFromResultWrapper( $res );
        }
 
        /**
index 49fa417..dbe5c2f 100644 (file)
@@ -75,16 +75,7 @@ class ListDuplicatedFilesPage extends QueryPage {
         * @param ResultWrapper $res
         */
        function preprocessResults( $db, $res ) {
-               if ( $res->numRows() > 0 ) {
-                       $linkBatch = new LinkBatch();
-
-                       foreach ( $res as $row ) {
-                               $linkBatch->add( $row->namespace, $row->title );
-                       }
-
-                       $res->seek( 0 );
-                       $linkBatch->execute();
-               }
+               $this->executeLBFromResultWrapper( $res );
        }
 
        /**
index 6093f83..1d02a4f 100644 (file)
@@ -199,6 +199,10 @@ class MIMEsearchPage extends QueryPage {
                return in_array( $type, $types );
        }
 
+       public function preprocessResults( $db, $res ) {
+               $this->executeLBFromResultWrapper( $res );
+       }
+
        protected function getGroupName() {
                return 'media';
        }
index ec87716..7683ad8 100644 (file)
@@ -353,6 +353,7 @@ class MediaStatisticsPage extends QueryPage {
         * @param ResultWrapper $res
         */
        public function preprocessResults( $dbr, $res ) {
+               $this->executeLBFromResultWrapper( $res );
                $this->totalCount = $this->totalBytes = 0;
                foreach ( $res as $row ) {
                        $mediaStats = $this->splitFakeTitle( $row->title );
index 06d21d5..015701d 100644 (file)
@@ -69,19 +69,7 @@ class MostcategoriesPage extends QueryPage {
         * @param ResultWrapper $res
         */
        function preprocessResults( $db, $res ) {
-               # There's no point doing a batch check if we aren't caching results;
-               # the page must exist for it to have been pulled out of the table
-               if ( !$this->isCached() || !$res->numRows() ) {
-                       return;
-               }
-
-               $batch = new LinkBatch();
-               foreach ( $res as $row ) {
-                       $batch->add( $row->namespace, $row->title );
-               }
-               $batch->execute();
-
-               $res->seek( 0 );
+               $this->executeLBFromResultWrapper( $res );
        }
 
        /**
index 8271d16..3e78352 100644 (file)
@@ -75,20 +75,7 @@ class MostinterwikisPage extends QueryPage {
         * @param ResultWrapper $res
         */
        function preprocessResults( $db, $res ) {
-               # There's no point doing a batch check if we aren't caching results;
-               # the page must exist for it to have been pulled out of the table
-               if ( !$this->isCached() || !$res->numRows() ) {
-                       return;
-               }
-
-               $batch = new LinkBatch;
-               foreach ( $res as $row ) {
-                       $batch->add( $row->namespace, $row->title );
-               }
-               $batch->execute();
-
-               // Back to start for display
-               $res->seek( 0 );
+               $this->executeLBFromResultWrapper( $res );
        }
 
        /**
index 3663647..01eb39e 100644 (file)
@@ -78,16 +78,7 @@ class MostlinkedPage extends QueryPage {
         * @param ResultWrapper $res
         */
        function preprocessResults( $db, $res ) {
-               if ( $res->numRows() > 0 ) {
-                       $linkBatch = new LinkBatch();
-
-                       foreach ( $res as $row ) {
-                               $linkBatch->add( $row->namespace, $row->title );
-                       }
-
-                       $res->seek( 0 );
-                       $linkBatch->execute();
-               }
+               $this->executeLBFromResultWrapper( $res );
        }
 
        /**
index 3ead08a..41678cb 100644 (file)
@@ -59,18 +59,7 @@ class MostlinkedCategoriesPage extends QueryPage {
         * @param ResultWrapper $res
         */
        function preprocessResults( $db, $res ) {
-               if ( !$res->numRows() ) {
-                       return;
-               }
-
-               $batch = new LinkBatch;
-               foreach ( $res as $row ) {
-                       $batch->add( NS_CATEGORY, $row->title );
-               }
-               $batch->execute();
-
-               // Back to start for display
-               $res->seek( 0 );
+               $this->executeLBFromResultWrapper( $res );
        }
 
        /**
index 950241f..7fcb9d8 100644 (file)
@@ -79,17 +79,7 @@ class MostlinkedTemplatesPage extends QueryPage {
         * @param ResultWrapper $res
         */
        public function preprocessResults( $db, $res ) {
-               if ( !$res->numRows() ) {
-                       return;
-               }
-
-               $batch = new LinkBatch();
-               foreach ( $res as $row ) {
-                       $batch->add( $row->namespace, $row->title );
-               }
-               $batch->execute();
-
-               $res->seek( 0 );
+               $this->executeLBFromResultWrapper( $res );
        }
 
        /**
index d719e53..be8ad8f 100755 (executable)
@@ -54,6 +54,8 @@ class SpecialNewpages extends IncludableSpecialPage {
                $opts->add( 'feed', '' );
                $opts->add( 'tagfilter', '' );
                $opts->add( 'invert', false );
+               $opts->add( 'size-mode', 'max' );
+               $opts->add( 'size', 0 );
 
                $this->customFilters = [];
                Hooks::run( 'SpecialNewPagesFilters', [ $this, &$this->customFilters ] );
@@ -214,6 +216,9 @@ class SpecialNewpages extends IncludableSpecialPage {
                $tagFilterVal = $this->opts->consumeValue( 'tagfilter' );
                $nsinvert = $this->opts->consumeValue( 'invert' );
 
+               $size = $this->opts->consumeValue( 'size' );
+               $max = $this->opts->consumeValue( 'size-mode' ) === 'max';
+
                // Check username input validity
                $ut = Title::makeTitleSafe( NS_USER, $username );
                $userText = $ut ? $ut->getText() : '';
@@ -254,6 +259,11 @@ class SpecialNewpages extends IncludableSpecialPage {
                                'size' => 30,
                                'cssclass' => 'mw-autocomplete-user', // used by mediawiki.userSuggest
                        ],
+                       'size' => [
+                               'type' => 'sizefilter',
+                               'name' => 'size',
+                               'default' => -$max * $size,
+                       ],
                ];
 
                $htmlForm = new HTMLForm( $form, $this->getContext() );
index 9746ef6..82abccf 100644 (file)
@@ -34,7 +34,7 @@ use MediaWiki\Auth\AuthManager;
  */
 class SpecialPasswordReset extends FormSpecialPage {
        /** @var PasswordReset */
-       private $passwordReset;
+       private $passwordReset = null;
 
        /**
         * @var string[] Temporary storage for the passwords which have been sent out, keyed by username.
@@ -53,7 +53,13 @@ class SpecialPasswordReset extends FormSpecialPage {
 
        public function __construct() {
                parent::__construct( 'PasswordReset', 'editmyprivateinfo' );
-               $this->passwordReset = new PasswordReset( $this->getConfig(), AuthManager::singleton() );
+       }
+
+       private function getPasswordReset() {
+               if ( $this->passwordReset === null ) {
+                       $this->passwordReset = new PasswordReset( $this->getConfig(), AuthManager::singleton() );
+               }
+               return $this->passwordReset;
        }
 
        public function doesWrites() {
@@ -61,11 +67,11 @@ class SpecialPasswordReset extends FormSpecialPage {
        }
 
        public function userCanExecute( User $user ) {
-               return $this->passwordReset->isAllowed( $user )->isGood();
+               return $this->getPasswordReset()->isAllowed( $user )->isGood();
        }
 
        public function checkExecutePermissions( User $user ) {
-               $status = Status::wrap( $this->passwordReset->isAllowed( $user ) );
+               $status = Status::wrap( $this->getPasswordReset()->isAllowed( $user ) );
                if ( !$status->isGood() ) {
                        throw new ErrorPageError( 'internalerror', $status->getMessage() );
                }
@@ -150,7 +156,7 @@ class SpecialPasswordReset extends FormSpecialPage {
 
                $this->method = $username ? 'username' : 'email';
                $this->result = Status::wrap(
-                       $this->passwordReset->execute( $this->getUser(), $username, $email, $capture ) );
+                       $this->getPasswordReset()->execute( $this->getUser(), $username, $email, $capture ) );
                if ( $capture && $this->result->isOK() ) {
                        $this->passwords = $this->result->getValue();
                }
@@ -199,7 +205,7 @@ class SpecialPasswordReset extends FormSpecialPage {
         * @return bool
         */
        public function isListed() {
-               if ( $this->passwordReset->isAllowed( $this->getUser() )->isGood() ) {
+               if ( $this->getPasswordReset()->isAllowed( $this->getUser() )->isGood() ) {
                        return parent::isListed();
                }
 
index 6daf19f..9280b04 100644 (file)
@@ -234,11 +234,6 @@ class SpecialSearch extends SpecialPage {
 
                        return;
                }
-               # No match, generate an edit URL
-               $title = Title::newFromText( $term );
-               if ( !is_null( $title ) ) {
-                       Hooks::run( 'SpecialSearchNogomatch', [ &$title ] );
-               }
                $this->showResults( $term );
        }
 
@@ -422,7 +417,12 @@ class SpecialSearch extends SpecialPage {
                                $out->addHTML( '<div class="error">' .
                                        $textStatus->getMessage( 'search-error' ) . '</div>' );
                        } else {
-                               $this->showCreateLink( $title, $num, $titleMatches, $textMatches );
+                               if ( !$this->offset ) {
+                                       // If we have an offset the create link was rendered earlier in this function.
+                                       // This class needs a good de-spaghettification, but for now this will
+                                       // do the job.
+                                       $this->showCreateLink( $title, $num, $titleMatches, $textMatches );
+                               }
                                $out->wrapWikiMsg( "<p class=\"mw-search-nonefound\">\n$1</p>",
                                        [ $hasOtherResults ? 'search-nonefound-thiswiki' : 'search-nonefound',
                                                        wfEscapeWikiText( $term )
@@ -455,7 +455,6 @@ class SpecialSearch extends SpecialPage {
                $out->addHTML( "</div>" );
 
                Hooks::run( 'SpecialSearchResultsAppend', [ $this, $out, $term ] );
-
        }
 
        /**
@@ -470,25 +469,6 @@ class SpecialSearch extends SpecialPage {
                return "<p class=\"mw-search-interwiki-header mw-search-visualclear\">\n$wikiMsg</p>";
        }
 
-       /**
-        * Decide if the suggested query should be run, and it's results returned
-        * instead of the provided $textMatches
-        *
-        * @param SearchResultSet $textMatches The results of a users query
-        * @return bool
-        */
-       protected function shouldRunSuggestedQuery( SearchResultSet $textMatches ) {
-               if ( !$this->runSuggestion ||
-                       !$textMatches->hasSuggestion() ||
-                       $textMatches->numRows() > 0 ||
-                       $textMatches->searchContainedSyntax()
-               ) {
-                       return false;
-               }
-
-               return $this->getConfig()->get( 'SearchRunSuggestedQuery' );
-       }
-
        /**
         * Generates HTML shown to the user when we have a suggestion about a query
         * that might give more results than their current query.
@@ -752,7 +732,6 @@ class SpecialSearch extends SpecialPage {
         * @return string
         */
        protected function showHit( SearchResult $result, $terms, $position ) {
-
                if ( $result->isBrokenTitle() ) {
                        return '';
                }
@@ -972,7 +951,6 @@ class SpecialSearch extends SpecialPage {
         * @return string
         */
        protected function showInterwikiHit( $result, $lastInterwiki, $query ) {
-
                if ( $result->isBrokenTitle() ) {
                        return '';
                }
@@ -1335,24 +1313,6 @@ class SpecialSearch extends SpecialPage {
                return false;
        }
 
-       /**
-        * Check if query starts with all: prefix
-        *
-        * @param string $term The string to check
-        * @return bool
-        */
-       protected function startsWithAll( $term ) {
-
-               $allkeyword = $this->msg( 'searchall' )->inContentLanguage()->text();
-
-               $parts = explode( ':', $term );
-               if ( count( $parts ) > 1 ) {
-                       return $parts[0] == $allkeyword;
-               }
-
-               return false;
-       }
-
        /**
         * @since 1.18
         *
index a76b511..a78b082 100644 (file)
@@ -71,19 +71,7 @@ class ShortPagesPage extends QueryPage {
         * @param ResultWrapper $res
         */
        function preprocessResults( $db, $res ) {
-               # There's no point doing a batch check if we aren't caching results;
-               # the page must exist for it to have been pulled out of the table
-               if ( !$this->isCached() || !$res->numRows() ) {
-                       return;
-               }
-
-               $batch = new LinkBatch();
-               foreach ( $res as $row ) {
-                       $batch->add( $row->namespace, $row->title );
-               }
-               $batch->execute();
-
-               $res->seek( 0 );
+               $this->executeLBFromResultWrapper( $res );
        }
 
        function sortDescending() {
index 898d170..ea40cb8 100644 (file)
@@ -176,7 +176,7 @@ class SpecialTags extends SpecialPage {
                $newRow .= Xml::tags( 'td', null, Xml::element( 'code', null, $tag ) );
 
                $linkRenderer = $this->getLinkRenderer();
-               $disp = ChangeTags::tagDescription( $tag );
+               $disp = ChangeTags::tagDescription( $tag, $this->getContext() );
                if ( $showEditLinks ) {
                        $disp .= ' ';
                        $editLink = $linkRenderer->makeLink(
index 4c892b2..3b502f8 100644 (file)
@@ -145,6 +145,19 @@ class SpecialTrackingCategories extends SpecialPage {
                        ExtensionRegistry::getInstance()->getAttribute( 'TrackingCategories' ),
                        $this->getConfig()->get( 'TrackingCategories' ) // deprecated
                );
+
+               // Only show magic link tracking categories if they are enabled
+               $enableMagicLinks = $this->getConfig()->get( 'EnableMagicLinks' );
+               if ( $enableMagicLinks['ISBN'] ) {
+                       $categories[] = 'magiclink-tracking-isbn';
+               }
+               if ( $enableMagicLinks['RFC'] ) {
+                       $categories[] = 'magiclink-tracking-rfc';
+               }
+               if ( $enableMagicLinks['PMID'] ) {
+                       $categories[] = 'magiclink-tracking-pmid';
+               }
+
                $trackingCategories = [];
                foreach ( $categories as $catMsg ) {
                        /*
index 45efaf3..88c0e21 100644 (file)
@@ -76,4 +76,8 @@ class UnusedCategoriesPage extends QueryPage {
        protected function getGroupName() {
                return 'maintenance';
        }
+
+       public function preprocessResults( $db, $res ) {
+               $this->executeLBFromResultWrapper( $res );
+       }
 }
index df57744..ae375b2 100644 (file)
@@ -43,7 +43,28 @@ class UnwatchedpagesPage extends QueryPage {
                return false;
        }
 
+       /**
+        * Pre-cache page existence to speed up link generation
+        *
+        * @param IDatabase $db
+        * @param ResultWrapper $res
+        */
+       public function preprocessResults( $db, $res ) {
+               if ( !$res->numRows() ) {
+                       return;
+               }
+
+               $batch = new LinkBatch();
+               foreach ( $res as $row ) {
+                       $batch->add( $row->namespace, $row->title );
+               }
+               $batch->execute();
+
+               $res->seek( 0 );
+       }
+
        public function getQueryInfo() {
+               $dbr = wfGetDB( DB_REPLICA );
                return [
                        'tables' => [ 'page', 'watchlist' ],
                        'fields' => [
@@ -54,7 +75,7 @@ class UnwatchedpagesPage extends QueryPage {
                        'conds' => [
                                'wl_title IS NULL',
                                'page_is_redirect' => 0,
-                               "page_namespace != '" . NS_MEDIAWIKI . "'"
+                               'page_namespace != ' . $dbr->addQuotes( NS_MEDIAWIKI ),
                        ],
                        'join_conds' => [ 'watchlist' => [
                                'LEFT JOIN', [ 'wl_title = page_title',
index 9573f33..8478e94 100644 (file)
@@ -60,7 +60,7 @@ class SpecialUploadStash extends UnlistedSpecialPage {
         * Execute page -- can output a file directly or show a listing of them.
         *
         * @param string $subPage Subpage, e.g. in
-        *   http://example.com/wiki/Special:UploadStash/foo.jpg, the "foo.jpg" part
+        *   https://example.com/wiki/Special:UploadStash/foo.jpg, the "foo.jpg" part
         * @return bool Success
         */
        public function execute( $subPage ) {
index 76b721c..c37ecbd 100644 (file)
@@ -49,6 +49,7 @@ class WantedPagesPage extends WantedQueryPage {
        }
 
        function getQueryInfo() {
+               $dbr = wfGetDB( DB_REPLICA );
                $count = $this->getConfig()->get( 'WantedPagesThreshold' ) - 1;
                $query = [
                        'tables' => [
@@ -63,13 +64,13 @@ class WantedPagesPage extends WantedQueryPage {
                        ],
                        'conds' => [
                                'pg1.page_namespace IS NULL',
-                               "pl_namespace NOT IN ( '" . NS_USER . "', '" . NS_USER_TALK . "' )",
-                               "pg2.page_namespace != '" . NS_MEDIAWIKI . "'"
+                               'pl_namespace NOT IN (' . $dbr->makeList( [ NS_USER, NS_USER_TALK ] ) . ')',
+                               'pg2.page_namespace != ' . $dbr->addQuotes( NS_MEDIAWIKI ),
                        ],
                        'options' => [
                                'HAVING' => [
-                                       "COUNT(*) > $count",
-                                       "COUNT(*) > SUM(pg2.page_is_redirect)"
+                                       'COUNT(*) > ' . $dbr->addQuotes( $count ),
+                                       'COUNT(*) > SUM(pg2.page_is_redirect)'
                                ],
                                'GROUP BY' => [ 'pl_namespace', 'pl_title' ]
                        ],
index 73ab0ad..ea906b7 100644 (file)
@@ -36,14 +36,9 @@ class ActiveUsersPager extends UsersPager {
        protected $opts;
 
        /**
-        * @var array
-        */
-       protected $hideGroups = [];
-
-       /**
-        * @var array
+        * @var string[]
         */
-       protected $hideRights = [];
+       protected $groups;
 
        /**
         * @var array
@@ -68,12 +63,7 @@ class ActiveUsersPager extends UsersPager {
                        }
                }
 
-               if ( $opts->getValue( 'hidebots' ) == 1 ) {
-                       $this->hideRights[] = 'bot';
-               }
-               if ( $opts->getValue( 'hidesysops' ) == 1 ) {
-                       $this->hideGroups[] = 'sysop';
-               }
+               $this->groups = $opts->getValue( 'groups' );
        }
 
        function getIndexField() {
@@ -85,6 +75,7 @@ class ActiveUsersPager extends UsersPager {
 
                $activeUserSeconds = $this->getConfig()->get( 'ActiveUserDays' ) * 86400;
                $timestamp = $dbr->timestamp( wfTimestamp( TS_UNIX ) - $activeUserSeconds );
+               $tables = [ 'querycachetwo', 'user', 'recentchanges' ];
                $conds = [
                        'qcc_type' => 'activeusers',
                        'qcc_namespace' => NS_USER,
@@ -98,6 +89,11 @@ class ActiveUsersPager extends UsersPager {
                if ( $this->requestedUser != '' ) {
                        $conds[] = 'qcc_title >= ' . $dbr->addQuotes( $this->requestedUser );
                }
+               if ( $this->groups !== [] ) {
+                       $tables[] = 'user_groups';
+                       $conds[] = 'ug_user = user_id';
+                       $conds['ug_group'] = $this->groups;
+               }
                if ( !$this->getUser()->isAllowed( 'hideuser' ) ) {
                        $conds[] = 'NOT EXISTS (' . $dbr->selectSQLText(
                                        'ipblocks', '1', [ 'ipb_user=user_id', 'ipb_deleted' => 1 ]
@@ -111,7 +107,7 @@ class ActiveUsersPager extends UsersPager {
                }
 
                return [
-                       'tables' => [ 'querycachetwo', 'user', 'recentchanges' ],
+                       'tables' => $tables,
                        'fields' => [ 'user_name', 'user_id', 'recentedits' => 'COUNT(*)', 'qcc_title' ],
                        'options' => $options,
                        'conds' => $conds
@@ -154,26 +150,8 @@ class ActiveUsersPager extends UsersPager {
                $list = [];
                $user = User::newFromId( $row->user_id );
 
-               // User right filter
-               foreach ( $this->hideRights as $right ) {
-                       // Calling User::getRights() within the loop so that
-                       // if the hideRights() filter is empty, we don't have to
-                       // trigger the lazy-init of the big userrights array in the
-                       // User object
-                       if ( in_array( $right, $user->getRights() ) ) {
-                               return '';
-                       }
-               }
-
-               // User group filter
-               // Note: This is a different loop than for user rights,
-               // because we're reusing it to build the group links
-               // at the same time
                $groups_list = self::getGroups( intval( $row->user_id ), $this->userGroupCache );
                foreach ( $groups_list as $group ) {
-                       if ( in_array( $group, $this->hideGroups ) ) {
-                               return '';
-                       }
                        $list[] = self::buildGroupLink( $group, $userName );
                }
 
index 2d39f99..e298f10 100644 (file)
@@ -48,6 +48,15 @@ class NewPagesPager extends ReverseChronologicalPager {
                $username = $this->opts->getValue( 'username' );
                $user = Title::makeTitleSafe( NS_USER, $username );
 
+               $size = abs( intval( $this->opts->getValue( 'size' ) ) );
+               if ( $size > 0 ) {
+                       if ( $this->opts->getValue( 'size-mode' ) === 'max' ) {
+                               $conds[] = 'page_len <= ' . $size;
+                       } else {
+                               $conds[] = 'page_len >= ' . $size;
+                       }
+               }
+
                $rcIndexes = [];
 
                if ( $namespace !== false ) {
index 1ce14b6..e5642d9 100644 (file)
@@ -32,7 +32,7 @@ class RaggettInternalPHP extends RaggettBase {
                $retval = $tidy->getStatus();
                if ( $retval == 2 ) {
                        // 2 is magic number for fatal error
-                       // http://www.php.net/manual/en/function.tidy-get-status.php
+                       // https://secure.php.net/manual/en/tidy.getstatus.php
                        $cleansource = null;
                } else {
                        $cleansource = tidy_get_output( $tidy );
index 91b4133..ea6ef30 100644 (file)
@@ -1440,7 +1440,11 @@ abstract class UploadBase {
                        'http://www.w3.org/tr/rec-rdf-syntax/',
                ];
 
-               if ( !in_array( $namespace, $validNamespaces ) ) {
+               // Inkscape mangles namespace definitions created by Adobe Illustrator.
+               // This is nasty but harmless. (T144827)
+               $isBuggyInkscape = preg_match( '/^&(#38;)*ns_[a-z_]+;$/', $namespace );
+
+               if ( !( $isBuggyInkscape || in_array( $namespace, $validNamespaces ) ) ) {
                        wfDebug( __METHOD__ . ": Non-svg namespace '$namespace' in uploaded file.\n" );
                        /** @todo Return a status object to a closure in XmlTypeCheck, for MW1.21+ */
                        $this->mSVGNSError = $namespace;
@@ -1503,6 +1507,7 @@ abstract class UploadBase {
                        # fragment links are allowed. For all other tags, only data:
                        # and fragment are allowed.
                        if ( $stripped == 'href'
+                               && $value !== ''
                                && strpos( $value, 'data:' ) !== 0
                                && strpos( $value, '#' ) !== 0
                        ) {
index 92a65f0..273d555 100644 (file)
@@ -1658,7 +1658,6 @@ class User implements IDBAccessObject {
 
                // Extensions
                Hooks::run( 'GetBlockedStatus', [ &$this ] );
-
        }
 
        /**
@@ -1690,9 +1689,8 @@ class User implements IDBAccessObject {
         * @return bool True if blacklisted.
         */
        public function inDnsBlacklist( $ip, $bases ) {
-
                $found = false;
-               // @todo FIXME: IPv6 ???  (http://bugs.php.net/bug.php?id=33170)
+               // @todo FIXME: IPv6 ???  (https://bugs.php.net/bug.php?id=33170)
                if ( IP::isIPv4( $ip ) ) {
                        // Reverse IP, bug 21255
                        $ipReversed = implode( '.', array_reverse( explode( '.', $ip ) ) );
index 95b4463..c6d1a54 100644 (file)
@@ -56,13 +56,13 @@ class UIDGenerator {
                if ( !preg_match( '/^[0-9a-f]{12}$/i', $nodeId ) ) {
                        MediaWiki\suppressWarnings();
                        if ( wfIsWindows() ) {
-                               // http://technet.microsoft.com/en-us/library/bb490913.aspx
+                               // https://technet.microsoft.com/en-us/library/bb490913.aspx
                                $csv = trim( wfShellExec( 'getmac /NH /FO CSV' ) );
                                $line = substr( $csv, 0, strcspn( $csv, "\n" ) );
                                $info = str_getcsv( $line );
                                $nodeId = isset( $info[0] ) ? str_replace( '-', '', $info[0] ) : '';
                        } elseif ( is_executable( '/sbin/ifconfig' ) ) { // Linux/BSD/Solaris/OS X
-                               // See http://linux.die.net/man/8/ifconfig
+                               // See https://linux.die.net/man/8/ifconfig
                                $m = [];
                                preg_match( '/\s([0-9a-f]{2}(:[0-9a-f]{2}){5})\s/',
                                        wfShellExec( '/sbin/ifconfig -a' ), $m );
@@ -517,7 +517,7 @@ class UIDGenerator {
        protected function timeWaitUntil( array $time ) {
                do {
                        $ct = self::millitime();
-                       if ( $ct >= $time ) { // http://php.net/manual/en/language.operators.comparison.php
+                       if ( $ct >= $time ) { // https://secure.php.net/manual/en/language.operators.comparison.php
                                return $ct; // current timestamp is higher than $time
                        }
                } while ( ( ( $time[0] - $ct[0] ) * 1000 + ( $time[1] - $ct[1] ) ) <= 10 );
@@ -554,9 +554,9 @@ class UIDGenerator {
                        $ts = ( 1000 * $sec + $msec ) * 10000 + (int)$offset + $delta;
                        $id_bin = str_pad( decbin( $ts % pow( 2, 60 ) ), 60, '0', STR_PAD_LEFT );
                } elseif ( extension_loaded( 'gmp' ) ) {
-                       $ts = gmp_add( gmp_mul( (string) $sec, '1000' ), (string) $msec ); // ms
+                       $ts = gmp_add( gmp_mul( (string)$sec, '1000' ), (string)$msec ); // ms
                        $ts = gmp_add( gmp_mul( $ts, '10000' ), $offset ); // 100ns intervals
-                       $ts = gmp_add( $ts, (string) $delta );
+                       $ts = gmp_add( $ts, (string)$delta );
                        $ts = gmp_mod( $ts, gmp_pow( '2', '60' ) ); // wrap around
                        $id_bin = str_pad( gmp_strval( $ts, 2 ), 60, '0', STR_PAD_LEFT );
                } elseif ( extension_loaded( 'bcmath' ) ) {
index ca188ba..2490b9d 100644 (file)
@@ -5,6 +5,7 @@ Bartosz Dziewoński <bdziewonski@wikimedia.org>
 Brad Jorsch <bjorsch@wikimedia.org>
 Ed Sanders <esanders@wikimedia.org>
 Florian Schmidt <florian.schmidt.welzow@t-online.de>
+Geoffrey Mon <geofbot@gmail.com>
 James D. Forrester <jforrester@wikimedia.org>
 Roan Kattouw <roan@wikimedia.org>
 Sucheta Ghoshal <sghoshal@wikimedia.org>
diff --git a/includes/widget/DateInputWidget.php b/includes/widget/DateInputWidget.php
new file mode 100644 (file)
index 0000000..f011f0b
--- /dev/null
@@ -0,0 +1,165 @@
+<?php
+/**
+ * MediaWiki Widgets – DateInputWidget class.
+ *
+ * @copyright 2016 MediaWiki Widgets Team and others; see AUTHORS.txt
+ * @license The MIT License (MIT); see LICENSE.txt
+ */
+
+namespace MediaWiki\Widget;
+
+use DateTime;
+
+/**
+ * Date input widget.
+ *
+ * @since 1.29
+ */
+class DateInputWidget extends \OOUI\TextInputWidget {
+
+       protected $inputFormat = null;
+       protected $displayFormat = null;
+       protected $placeholderLabel = null;
+       protected $placeholderDateFormat = null;
+       protected $precision = null;
+       protected $mustBeAfter = null;
+       protected $mustBeBefore = null;
+       protected $overlay = null;
+
+       /**
+        * @param array $config Configuration options
+        * @param string $config['inputFormat'] Date format string to use for the textual input field.
+        *   Displayed while the widget is active, and the user can type in a date in this format.
+        *   Should be short and easy to type. (default: 'YYYY-MM-DD' or 'YYYY-MM', depending on
+        *   `precision`)
+        * @param string $config['displayFormat'] Date format string to use for the clickable label.
+        *   while the widget is inactive. Should be as unambiguous as possible (for example, prefer
+        *   to spell out the month, rather than rely on the order), even if that makes it longer.
+        *   Applicable only if the widget is infused. (default: language-specific)
+        * @param string $config['placeholderLabel'] Placeholder text shown when the widget is not
+        *   selected. Applicable only if the widget is infused. (default: taken from message
+        *   `mw-widgets-dateinput-no-date`)
+        * @param string $config['placeholderDateFormat'] User-visible date format string displayed
+        *   in the textual input field when it's empty. Should be the same as `inputFormat`, but
+        *   translated to the user's language. (default: 'YYYY-MM-DD' or 'YYYY-MM', depending on
+        *   `precision`)
+        * @param string $config['precision'] Date precision to use, 'day' or 'month' (default: 'day')
+        * @param string $config['mustBeAfter'] Validates the date to be after this.
+        *   In the 'YYYY-MM-DD' or 'YYYY-MM' format, depending on `precision`.
+        * @param string $config['mustBeBefore'] Validates the date to be before this.
+        *   In the 'YYYY-MM-DD' or 'YYYY-MM' format, depending on `precision`.
+        * @param string $config['overlay'] The jQuery selector for the overlay layer on which to render
+        *   the calendar. This configuration is useful in cases where the expanded calendar is larger
+        *   than its container. The specified overlay layer is usually on top of the container and has
+        *   a larger area. Applicable only if the widget is infused. By default, the calendar uses
+        *   relative positioning.
+        */
+       public function __construct( array $config = [] ) {
+               $config = array_merge( [
+                       // Default config values
+                       'precision' => 'day',
+               ], $config );
+
+               // Properties
+               if ( isset( $config['inputFormat'] ) ) {
+                       $this->inputFormat = $config['inputFormat'];
+               }
+               if ( isset( $config['placeholderDateFormat'] ) ) {
+                       $this->placeholderDateFormat = $config['placeholderDateFormat'];
+               }
+               $this->precision = $config['precision'];
+               if ( isset( $config['mustBeAfter'] ) ) {
+                       $this->mustBeAfter = $config['mustBeAfter'];
+               }
+               if ( isset( $config['mustBeBefore'] ) ) {
+                       $this->mustBeBefore = $config['mustBeBefore'];
+               }
+
+               // Properties stored for the infused JS widget
+               if ( isset( $config['displayFormat'] ) ) {
+                       $this->displayFormat = $config['displayFormat'];
+               }
+               if ( isset( $config['placeholderLabel'] ) ) {
+                       $this->placeholderLabel = $config['placeholderLabel'];
+               }
+               if ( isset( $config['overlay'] ) ) {
+                       $this->overlay = $config['overlay'];
+               }
+
+               // Set up placeholder text visible if the browser doesn't override it (logic taken from JS)
+               if ( $this->placeholderDateFormat !== null ) {
+                       $placeholder = $this->placeholderDateFormat;
+               } elseif ( $this->inputFormat !== null ) {
+                       // We have no way to display a translated placeholder for custom formats
+                       $placeholder = '';
+               } else {
+                       $placeholder = wfMessage( "mw-widgets-dateinput-placeholder-$this->precision" )->text();
+               }
+
+               $config = array_merge( [
+                       // Processed config values
+                       'placeholder' => $placeholder,
+               ], $config );
+
+               // Parent constructor
+               parent::__construct( $config );
+
+               // Calculate min/max attributes (which are skipped by TextInputWidget) and add to <input>
+               // min/max attributes are inclusive, but mustBeAfter/Before are exclusive
+               if ( $this->mustBeAfter !== null ) {
+                       $min = new DateTime( $this->mustBeAfter );
+                       $min = $min->modify( '+1 day' );
+                       $min = $min->format( 'Y-m-d' );
+                       $this->input->setAttributes( [ 'min' => $min ] );
+               }
+               if ( $this->mustBeBefore !== null ) {
+                       $max = new DateTime( $this->mustBeBefore );
+                       $max = $max->modify( '-1 day' );
+                       $max = $max->format( 'Y-m-d' );
+                       $this->input->setAttributes( [ 'max' => $max ] );
+               }
+
+               // Initialization
+               $this->addClasses( [ 'mw-widget-dateInputWidget' ] );
+       }
+
+       protected function getJavaScriptClassName() {
+               return 'mw.widgets.DateInputWidget';
+       }
+
+       public function getConfig( &$config ) {
+               if ( $this->inputFormat !== null ) {
+                       $config['inputFormat'] = $this->inputFormat;
+               }
+               if ( $this->displayFormat !== null ) {
+                       $config['displayFormat'] = $this->displayFormat;
+               }
+               if ( $this->placeholderLabel !== null ) {
+                       $config['placeholderLabel'] = $this->placeholderLabel;
+               }
+               if ( $this->placeholderDateFormat !== null ) {
+                       $config['placeholderDateFormat'] = $this->placeholderDateFormat;
+               }
+               if ( $this->precision !== null ) {
+                       $config['precision'] = $this->precision;
+               }
+               if ( $this->mustBeAfter !== null ) {
+                       $config['mustBeAfter'] = $this->mustBeAfter;
+               }
+               if ( $this->mustBeBefore !== null ) {
+                       $config['mustBeBefore'] = $this->mustBeBefore;
+               }
+               if ( $this->overlay !== null ) {
+                       $config['overlay'] = $this->overlay;
+               }
+               return parent::getConfig( $config );
+       }
+
+       public function getInputElement( $config ) {
+               // Inserts date/month type attribute
+               return parent::getInputElement( $config )
+                       ->setAttributes( [
+                               'type' => ( $config['precision'] === 'month' ) ? 'month' : 'date'
+                       ] );
+       }
+}
index fc91443..886ee94 100644 (file)
@@ -186,7 +186,6 @@ class SrConverter extends LanguageConverter {
                } else {
                        return false;
                }
-
        }
 
 }
index d9111a6..e1099f8 100644 (file)
@@ -174,7 +174,6 @@ class LanguageZh extends LanguageZh_hans {
         * @return string
         */
        function normalizeForSearch( $string, $autoVariant = 'zh-hans' ) {
-
                // always convert to zh-hans before indexing. it should be
                // better to use zh-hans for search, since conversion from
                // Traditional to Simplified is less ambiguous than the
@@ -183,7 +182,6 @@ class LanguageZh extends LanguageZh_hans {
                // LanguageZh_hans::normalizeForSearch
                $s = parent::normalizeForSearch( $s );
                return $s;
-
        }
 
        /**
index 6bc5553..e7415f5 100644 (file)
@@ -43,7 +43,7 @@
        "tog-enotifminoredits": "Sendan mē spearcǣrend þǣr trametas oþþe ymelan sīen efne lyt andwended.",
        "tog-enotifrevealaddr": "Īwan mīnne spearcǣrenda naman on gecȳðendum spearcǣrendum",
        "tog-shownumberswatching": "Īwan þæt rīm behealdendra brūcenda",
-       "tog-oldsig": "Genge selfmearc:",
+       "tog-oldsig": "Þin genge handseten:",
        "tog-fancysig": "Dōn selfmearce tō wikitexte (lēas ǣr gedōnes hlencan)",
        "tog-uselivepreview": "Notian rihte īwedre forebysene",
        "tog-forceeditsummary": "Cȳðan mē þǣr ic ne wrīte adihtunge sceortnesse",
@@ -53,6 +53,7 @@
        "tog-watchlisthideliu": "Hȳdan adihtunga fram inmeldodum brūcendum wiþ þæt behealdungtæl",
        "tog-watchlisthideanons": "Hȳdan adihtunga fram uncūðum brūcendum wiþ þæt behealdungtæl",
        "tog-watchlisthidepatrolled": "Hȳdan weardoda adihtunga wiþ þæt behealdungtæl",
+       "tog-watchlisthidecategorization": "Ahȳd trameta floccnaman",
        "tog-ccmeonemails": "Sendan mē gelīcnessa þāra spearcǣrenda þe ic ōðrum brūcendum sende",
        "tog-diffonly": "Nā īwan trametes innunge under scādungum",
        "tog-showhiddencats": "Īwan gehȳdede floccas",
        "newwindow": "(openaþ in nīwum ēagþyrele)",
        "cancel": "Undōn",
        "moredotdotdot": "Mā...",
-       "morenotlisted": "Þis getæl nis fulfyled.",
+       "morenotlisted": "Þis getæl meaht bēon unfulfyled.",
        "mypage": "Mīn tramet",
        "mytalk": "Mīn mōtung",
        "anontalk": "Þisses IP naman mōtung",
        "wrongpasswordempty": "Þū ne write nǣnig þafungword. \nSēc þū eft lā.",
        "passwordtooshort": "Þafungword sculon habban læst {{PLURAL:$1|1 stafan|$1 stafena}}.",
        "passwordtoolong": "Þafungword ne cunnon wesan lengran þonne {{PLURAL:$1|1 stafa|$1 stafena}}.",
+       "passwordtoopopular": "Swiðe gewunelice gelēafnesword ne mæg man brūcan. Cies anliepe gelēafnesword.",
        "password-name-match": "Þīn þafungword sceal wesan ungelīc þīnum brūcendes naman.",
        "password-login-forbidden": "Sēo nytt þisses brūcendes naman and þafungwordes nis gelīfed.",
        "mailmypassword": "Settan þafungword eft",
        "passwordremindertitle": "Nīwe hwīlendlic þafungword for {{SITENAME}}",
        "noemail": "Þær nis nǣnig spearcǣrenda nama gewriten for \"$1\" brūcende.",
        "noemailcreate": "Þū þearft wrītan gengne spearcǣrenda naman.",
-       "blocked-mailpassword": "Þīn IP nama is fortȳned and ne cann adihtan; þæs ne cann  hit brūcan þone þafungworda eftgemyndgunge tōl swā þæt man ne miswende hine.",
+       "passwordsent": "Niw gelēafnesword habbaþ we gesended þæm ærendgewrites hamsteall in ūr nambrede for \"$1\".",
+       "blocked-mailpassword": "Þīn IP nama is fortȳned and ne mæg adihtan. To þam þæt man ne mæg miswendan, man ne mōt brūcan gelēafneswordforfang fram þissum IP stede.",
        "acct_creation_throttle_hit": "Nēosiende tō þissum wici, þe þīnne IP-Stōwe brȳcþ, hæfþ gesett {{PLURAL:$1|1 hordcleofan|$1 hordcleofan}} in þǣm læsten dæge. Þu ne canst settan ǣnige māran. Þǣrfram ne cunnon Nēosiende, þe þisne IP-Stōwe brȳcþ, settan ǣnige hordcleofan māran on þisse handhwīle.",
        "accountcreated": "Scōp reccinge",
        "loginlanguagelabel": "Sprǣc: $1",
index fb331b8..9c3698b 100644 (file)
@@ -68,7 +68,8 @@
                        "بدارين",
                        "باسم",
                        "Moud hosny",
-                       "ديفيد"
+                       "ديفيد",
+                       "Super ninja2"
                ]
        },
        "tog-underline": "سطر تحت الوصلات:",
        "mergehistory-from": "الصفحة المصدر:",
        "mergehistory-into": "الصفحة الهدف:",
        "mergehistory-list": "تاريخ التعديل القابل للدمج",
-       "mergehistory-merge": "المراجعات التالية من [[:$1]] يمكن دمجها إلى [[:$2]].\nاستخدم عامود الصناديق لدمج المراجعات التي تم إنشاؤها في وقبل الوقت المحدد.\nلاحظ أن استخدام وصلات التصفح سيعيد ضبط هذا العامود.",
+       "mergehistory-merge": "المراجعات التالية من [[:$1]] يمكن دمجها إلى [[:$2]].\nاستخدم عمود الصناديق لدمج المراجعات التي تم إنشاؤها في وقبل الوقت المحدد.\nلاحظ أن استخدام وصلات التصفح سيعيد ضبط هذا العمود.",
        "mergehistory-go": "عرض التعديلات القابلة للدمج",
        "mergehistory-submit": "دمج المراجعات",
        "mergehistory-empty": "لا مراجعات يمكن دمجها.",
        "grant-basic": "الصلاحيات الأساسية",
        "grant-viewdeleted": "عرض الملفات والصفحات المحذوفة",
        "grant-viewmywatchlist": "عرض قائمة مراقبتك",
+       "grant-viewrestrictedlogs": "عرض مدخلات السجل المحظورة",
        "newuserlogpage": "سجل إنشاء المستخدمين",
        "newuserlogpagetext": "هذا سجل بعمليات إنشاء المستخدمين.",
        "rightslog": "سجل صلاحيات المستخدمين",
        "activeusers-intro": "هذه قائمة بالمستخدمين الذين مارسوا نوعا من النشاط خلال {{PLURAL:$1||اليوم الماضي|اليومين الماضيين|ال$1 أيام الماضية|ال$1 يوما ماضيا|ال$1 يوم ماضي}}.",
        "activeusers-count": "{{PLURAL:$1|لا أفعال|فعل واحد|فعلان اثنان|$1 أفعال|$1 فعلا|$1 فعل}} منذ {{PLURAL:$3||يوم|يومين|$3 أيام|$3 يوما|$1 يوم}}",
        "activeusers-from": "اعرض المستخدمين ابتداء من:",
-       "activeusers-hidebots": "أخف البوتات",
-       "activeusers-hidesysops": "أخف الإداريين",
+       "activeusers-groups": "عرض المستخدمين المنتمين للمجموعات:",
        "activeusers-noresult": "لم يعثر على أي مستخدمين",
        "activeusers-submit": "عرض المستخدمين النشطين",
        "listgrouprights": "صلاحيات مجموعات المستخدمين",
        "modifiedarticleprotection": "غير مستوى حماية \"[[$1]]\"",
        "unprotectedarticle": "أزال الحماية من \"[[$1]]\"",
        "movedarticleprotection": "نقل إعدادات الحماية من \"[[$2]]\" إلى \"[[$1]]\"",
+       "protectedarticle-comment": "{{الجنس:$2|محمي}} [[$1]]",
        "protect-title": "ضبط حماية \"$1\"",
        "protect-title-notallowed": "عرض مستوى حماية \"$1\"",
        "prot_1movedto2": "نُقلت [[$1]] إلى [[$2]]",
        "sp-contributions-blocked-notice-anon": "عنوان الأيبي هذا ممنوع حاليا.\nآخر مدخلة لسجل المنع معروضة هنا كمرجع:",
        "sp-contributions-search": "بحث عن مساهمات",
        "sp-contributions-username": "عنوان أيبي أو اسم مستخدم:",
-       "sp-contributions-toponly": "أظÙ\87ر Ø£Ø¹Ù\84Ù\89 Ø§Ù\84Ù\85راجعات فقط",
+       "sp-contributions-toponly": "أظÙ\87ر Ø§Ù\84Ù\86سخ Ø§Ù\84حاÙ\84Ù\8aØ© فقط",
        "sp-contributions-newonly": "أظهر إنشاء الصفحات فقط",
        "sp-contributions-hideminor": "أخف التعديلات الطفيفة",
        "sp-contributions-submit": "بحث",
index 6893166..dd96161 100644 (file)
        "articlepage": "Adkintun trokiñdungu wülngiñ",
        "talk": "Nütramkawün",
        "views": "Adngelün",
-       "toolbox": "Küdzawpeyüm",
+       "toolbox": "Küdawpeyüm",
        "userpage": "Adkintun kellufe ñi wülngiñ",
        "projectpage": "Adkintun zeumanzugu wülngiñ",
        "imagepage": "Adkintun ad wülngiñ",
        "yourname": "Tami üy",
        "yourpassword": "Tami kondungu",
        "yourpasswordagain": "Rüf feypinge nülawe:",
-       "remembermypassword": "Amulen tañi nülküwküleael tüfa mew (alürumechi $1 {{PLURAL:$1 antü}})",
        "login": "Konkülen",
        "nav-login-createaccount": "konkülen/dewman konün",
        "userlogin": "Konkülen/dewman konün",
index 78e4779..1ccee8e 100644 (file)
        "grant-basic": "Permisos básicos",
        "grant-viewdeleted": "Ver los ficheros y páxines desaniciaos",
        "grant-viewmywatchlist": "Ver la to llista de siguimientu",
+       "grant-viewrestrictedlogs": "Ver entraes acutaes del rexistru",
        "newuserlogpage": "Rexistru de creación d'usuarios",
        "newuserlogpagetext": "Esti ye un rexistru de creación d'usuarios.",
        "rightslog": "Rexistru de permisos d'usuariu",
        "booksources-search": "Buscar",
        "booksources-text": "Esta ye una llista d'enllaces a otros sitios que vienden llibros nuevos y usaos, y que puen tener más información sobre los llibros que ta buscando:",
        "booksources-invalid-isbn": "El códigu ISBN que puxisti nun paez que valga; mira que te vien copiáu de la fonte orixinal.",
+       "magiclink-tracking-rfc": "Páxines que usen enllaces máxicos RFC",
+       "magiclink-tracking-rfc-desc": "Esta páxina utiliza enllaces máxicos RFC. Consulta [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] pa saber como facer la migración.",
+       "magiclink-tracking-pmid": "Páxines qu'usen enllaces máxicos PMID",
+       "magiclink-tracking-pmid-desc": "Esta páxina utiliza enllaces máxicos PMID. Consulta [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] pa saber como facer la migración.",
+       "magiclink-tracking-isbn": "Páxines que usen enllaces máxicos ISBN",
+       "magiclink-tracking-isbn-desc": "Esta páxina utiliza enllaces máxicos ISBN. Consulta [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] pa saber como facer la migración.",
        "specialloguserlabel": "Fecho por:",
        "speciallogtitlelabel": "Oxetivu (títulu o {{ns:user}}:nome d'usuariu):",
        "log": "Rexistros",
        "activeusers-intro": "Esta ye una llista d'usuarios que tuvieron alguna mena d'actividá hai menos de $1 {{PLURAL:$1|día|díes}}.",
        "activeusers-count": "$1 {{PLURAL:$1|edición|ediciones}} {{PLURAL:$3|nel caberu día|nos caberos $3 díes}}",
        "activeusers-from": "Amosar usuarios principiando dende:",
-       "activeusers-hidebots": "Anubrir bots",
-       "activeusers-hidesysops": "Anubrir alministradores",
+       "activeusers-groups": "Amosar los usuarios que pertenecen a los grupos:",
        "activeusers-noresult": "Nun s'alcontraron usuarios.",
        "activeusers-submit": "Amosar los usuarios activos",
        "listgrouprights": "Drechos de los grupos d'usuariu",
        "modifiedarticleprotection": "camudó’l nivel de proteición de «[[$1]]»",
        "unprotectedarticle": "quitó-y la protección a \"[[$1]]\"",
        "movedarticleprotection": "treslladó los parámetros de proteición dende «[[$2]]» a «[[$1]]»",
+       "protectedarticle-comment": "{{GENDER:$2|Protexó}} «[[$1]]»",
+       "modifiedarticleprotection-comment": "{{GENDER:$2|Cambió'l nivel de protección}} pa «[[$1]]»",
+       "unprotectedarticle-comment": "{{GENDER:$2|Quitó la protección}} de «[[$1]]»",
        "protect-title": "Protexendo \"$1\"",
        "protect-title-notallowed": "Ver el nivel de proteición de «$1»",
        "prot_1movedto2": "[[$1]] treslladáu a [[$2]]",
index 76c2859..0f353de 100644 (file)
        "title-invalid-utf8": "ایسته‌نیلن صفحه‌نین آدیندا بیر یانلیش UTF-8 کاراکتِری وار.",
        "title-invalid-interwiki": "آختاردیٛغیٛنیٛز صفحه‌ آدیٛیٛندا بیر ایستیفاده‌ اوْلۇنا بیلمه‌‌ین اینتئر ویکی باغلانتیٛسیٛ وار.",
        "title-invalid-characters": "ایسته‌نیلن صفحه‌نین آدیندا، یانلیش کاراکتِرلر وار: «$1»",
-       "perfcached": "بÙ\88 Ø¨Û\8cÙ\84Ú¯Û\8cØ\8c Ú©Ù\8eØ´ Ø§Ù\88Ù\84Ù\88بâ\80\8cدÙ\88ر Ù\88 Ø§Ù\88Ù\84ا Ø¨Û\8cÙ\84ر Ú¯Ù\88Ù\86جÙ\84 اولماسین. چوخو {{PLURAL:$1|بیر نتیجه|$1 نتیجه}} کَش‌ده‌دیر.",
-       "perfcachedts": "بÙ\88 Ø¨Û\8cÙ\84Ú¯Û\8c Ú©Ù\8eØ´ Ø§Ù\88Ù\84Ù\88بâ\80\8cدÙ\88رØ\8c Ø³Ù\88Ù\86 Ø¯Ù\81عÙ\87 $1 Ù\88اختÛ\8cÙ\86دا Ú¯Ù\88Ù\86جÙ\84Û\8cبâ\80\8cدÛ\8cر. چوخو {{PLURAL:$4|بیر نتیجه|$4 نتیجه}} کَش‌ده‌دیر.",
-       "querypage-no-updates": "بو یارپاق‌دا گونجل‌له‌مک ایندی باغلانیب‌دیر.\nبورداکی بیلگیلر یئنی‌لشمیه‌جکلر.",
+       "perfcached": "بÙ\88 Ø¯Ø¦Û\8cتاØ\8c Ú©Ù\8eØ´ Ø§Ù\88Ù\84Ù\88بâ\80\8cدÙ\88ر Ù\88 Ø§Ù\88Ù\84ا Ø¨Û\8cÙ\84ر Ø¢Ù¾Ø¯Û\8cت اولماسین. چوخو {{PLURAL:$1|بیر نتیجه|$1 نتیجه}} کَش‌ده‌دیر.",
+       "perfcachedts": "بÙ\88 Ø¯Ø¦Û\8cتا Ú©Ù\8eØ´ Ø§Ù\88Ù\84Ù\88بâ\80\8cدÙ\88رØ\8c Ø³Ù\88Ù\86 Ø¯Ù\81عÙ\87 $1 Ù\88اختÛ\8cÙ\86دا Ø¢Ù¾Ø¯Û\8cÙ\86 Ø§Ù\88Ù\84Ù\88Ù\86Ù\88بدÙ\88ر. چوخو {{PLURAL:$4|بیر نتیجه|$4 نتیجه}} کَش‌ده‌دیر.",
+       "querypage-no-updates": "بو صفحه ده آپدیت ائتمک ایندی باغلانیب‌دیر.\nبورداکی دئیتا یئنی‌لشمیه‌جکلر.",
        "viewsource": "قایناغا باخ",
        "viewsource-title": "$1 اوچون قایناغا باخین",
        "actionthrottled": "سیزین چالیشمانیزین قاباغی آلیندی",
        "yourpasswordagain": "رمزی یئنی‌دن یازین:",
        "createacct-yourpasswordagain": "رمزی دوغرولایین",
        "createacct-yourpasswordagain-ph": "رمزی یئنی‌دن یازین",
-       "remembermypassword": "بو بیلگی‌سایاردا منیم گیریشیمی (چوخو $1 {{PLURAL:$1|گون}}ه قدر) یاددا ساخلا",
        "userlogin-remembermypassword": "منی ایچری‌ده ساخلا",
        "userlogin-signwithsecure": "آرخایین باغلانتی ایشلدین",
        "cannotloginnow-title": "ایندی گیریش اوْلونمازدیر",
        "undo-summary-username-hidden": "گیزلی ایستیفاده‌چی ایله ائدیلمیش $1 نوسخه‌سینی قایتارماق",
        "cantcreateaccount-text": "بو ای پی عنوانین‌دان ('$1) ایستیفاده‌چی حسابی یارادیلماسی [[User:$3|$3]] طرفین‌دن انگللنمیش‌دیر.\n\n$3 طرفین‌دن وئریلن سبب '$2",
        "cantcreateaccount-range-text": "<strong>$1</strong> آی‌پی آدرس آرالیغیندان حساب یارانماق، [[User:$3|$3]] ایشلدنی طرفیندن یاساقلانیب‌دیر. سیزین‌ده آی‌پی آدرسیز (<strong>$4</strong>) بو آرادادیر.\n\n$3 طرفین‌دن وئریلن سبب بودور: «$2»",
-       "viewpagelogs": "بۇ صفحه‌نین قئیدلرینه باخ",
+       "viewpagelogs": "بۇ صفحه‌نین ژورناللارینا باخ",
        "nohistory": "بو صحیفه اوچون دَییشدیرمه گئچمیشی یوخدور.",
        "currentrev": "سون نوسخه",
        "currentrev-asof": "$1 تاریخینه کیمی سون حال",
        "listduplicatedfiles-summary": "بۇرا، سوْن نۆسخه‌لری آیری بیر فایلین سوْن نۆسخه‌سی‌نین کوْپی‌سی اوْلان فایل‌لارین لیستیدیر. یالنیز یئرلی فایل‌لار گؤز آلتینا آلینیبلار.",
        "listduplicatedfiles-entry": "[[:File:$1|$1]]-ین [[$3|{{PLURAL:$2|بیر کوْپی‌سی|$2 کوْپی‌سی}}]] واردیر.",
        "unusedtemplates": "ایشلدیلمه‌میش شابلونلار",
-       "unusedtemplatestext": "بو صحیفه بوتون، {{ns:template}} آدفضاسیندا اولان و باشقا صحیفه‌لرده اولمایان صحیفه‌لری لیست ائدیر.\nشابلونلاری سیلمک‌دن اؤنجه، لوطفاً اونلارا اولان باشقا باغلانتیلاری یوخلایین.",
+       "unusedtemplatestext": "بو صفحه بوتون، {{ns:template}} آدفضاسیندا اولان و آیری صفحه‌لرده ایشلدیلمه‌میش صفحه‌لری لیست ائدیر.\nشابلونلاری سیلمک‌دن قاباق، لوطفاً اونلارا اولان آیری باغلانتیلاری یوخلایین.",
        "unusedtemplateswlh": "باشقا باغلانتیلار",
        "randompage": "تصادوفی صفحه",
        "randompage-nopages": "بو {{PLURAL:$2|آدفضاسیندا|آدفضالاریندا}} هئچ صحیفه یوخدور: $1.",
        "nrevisions": "{{PLURAL:$1|بیر|$1}} نوسخه",
        "nimagelinks": "$1 ده{{PLURAL:$1|صحیفه‌ده}}ایستیفاده اولونمور",
        "ntransclusions": "$1 ده{{PLURAL:$1|صحیفه‌ده}}ایستیفاده اولونور",
-       "specialpage-empty": "بو صحیفه بوشدور",
+       "specialpage-empty": "بو صفحه بوشدور.",
        "lonelypages": "يئتیم صفحه‌‌لر",
        "lonelypagestext": "آشاغی‌داکی صحیفه‌لره {{SITENAME}} سایتین‌داکی دیگر صحیفه‌لردن علاقه وئریلممیش یا دا چارپاز داخیل ائدیلممیش.",
        "uncategorizedpages": "بؤلمه‌سیز صفحه‌لر",
        "wantedpages": "ایسته‌نیلن صفحه‌لر",
        "wantedpages-badtitle": "مراجعت زامانتی يانلیش باشلیق: $1",
        "wantedfiles": "ایسته‌نیلن فایللار",
-       "wantedfiletext-cat": "آشاغیداکی فایل‌لار ایشله‌نیبلر اما یوخدورلار. ائشیک آنباردا اولان فایل‌لار دا اولدوقلارینا باخمایاراق، لیست‌ده گلیبلر. ائله یانلیش باخیشلار <del>خطلنه‌جکلر</del>. هم‌ده، اولمایان فایل‌لاری ایشلدن صحیفه‌لر ده [[:$1]]-ده لیست اولونوبلار.",
+       "wantedfiletext-cat": "آشاغیداکی فایل‌لار ایشله‌نیبلر اما یوخدورلار. ائشیک آنباردا اولان فایل‌لار دا اولدوقلارینا باخمایاراق، لیست‌ده گلیبلر. ائله خطالی باخیشلار <del>خطلنه‌جکلر</del>. هم‌ده، اولمایان فایل‌لاری ایشلدن صفحه‌لر ده [[:$1]]-ده لیست اولونوبلار.",
        "wantedfiletext-cat-noforeign": "آشاغی دا کی اولان فایل لار ایستفاده اولونور سانکی یوخدولار. بوندان اونجه فایل لاری اولموش صفحه لر [[:$1]] ده لیست اولوب لار.",
        "wantedfiletext-nocat": "اشاغی داکی فایل لار ایستفاده اولور سانکی یوخدولار.حتی مومکین دیر خارجی حویض مخزن لریندن اولماق  ایله بو ردا فهرست اولا . وهر مثب رتبه سی یانلیش <del> خط یئمیش اولاجاق.</del>",
        "wantedfiletext-nocat-noforeign": "آشاغی داکی فایل لار ایشلنیلیر سانکی یوخدورلار.",
        "usercreated": "$1 تاریخینده، ساعات $2-ده {{GENDER:$3|یارانیب‌دیر}}",
        "newpages": "يئنی صفحه‌لر",
        "newpages-username": "ایشلدن آدی:",
-       "ancientpages": "ان اسکی صفحه‌لر",
+       "ancientpages": "ان کؤهنه صفحه‌لر",
        "move": "آدینی دَییشدیر",
        "movethispage": "بو صحیفه‌‌نین آدینی ديَیشدیر",
-       "unusedimagestext": "آشاغی‌داکی فایل‌لار وار آنجاق هر هانسی بیر صحیفه‌ده باسدیریلمیش دئییل.\nخاهیش ائدیریک اونوتمایین کی، دیگر web سایت‌لاری بیر فایلا بیرباشا بیر اورل ایله علاقه وئره بیلر، و بونا گؤره ائففئکتیو ایستیفاده‌ده اولماسا بئله هله بورادا لیستنبیلیر.",
-       "unusedcategoriestext": "آشاغیدا اولان بولمه لر مؤوجود اولدوغو حالدا، هئچ بیر مادده یا دا بولمه لر طرفین‌دن ایستیفاده ائدیلمیر.",
+       "unusedimagestext": "آشاغی‌داکی فایل‌لار وار آنجاق هر هانسی بیر صفحه‌ده باسدیریلمیش دئییل.\nلوطفا یاددا ساخلایین کی، آیری وب سایت‌لاری بیر فایلا بیرباشا بیر اورل ایله باغلایا بیلر، و بونا گؤره چالیشقان ایشلتمه ده اولمازسا بئله هله بورادا لیستله نبیلیر.",
+       "unusedcategoriestext": "آشاغیدا اولان بولمه لر مؤوجود اولدوغو حالدا، هئچ بیر مقاله یوخسا بولمه لر طرفین‌دن ایشلدیلمیر.",
        "notargettitle": "وئریلمه‌يیب",
        "notargettext": "بو صحیفه یا یا کاربر حیاتا کئچیرمک اوچون بیر هدف صحیفه‌سی یا دا ایستیفاده‌چی‌سی بئلیرتمئدینیز.",
        "nopagetitle": "بئله هدف صحیفه‌سی یوخ‌دور",
        "activeusers-intro": "بۇرادا سوْن {{PLURAL:$1|بیر|$1}} گۆن‌ده دَییشدیرمه ائدن ایشلدن‌لرین لیستی گؤروشور.",
        "activeusers-count": "سون {{PLURAL:$3|گون|$3 گون}}‌ده، {{PLURAL:$1|$1}} چالیشما",
        "activeusers-from": "بۇندان باشلایان ایشلدن‌لری گؤستر:",
-       "activeusers-hidebots": "روْبات‌لاری گیزلت",
-       "activeusers-hidesysops": "ایداره‌چیلری گیزلت",
        "activeusers-noresult": "هئچ ایشلدن تاپیلمادی.",
        "activeusers-submit": "چالیشقان ایشلدن‌لری گؤستر",
        "listgrouprights": "ایستیفاده‌چی قروپ حاقلاری",
        "htmlform-title-not-exists": "$1 یوخدور.",
        "htmlform-user-not-exists": "<strong>$1</strong> یوخدور.",
        "htmlform-user-not-valid": "<strong>$1</strong> بیر دوزگون ایشلدن آدی دئییل.",
-       "sqlite-has-fts": "$1 بوتون یازی آختارما دستگی‌له",
-       "sqlite-no-fts": "$1 بوتون یازی آختارماماق‌لا",
        "logentry-delete-delete": "$1، $3 صفحه‌سینی {{GENDER:$2|سیلدی}}",
        "logentry-delete-restore": "$1، $3 صفحه‌سینی {{GENDER:$2|قایتاردی}}",
        "logentry-delete-event": "$1، $3-ده $5 سیاهی اولایینین {{PLURAL:$5|گؤرونوشونو|گؤرونوشلرینی}} {{GENDER:$2|دَییشدیردی}}: $4",
        "feedback-bugornote": "بیر تکنیکی خطانی شرح وئرمگه آماده اولساز، لوطفاً [$1 بیر باگ بیلدیرین].\nاو اولماسا، بو آشاغیداکی ساده فورم‌دان ایستیفاده ائده بیلرسینیز. سیزین باخیشینیز، ایستیفاده‌چی آدینیزلا، «[$3 $2]» صحیفه‌سینه آرتیریلاجاق‌دیر.",
        "feedback-cancel": "وازگئچ",
        "feedback-close": "اولدو",
-       "feedback-error-title": "خطا",
        "feedback-error1": "خطا: API-دان تانینمامیش نتیجه",
        "feedback-error2": "خطا: دَییشدیرمه باشاری‌سیز اولدو",
        "feedback-error3": "خطا: API-دان جاواب گلمه‌دی",
index 7077396..91eb57d 100644 (file)
        "missing-revision": "Вэрсія старонкі №$1 з назвай «{{FULLPAGENAME}}» не існуе.\n\nЗвычайна гэта здараецца з-за пераходу па састарэлай спасылцы на старонку, якая была выдаленая.\nПадрабязнасьці можна знайсьці ў [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале выдаленьняў].",
        "userpage-userdoesnotexist": "Рахунак удзельніка «$1» не зарэгістраваны. Калі ласка, удакладніце, ці жадаеце Вы стварыць/рэдагаваць гэтую старонку.",
        "userpage-userdoesnotexist-view": "Рахунак «$1» ня створаны.",
-       "blocked-notice-logextract": "Гэты ўдзельнік у дадзены момант заблякаваны.\nАпошні запіс з журналу блякаваньняў пададзены ніжэй для даведкі:",
+       "blocked-notice-logextract": "Гэты ўдзельнік у цяперашні момант заблякаваны.\nАпошні запіс з журналу блякаваньняў пададзены ніжэй для даведкі:",
        "clearyourcache": "<strong>Заўвага:</strong> каб пабачыць зьмены пасьля захаваньня, Вам можа спатрэбіцца ачысьціць кэш Вашага браўзэра. \n* <strong>Firefox / Safari:</strong> трымайце <em>Shift</em> і націсьніце <em>Reload</em>, ці націсьніце <em>Ctrl-F5</em> ці <em>Ctrl-R</em> (<em>⌘-R</em> на Mac)\n* <strong>Google Chrome:</strong> націсьніце <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> на Mac)\n* <strong>Internet Explorer:</strong> трымайце <em>Ctrl</em> і націсьніце <em>Refresh</em>, ці націсьніце <em>Ctrl-F5</em>\n* <strong>Opera:</strong> перайдзіце ў <em>Menu → Settings</em> (<em>Opera → Preferences</em> на Mac), а потым у <em>Privacy & security → Clear browsing data → Cached images and files</em>.",
        "usercssyoucanpreview": "'''Падказка:''' выкарыстоўвайце кнопку «{{int:showpreview}}», каб паспрабаваць новы код CSS перад тым як яго запісаць.",
        "userjsyoucanpreview": "'''Падказка:''' выкарыстоўвайце кнопку «{{int:showpreview}}», каб паспрабаваць новы код JavaScript перад тым, як яго запісаць.",
        "grant-basic": "Асноўныя правы",
        "grant-viewdeleted": "Прагляд выдаленых файлаў і старонак",
        "grant-viewmywatchlist": "Прагляд вашага сьпісу назіраньня",
+       "grant-viewrestrictedlogs": "Прагляд запісаў журнала з абмежаваным доступам",
        "newuserlogpage": "Журнал стварэньня рахункаў",
        "newuserlogpagetext": "Гэта журнал стварэньня рахункаў удзельнікаў і ўдзельніц.",
        "rightslog": "Журнал правоў удзельнікаў",
        "activeusers-intro": "Гэта сьпіс удзельнікаў, якія былі актыўнымі на працягу $1 {{PLURAL:$1|апошняга дня|апошніх дзён|апошніх дзён}}.",
        "activeusers-count": "$1 {{PLURAL:$1|дзеяньне|дзеяньні|дзеяньняў}} за $3 {{PLURAL:$3|апошні дзень|апошнія дні|апошніх дзён}}",
        "activeusers-from": "Паказваць ўдзельнікаў, пачынаючы з:",
-       "activeusers-hidebots": "Схаваць робатаў",
-       "activeusers-hidesysops": "Схаваць адміністратараў",
        "activeusers-noresult": "Удзельнікі ня знойдзеныя.",
        "activeusers-submit": "Паказаць актыўных удзельнікаў",
        "listgrouprights": "Правы групаў удзельнікаў",
index a3019e0..32e2e8a 100644 (file)
@@ -28,7 +28,8 @@
                        "Goshaproject",
                        "Nemo bis",
                        "SamGold",
-                       "Liashko"
+                       "Liashko",
+                       "Mechanizatar"
                ]
        },
        "tog-underline": "Падкрэсліваць спасылкі:",
        "missing-revision": "Няма версіі #$1 у старонкі з назвай \"{{FULLPAGENAME}}\".\n\nЗвычайна такое здараецца, калі прайсці па састарэлай спасылцы з гісторыі на старонку, якая была сцёрта.\nПадрабязнасці можна пабачыць у [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале сціранняў].",
        "userpage-userdoesnotexist": "Рахунак удзельніка \"<nowiki>$1</nowiki>\" не зарэгістраваны. Праверце, ці вы жадаеце стварыць або паправіць гэтую старонку.",
        "userpage-userdoesnotexist-view": "Уліковы запіс удзельніка \" $1 \"не зарэгістраваны.",
-       "blocked-notice-logextract": "Гэты карыстальнік у дадзены момант заблакаваны. \n Апошні запіс журнала блакіровак прыводзіцца ніжэй для даведкі:",
+       "blocked-notice-logextract": "Гэты карыстальнік у дадзены момант заблакаваны. \nАпошні запіс журнала блакіровак прыводзіцца ніжэй для даведкі:",
        "clearyourcache": "<strong>Заўвага:</strong> Пасля замацоўвання, вам можа спатрэбіцца ачыстка кэшу браўзера, каб убачыць унесеныя змяненні. \n*<strong>Firefox / Safari:</strong> націсніце <em>Reload</em>, утрымліваючы <em>Shift</em>, або націсніце <em>Ctrl-F5</em> ці <em>Ctrl-R</em> (<em>⌘-R</em> на Макінтошах)\n* <strong>Google Chrome</strong>: Націсніце <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> на Mac)\n* <strong>Internet Explorer</strong>: націсніце <em>Refresh</em>, утрымліваючы <em>Ctrl</em>, або націсніце <em>Ctrl-F5</em>\n* <strong>Opera:</strong> Увайдзіце <em>Menu → Settings</em> (<em>Opera → Preferences</em> на Mac), далей <em>Privacy & security → Clear browsing data → Cached images and files</em>.",
        "usercssyoucanpreview": "'''Парада:''' Карыстайцеся кнопкай \"''{{int:showpreview}}''\" для выпрабоўвання новага коду CSS ''перад тым'', як яго запісваць.",
        "userjsyoucanpreview": "'''Парада:''' Карыстайцеся кнопкай \"''{{int:showpreview}}''\" для выпрабоўвання новага коду JS ''перад тым'', як яго запісваць.",
        "searchprofile-advanced-tooltip": "Шукаць у дадатковых прасторах назваў",
        "search-result-size": "$1 ({{PLURAL:$2|1 слова|$2 словы|$2 словаў}})",
        "search-result-category-size": "{{PLURAL:$1|$1 элемент|$1 элемента|$1 элементаў}} ({{PLURAL:$2|$2 падкатэгорыя|$2 падкатэгорыі|$2 падкатэгорый}}, {{PLURAL:$3|$3 файл|$3 файла|$3 файлаў}})",
-       "search-redirect": "(перасылка $1)",
+       "search-redirect": "(перанакіраванне з $1)",
        "search-section": "(падраздзел $1)",
        "search-category": "(катэгорыя $1)",
        "search-file-match": "(адпавядае змесціву файла)",
        "grant-basic": "Асноўныя правы",
        "grant-viewdeleted": "Праглядаць сцёртыя файлы і старонкі",
        "grant-viewmywatchlist": "Бачыць ваш спіс назірання",
+       "grant-viewrestrictedlogs": "Прагляд запісаў журнала з абмежаваным доступам",
        "newuserlogpage": "Журнал рэгістрацыі ўдзельнікаў",
        "newuserlogpagetext": "Гэта журнал рэгістрацыі новых удзельнікаў.",
        "rightslog": "Журнал правоў удзельнікаў",
        "activeusers-intro": "Гэта пералік удзельнікаў, якія нешта рабілі за апошнія $1 {{PLURAL:$1|дзень|дзён}}.",
        "activeusers-count": "$1 {{PLURAL:$1|дзеянне|дзеянні|дзеянняў}} за апошні{{PLURAL:$3| дзень|я $3 дні|я $3 дзён}}",
        "activeusers-from": "Паказ, пачынаючы з:",
-       "activeusers-hidebots": "Без робатаў",
-       "activeusers-hidesysops": "Без адміністратараў",
        "activeusers-noresult": "Няма такіх удзельнікаў.",
        "activeusers-submit": "Паказаць актыўных удзельнікаў",
        "listgrouprights": "Дазволы для груп удзельнікаў",
        "feedback-submit": "Даслаць",
        "feedback-thanks": "Дзякуй! Ваш водгук размешчаны на старонцы «[$2 $1]».",
        "feedback-thanks-title": "Дзякуем!",
-       "searchsuggest-search": "Ð\97найÑ\81Ñ\86Ñ\96",
+       "searchsuggest-search": "ШÑ\83каÑ\86Ñ\8c Ñ\83 {{SITENAME}}",
        "searchsuggest-containing": "змяшчае...",
        "api-error-badaccess-groups": "У Вас няма дазволу загружаць файлы ў гэтую вікі.",
        "api-error-badtoken": "Унутраная памылка: няслушны ключ.",
index 399b439..e6b5d68 100644 (file)
@@ -37,7 +37,9 @@
                        "Ricordo.tenerissimo",
                        "Plamen",
                        "Iliev",
-                       "Spas.Z.Spasov"
+                       "Spas.Z.Spasov",
+                       "АдмиралАнимЕ",
+                       "Irus"
                ]
        },
        "tog-underline": "Подчертаване на препратките:",
@@ -89,8 +91,8 @@
        "editfont-style": "Стил на шрифта в кутията за редактиране:",
        "editfont-default": "По подразбиране за браузъра",
        "editfont-monospace": "Равноширок шрифт",
-       "editfont-sansserif": "Ð\91езÑ\81еÑ\80иÑ\84ен Ñ\88Ñ\80иÑ\84Ñ\82",
-       "editfont-serif": "СеÑ\80иÑ\84ен Ñ\88Ñ\80иÑ\84Ñ\82",
+       "editfont-sansserif": "ШÑ\80иÑ\84Ñ\82 Ð±ÐµÐ· Ð¸Ð·Ð²Ð¸Ð²ÐºÐ¸",
+       "editfont-serif": "ШÑ\80иÑ\84Ñ\82 Ñ\81 Ð¸Ð·Ð²Ð¸Ð²ÐºÐ¸",
        "sunday": "неделя",
        "monday": "понеделник",
        "tuesday": "вторник",
        "october-date": "$1 октомври",
        "november-date": "$1 ноември",
        "december-date": "$1 декември",
+       "period-am": "Преди обед",
+       "period-pm": "След обед",
        "pagecategories": "{{PLURAL:$1|Категория|Категории}}",
        "category_header": "Страници в категория „$1“",
        "subcategories": "Подкатегории",
        "qbpageoptions": "Тази страница",
        "qbmyoptions": "Моите страници",
        "faq": "ЧЗВ",
-       "faqpage": "Project:ЧЗВ",
+       "faqpage": "Проект:ЧЗВ",
        "actions": "Действия",
        "namespaces": "Именни пространства",
        "variants": "Варианти",
        "createacct-reason-ph": "Защо създавате друга сметка",
        "createacct-submit": "Създаване на сметката",
        "createacct-another-submit": "Създаване на сметка",
-       "createacct-continue-submit": "Продължаване създаването на акаунт",
-       "createacct-another-continue-submit": "Продължаване създаването на акаунт",
+       "createacct-continue-submit": "Продължаване създаването на сметка",
+       "createacct-another-continue-submit": "Продължаване създаването на сметка",
        "createacct-benefit-heading": "{{SITENAME}} се създава от хора като вас.",
        "createacct-benefit-body1": "{{PLURAL:$1|редакция|редакции}}",
        "createacct-benefit-body2": "{{PLURAL:$1|страница|страници}}",
        "passwordremindertitle": "Напомняне за парола от {{SITENAME}}",
        "passwordremindertext": "Някой (най-вероятно вие, от IP-адрес $1) е пожелал нова парола за влизане в {{SITENAME}} ($4).\nЗа потребител „$2“ е създадена временната парола „$3“.\nСега би трябвало да влезете в системата и да си изберете нова парола.\nНовата временна парола ще бъде активна {{PLURAL:$5|един ден|$5 дни}}.\n\nАко заявката е направена от друг или пък сте си спомнили паролата и не искате да я променяте, можете да пренебрегнете това съобщение и да продължите да използвате старата си парола.",
        "noemail": "Няма записана електронна поща за потребителя „$1“.",
-       "noemailcreate": "Необходимо е да въведете валиден адрес за е-поща",
+       "noemailcreate": "Необходимо е да въведете валиден адрес за ел. поща",
        "passwordsent": "Нова парола беше изпратена на електронната поща на „$1“.\nСлед като я получите, влезте отново.",
        "blocked-mailpassword": "Редактирането от Вашия IP-адрес е забранено, затова не Ви се позволява да използвате възможността за възстановяване на парола.",
        "eauthentsent": "Писмото за потвърждение е изпратено на посочения адрес. В него са описани действията, които трябва да се извършат, за да потвърдите, че този адрес за електронна поща действително е ваш.",
        "resettokens-resetbutton": "Изчистване на избраните маркери",
        "bold_sample": "Получер текст",
        "bold_tip": "Получер (удебелен) текст",
-       "italic_sample": "Ð\9aÑ\83Ñ\80Ñ\81ивен текст",
-       "italic_tip": "Ð\9aÑ\83Ñ\80Ñ\81ивен (наклонен) текст",
+       "italic_sample": "Ð\9dаклонен текст",
+       "italic_tip": "Ð\9dаклонен текст",
        "link_sample": "Име на препратка",
        "link_tip": "Вътрешна препратка",
        "extlink_sample": "http://www.example.com Текст на външната препратка",
        "grant-createaccount": "Създаване на сметки",
        "grant-createeditmovepage": "Създаване, редактиране и преместване на страници",
        "grant-delete": "Изтриване на страници, редакции и записи в дневника",
+       "grant-editinterface": "Редактиране на пространството нарича МедияУики и CSS/JavaScript участник",
        "grant-editmycssjs": "Редактиране на личния CSS/JavaScript",
        "grant-editmyoptions": "Редактиране на вашите потребителски настройки",
        "grant-editmywatchlist": "редактиране на списъка ви за наблюдение",
        "grant-editpage": "Редактиране на съществуващи страници",
        "grant-editprotected": "Редактиране на защитени страници",
+       "grant-highvolume": "Голям обем за редактиране",
+       "grant-oversight": "Скриване на участниците и версия страници",
+       "grant-patrol": "Патрулират промени страници",
+       "grant-privateinfo": "Достъп до лични информации",
+       "grant-protect": "Защита на незаштитени страници",
+       "grant-rollback": "Откатывать промени страници",
        "grant-sendemail": "Изпращане на имейл до други потребители",
        "grant-uploadeditmovefile": "Качване, заменяне и прехвърляне на файлове",
        "grant-uploadfile": "Качване на нови файлове",
        "activeusers-intro": "Това е списък на потребителите, които са демонстрирали някаква активност през {{PLURAL:$1|последния|последните}} $1 {{PLURAL:$1|ден|дни}}.",
        "activeusers-count": "$1 {{PLURAL:$1|действие|действия}} за {{PLURAL:$3|последния ден|последните $3 дни}}",
        "activeusers-from": "Показване на потребителите, започвайки от:",
-       "activeusers-hidebots": "Скриване на ботовете",
-       "activeusers-hidesysops": "Скриване на администраторите",
        "activeusers-noresult": "Няма намерени потребители.",
        "listgrouprights": "Права по потребителски групи",
        "listgrouprights-summary": "По-долу на тази страница е показан списък на групите потребители в това уики и права им за достъп. Допълнителна информация за отделните права може да бъде намерена [[{{MediaWiki:Listgrouprights-helppage}}|тук]].",
        "changecontentmodel-title-label": "Заглавие на страницата",
        "changecontentmodel-reason-label": "Причина:",
        "changecontentmodel-success-text": "Типът на съдържанието на [[:$1]] е успешно променен.",
+       "log-name-contentmodel": "Дневник на cъдържанието промяна модела",
+       "log-description-contentmodel": "Събития, отнасящи се до модели на съдържанието на страницата",
        "logentry-contentmodel-change-revertlink": "връщане",
        "logentry-contentmodel-change-revert": "връщане",
        "protectlogpage": "Дневник на защитата",
index a0b6220..45c7060 100644 (file)
        "yourpasswordagain": "پاسوردی تکرار کورتین",
        "createacct-yourpasswordagain": "پاسوردا تایید کورتین",
        "createacct-yourpasswordagain-ph": "پاسوردا پدا داخل کورتین دومین وارا",
-       "remembermypassword": "پاسورد یا چیهرگال ئا (تا حداکثر $1 {{PLURAL:$1|روچ|روچ}}) بئ ای بروزیري تا بسات",
        "userlogin-remembermypassword": "نا داخل بوتگ بسات",
        "userlogin-signwithsecure": "شه امنیت ئا استفاده بکنیت",
        "yourdomainname": "شمی دامنهٔ:",
        "passwordreset-emailtitle": "حسابئ مئلومات بی {{SITENAME}}",
        "passwordreset-emailelement": "کار زوروکئ نام: \n$1\n\nموقت ئین چیهرگال: \n$2",
        "passwordreset-emailsentemail": "یک ایمیل په چیهر گالئ  پاک بوتین  خاتیرا دیم داته بوت.",
-       "passwordreset-emailsent-capture": "یک ایمیلئ په بیئرگردینتین ئا پاسوردئ خاتیرا، دیم داته بوت.",
        "changeemail": "ایمیل ادرسئ تغیر داتین یا پاک کورتین",
        "changeemail-no-info": "په ای تاکدیمی دسترسی ئی خاتیرا داخل بئیت.",
        "changeemail-oldemail": "انونین ایمیل ادرس:",
        "summary": "خلاصه:",
        "subject": "موضو/ئنوان:",
        "minoredit": "ای یک گونڈین ایڈیٹئ است",
-       "watchthis": "دÛ\8cستÛ\8cÙ\86 Ø§Û\8c ØªØ§Ú©Ø¯Û\8cÙ\85Û\8c",
+       "watchthis": "اÛ\8c ØªØ§Ú©Ø¯Û\8cÙ\85ئ Ù¾Ø¯ Ú¯Û\8cرÛ\8c Ú©Ù\88رتÛ\8cÙ\86",
        "savearticle": "تاکدیمئ ساتېتین",
        "preview": "دیم دیست",
        "showpreview": "دیم دیست",
        "undo-nochange": "بئ نظر ئه رسیئت که ایڈیٹ بیئرگردینته بوته.",
        "undo-summary": " $1 ئی ایڈیٹ شه [[Special:Contributions/$2|$2]] ([[User talk:$2|حبر و گپ]]) نیمگا شه بَیْن بورته بوت",
        "undo-summary-username-hidden": " $1 نخسه ئی شه بین بورتین بی یک کار زوروکئ دستا چیهر بوته",
-       "cantcreateaccounttitle": "نه توانیت حسابئ پاچ کنیت",
        "cantcreateaccount-text": "کار زوروکئ هیساب ئی جۆڑ کورتین ئی هه ق گۆ ای آی‌پی  ('''$1''') ادرس ئا، شه [[User:$3|$3]] نیمگا گیپته بوته.\n\nشه $3 ئی نیمگا دلیل ایرنگ بیان بوته: $2",
        "viewpagelogs": "ای تاکدیمئ سیاه چال ئی دیستین",
        "nohistory": "ای تاکدیم ایڈیٹ ئی تاریخچه نداریت.",
        "rcshowhidecategorization": "$1 تاکدیمئ تهربندی",
        "rcshowhidecategorization-show": "نشان داتین",
        "rcshowhidecategorization-hide": "چیهر داتین",
-       "rclinks": "نشان داتین $1 آخیر ئین تغییر بئ $2 اخیرین روچا<br />$3",
+       "rclinks": "آ آخیرئین $1 تغیرانئ نشان داتین که به $2 اخیرئین روچانئ تا پیش بوته انت<br />$3",
        "diff": "فرق",
        "hist": "تاریخچه",
        "hide": "چیهر داتین",
        "activeusers-intro": "جهلگا یک لڑئ شه کار زوروکان ئه گیندیت که بئ $1 {{PLURAL:$1|روچ|روچ}} دیمتیرا پئالیت داشته انت.",
        "activeusers-count": "$1 {{PLURAL:$1|پئالیت|پئالیت}} بئ {{PLURAL:$3|رۆچ|$3 رۆچ}} اخیرا",
        "activeusers-from": "نمایش داتین کار زوروکان شرو شه:",
-       "activeusers-hidebots": "رباتانی چیهر داتین",
-       "activeusers-hidesysops": "مدیرانئ چیهرداتین",
        "activeusers-noresult": "هیچ کار زوروکئ ودی نه بوت.",
        "listgrouprights": "کار زوروکین گروپانئ اختیاران",
        "listgrouprights-key": "* <span class=\"listgrouprights-granted\">داته بوته ئین اختیاران</span>\n* <span class=\"listgrouprights-revoked\">کیپته بوته ئین اختیاران</span>",
        "removedwatchtext": "«[[:$1]]» دیم شه  [[Special:Watchlist|شمی واچلیستا]] زورته بوت.",
        "removedwatchtext-short": "\"$1\" ئی دیم شه شمی واچلیستا پاک بوته.",
        "watch": "دیستین",
-       "watchthispage": "دÛ\8cستÛ\8cÙ\86 Ø§Û\8c ØªØ§Ú©Ø¯Û\8cÙ\85Û\8c",
+       "watchthispage": "اÛ\8c ØªØ§Ú©Ø¯Û\8cÙ\85ئ Ù¾Ø¯ Ú¯Û\8cرÛ\8c Ú©Ù\88رتÛ\8cÙ\86",
        "unwatch": "اوشتارین تین دیستینی",
        "unwatchthispage": "اوشتارینتین چارگ ئی",
        "notanarticle": "تاکدیم محتوایی نه اینت",
        "actioncomplete": "کار بوت",
        "actionfailed": "کار نه بوت",
        "deletedtext": "«$1» پاک بوت.\nپه آخیرین پاک بوتینین سابقه ئا بئ $2 ئی تا مراجعه بکنیت.",
-       "dellogpage": "سیاه چال ئی پاک کورتین",
-       "dellogpagetext": "جهلگین لڑلیست شه آخیرین پاک بوته ئین ئانی لڑا اینت.\nموچین ئانی نشان داته بته ئین وخت خادم وخت (گرینویچ ئی وخت) انت.",
-       "deletionlog": "سیاه چال ئی پاک کورتین",
+       "dellogpage": "پاک بوته‌ئانی کورم",
+       "dellogpagetext": "جهلگین لڑلیستا که گیندیت په آخیرئین پاک بوته‌ئین فابلاني خاتیرا اینت.\nموچین نشان داته بوته‌ئین وخت گو (گرینویچ‌ئی وختا) مطابق انت.",
+       "deletionlog": "پاک بوته‌ئانی کورم",
        "reverted": "بی دیمتیرین نخسه ئا بیئرگردینته بوت",
        "deletecomment": "دلیل:",
        "deleteotherreason": "دیگرین دلیل/اضافی:",
        "changecontentmodel-success-text": "[[:$1]] ئی محتوائین رقم تغیر کورت",
        "logentry-contentmodel-change-revertlink": "بیرگردینتین",
        "logentry-contentmodel-change-revert": "بیرگردینتین",
-       "protectlogpage": "سیاهگئ قُلپ",
+       "protectlogpage": "قُلپ بوتینئ کورم",
+       "protectlogtext": "به جهلگا یک لڑی شه تاکدیماني قُلپ بوتینئ اندازه‌گی تغیران آته.\n[[Special:ProtectedPages|قُلپ بوته‌ای تاکدیماني لڑا]]  په انونین قُلپ بوتینئ عملیاتان و گیشتیرین مالوماتي خاتیرا بگیندیت.",
        "protectedarticle": "«[[$1]]» ئا قُلپ کورت",
        "modifiedarticleprotection": "«[[$1]]» قُلپ ئی وزيیتا گردینت",
        "unprotectedarticle": "«[[$1]]» ئی تاکدیمئ قُلپ يا پاچ کورت",
        "undeletebtn": "احیا",
        "undeletelink": "نمایش/احیا",
        "undeleteviewlink": "دیستین",
-       "undeleteinvert": "انتخاب سرچپی بیئت",
+       "undeleteinvert": "انتخابئ سرچپي کورتین",
        "undeletecomment": "دلیل:",
        "undeletedrevisions": "$1 ئی نخسه احیا {{PLURAL:$1|بوت}}",
        "undeletedrevisions-files": "$1 نخسه و $2 فایل پداجۆڑ {{PLURAL:$1|بوت|بوتنت}}.",
        "undelete-show-file-confirm": "آیا شما مطمئن وێت که لوٹیت یک پاک بوته ئین نخسه شه فایل \"<nowiki>$1</nowiki>\" مورخ $2 سائت $3 ئا بگیندیت؟",
        "undelete-show-file-submit": "هان",
        "namespace": "نامئ اؤرکجاه:",
-       "invert": "انتخاب سرچپی بیئت",
-       "tooltip-invert": "اÛ\8c Ø¬Ø¦Ø¨Ù\87 Ø¦Ø§ Ø¦Ù\84اÙ\85ت Ø¨Ø¬Ù\86Û\8cت ØªØ§ Ú©Ù\87 Ù¾Ø²Ø§Û\8c Ù\86اÙ\85 ØªØ§ Ø¦Û\8cÙ\86 Ø§Ù\86تخاب Ø¨Ù\88تÙ\87 Ø¦Û\8cÙ\86 ØªØ§Ú©Ø¯Û\8cÙ\85اÙ\86Û\8c ØªØºÛ\8cرات (Ù\88 Ø¯Û\8cگرÛ\8cÙ\86 Ø¦Ù\84اÙ\85ت Ø¬ØªÙ\87 Ø¨Ù\88تÙ\87 Ø¦Û\8cÙ\86 Ù¾Ø²Ø§Û\8c Ù\86اÙ\85 Ø¦Ø§Ù\86) Ú\86Û\8cÙ\87ر Ø¨Ù\87 ینت",
+       "invert": "انتخابا سرچپي کورتین",
+       "tooltip-invert": "اÛ\8c Ø¬Ø¹Ø¨Ù\87 Ø¦Ø§ Ø¹Ù\84اÙ\85ت Ø¨Ø¬Ù\86Û\8cت ØªØ§ Ú©Ù\87 ØªØ§Ú©Ø¯Û\8cÙ\85اÙ\86Ù\8a ØªÙ\87ئ Ø§Ù\86تخاب Ø¨Ù\88تÙ\87â\80\8cاÛ\8cÙ\86 Ù\86اÙ\85ئ Ø§Ù\88رکجاÙ\87â\80\8cاÛ\8c ØªØºÛ\8cر (Ù\88 Ø¯Û\8cگرÛ\8cÙ\86 Ø¹Ù\84اÙ\85ت Ø¬ØªÙ\87 Ø¨Ù\88تÙ\87â\80\8cاÛ\8cÙ\86 Ù\86اÙ\85ئ Ø§Ù\88رکجاÙ\87اÙ\86) Ú\86Û\8cÙ\87ر Ø¨Ù\87â\80\8cینت",
        "namespace_association": "Associated namespace",
        "tooltip-namespace_association": "ای جئبه ئا ئلامت بجنیت تا که مربوتین موزو ئی پزای نامی گپ گۆ\nانتخاب بوته ئین پزای ناما شامل بیت",
        "blanknamespace": "(بُنیادی)",
        "contributions-userdoesnotexist": "«$1» ئی کار زوروکین حساب راجستر نه بوته.",
        "nocontribs": "هیچ تغیری گۆ ای مشخصات ئان ودێ نه بوت",
        "uctop": "(انونین نخسه)",
-       "month": "بی ای ماه ئی تا (و دیمتیر شه آیی):",
-       "year": "بی ای سال ئی تا (و دیمتیر شه آیی):",
+       "month": "به اي ماه‌ای تا (و دیمتیر شه آیی):",
+       "year": "به اي سالئ تا (و دیمتیر شه آیی):",
        "sp-contributions-newbies": "فقط نوکین مشارکتان نشان داته بیئنت",
        "sp-contributions-newbies-sub": "په نوک کاران",
        "sp-contributions-newbies-title": "په نوک کارین حسابانی خاتیرا کار زوروکئ شراکت ئان",
        "change-blocklink": "بلاک ئی تغیرداتین",
        "contribslink": "شراکت‌ئان",
        "emaillink": "ایمیلی دیم داتین",
-       "blocklogpage": "کورمئ بستین",
+       "blocklogpage": "بستینئ کورم",
        "blocklogentry": "«[[$1]]» ئا تا $2 بست $3",
        "unblocklogentry": "$1 ئا پاچ کورت",
        "block-log-flags-anononly": "فقط زیان نامین کار زوروکان",
        "htmlform-cloner-create": "گیشتیر اضافه کورتین",
        "htmlform-cloner-delete": "پاک کورتین",
        "htmlform-cloner-required": "حداقل ضرورت انداره گ.",
-       "sqlite-has-fts": "$1 گۆ پُشتیوانی شه گشتین ئا بئ کامیلین متن ئی تا",
-       "sqlite-no-fts": "$1 بدون پُشتیوانی شه گشتین ئا بئ کاملین متن ئی تا",
        "logentry-delete-delete": "$1 ، $3 تاکدیما {{GENDER:$2|پاک کورت}}",
        "logentry-delete-restore": "$1 ، $3 ئی تاکدیما {{GENDER:$2|پدا جۆڑ کورت}}",
        "logentry-delete-event": "$1 پیدایی {{PLURAL:$5|یک مورد سیاه چال|$5 مورد سیاه چال}} ئا بئ $3 {{GENDER:$2|تا تغیر دات}}: $4",
        "feedback-close": "کار بوت",
        "feedback-external-bug-report-button": "یک تخنیکی ئین کاری پایل",
        "feedback-dialog-title": "یک پیڈبک ئی دیم داتین",
-       "feedback-error-title": "خطا",
        "feedback-error2": "خطا: پروشت بئ ایڈیٹ ئی تا",
        "feedback-message": "پیام:",
        "feedback-subject": "ئنوان:",
index 5b12678..a34a427 100644 (file)
@@ -13,6 +13,7 @@
        "tog-hideminor": "हाल के बदलाव में से छोट संपादन छिपाईं",
        "tog-hidepatrolled": "हाल के बदलाव में से जाँचल संपादन छिपाईं",
        "tog-newpageshidepatrolled": "नया पन्ना के सूची में से जाँचल पन्ना सभ के छिपाईं",
+       "tog-hidecategorization": "पन्ना श्रेणीकरण छिपाईं",
        "tog-extendwatchlist": "खाली हाले के बदलाव ना बालुक, सगरी बदलाव के देखावे खातिर धियानसूची के बिस्तारित करीं",
        "tog-usenewrc": "तुरंत भइल बदलाव में आ धियानसूची में भइल बदलाव सभ के पन्ना अनुसार झुंड में बांटी",
        "tog-numberheadings": "हेडिंग के ऑटो-नंबरिंग",
@@ -23,6 +24,7 @@
        "tog-watchdefault": "हम जौना पन्ना आ फाइलन के संपादित करीं उनहन के हमरी धियानसूची में जोड़ दिहल जाव",
        "tog-watchmoves": "हमरा द्वारा स्थानांतरित पन्ना आ फाइलन के हमरा धियानसूची में जोड़ दिहल जाव",
        "tog-watchdeletion": "हमरा द्वारा हटावल पन्ना आ फाइल सभ के हमार धियानसूची में जोड़ दिहल जाव",
+       "tog-watchuploads": "हम नया फाइल अपलोड करीं त उनहना के हमार धियानसूची में जोड़ल जाय",
        "tog-watchrollback": "हमरा द्वारा रोलबैक कइल गइल पन्ना सभ के हमार धियानसूची में जोड़ दिहल जाव",
        "tog-minordefault": "डिफाल्ट रूप से सगरी संपादन कुल के छोट संपादन की रुप में चिन्हित कइल जाव",
        "tog-previewontop": "नमूना (preview) संपादन बक्सा से पहिले देखावल जाय",
@@ -32,7 +34,7 @@
        "tog-enotifminoredits": "पन्ना आ फाइल पर छोटो परिवर्तन होखे त हमके ई-मेल करल जाव",
        "tog-enotifrevealaddr": "अधिसूचना ई-मेल में हमार ई-मेल पता देखावल जाव",
        "tog-shownumberswatching": "धियान रखे वालन सदस्यन के देखावल जाव",
-       "tog-oldsig": "वरà¥\8dतमान à¤¦à¤¸à¤\96त",
+       "tog-oldsig": "राà¤\89र à¤µà¤°à¥\8dतमान à¤¦à¤¸à¤\96त:",
        "tog-fancysig": "दसखत के विकी पाठ के रुप में उपयोग करीं (बिना ऑटोमेटिक कड़ी के)",
        "tog-uselivepreview": "लगातार चालू नमूना देखावल (preview) के प्रयोग करीं",
        "tog-forceeditsummary": "यदि संपादन सारांश ना दिहल होखे त हमके सूचित कइल जाय",
        "tog-watchlisthidebots": "हमार धियानसूची से बॉट द्वारा करल गइल बदलाव के छिपाईं",
        "tog-watchlisthideminor": "हमार धियानसूची से छोट बदलाव के छिपावल जाव",
        "tog-watchlisthideliu": "हमार धियानसूची में लॉग-इन भइल सदस्यन के संपादन छिपावल जाय",
+       "tog-watchlistreloadautomatically": "जब कौनों फिल्टर बदलल जाय तब धियानसूची ऑटोमेटिक दोबारा लोड होखे (जावास्क्रिप्ट जरूरी)",
        "tog-watchlisthideanons": "आइ॰पी॰ सदस्यन द्वारा करल गइल सम्पादन के हमार धियानसूची में से छिपावल जाय",
        "tog-watchlisthidepatrolled": "जाँचल गइल सम्पादन के हमार ध्यानसूची में से छिपावल जाय",
+       "tog-watchlisthidecategorization": "पन्ना श्रेणीकरण छिपाईं",
        "tog-ccmeonemails": "हमरा द्वारा अन्य सदस्यन के भेजल गइल ईमेल के कॉपी हमरो के भेजल जाय",
        "tog-diffonly": "अन्तर देखावत समय अंतर की नीचे पन्ना के सामग्री मत देखावल जाव।",
        "tog-showhiddencats": "छिपल श्रेणियन के भी देखावल जाय",
        "tog-norollbackdiff": "रोलबैक कइला के बाद अंतर मत देखावल जाव",
        "tog-useeditwarning": "जो हम कौनों पन्ना पर संपादन करत घरी परिवर्तन के बिना सहेजले छोड़ देईं त हमके खबर कइल जाव",
-       "tog-prefershttps": "à¤\9cब à¤\96ाता à¤®à¥\87à¤\82 à¤²à¥\89à¤\97िन à¤\95रà¥\80à¤\82 à¤¤ हमेशा सुरक्षित कनेक्शन के प्रयोग कइल जाय",
+       "tog-prefershttps": "लà¥\89à¤\97िन à¤°à¤¹à¤²à¥\87 à¤ªà¤° हमेशा सुरक्षित कनेक्शन के प्रयोग कइल जाय",
        "underline-always": "हमेशा",
        "underline-never": "कभी ना",
        "underline-default": "जिल्द (स्किन) या ब्राउसर डिफॉल्ट",
        "october-date": "अक्टूबर $1",
        "november-date": "नवंबर $1",
        "december-date": "दिसंबर $1",
+       "period-am": "AM",
+       "period-pm": "PM",
        "pagecategories": "{{PLURAL:$1|श्रेणी|श्रेणी}}",
        "category_header": "\"$1\" श्रेणी में पन्ना",
        "subcategories": "उपश्रेणी",
        "category-file-count-limited": "वर्तमान में निम्नलिखित {{PLURAL:$1|पन्ना|$1 पन्नां}} इ श्रेणीं में बाड़े।",
        "listingcontinuesabbrev": "जारी...",
        "index-category": "सूचीबद्ध पन्ना",
-       "noindex-category": "बिना सूचीबद्ध पन्ना",
+       "noindex-category": "बिनासूचीबद्ध पन्ना",
        "broken-file-category": "टूटल फाइल कड़ियन वाला पन्ना",
        "about": "बारे में",
        "article": "सामग्री पन्ना",
        "newwindow": "(नया विंडो में खोलीं)",
        "cancel": "कैंसिल",
        "moredotdotdot": "अउर...",
-       "morenotlisted": "à¤\87 à¤¸à¥\82à¤\9aà¥\80 à¤ªà¥\82रà¥\8dण à¤¨à¤\87खे।",
+       "morenotlisted": "हà¥\8b à¤¸à¤\95à¥\87ला à¤\95ि à¤\88 à¤²à¤¿à¤¸à¥\8dà¤\9f à¤ªà¥\82रा à¤¨ à¤¹à¥\8bखे।",
        "mypage": "पन्ना",
        "mytalk": "हमार बातचीत पन्ना",
        "anontalk": "बातचीत",
        "tagline": "भोजपुरी {{SITENAME}} से",
        "help": "मदद",
        "search": "खोज",
+       "search-ignored-headings": " #<!-- एह लाइन के बिलकुल अइसहीं छोड़ दीं --> <pre>\n# हेडिंग जिनहन पर खोज करत समय धियान ना दिहल जाई।\n# एह हेडिंग वाला पन्ना जइसहीं सूचीबद्ध होखी, बदलाव प्रभावी हो जइहें।\n# आप एगो खाली संपादन (null edit) कइ के दुबारा सूचीकरण के लागू कर सकत बानी।\n# एकर सिंटेक्स अइसे बा कि:\n#   * Everything from a \"#\" character to the end of the line is a comment.\n#   * Every non-blank line is the exact title to ignore, case and everything.\nसंदर्भ\nबाहरी कड़ी\nइहो देखल जाय\n #</pre> <!-- एह लाइन के बिलकुल अइसहीं छोड़ दीं -->",
        "searchbutton": "खोजीं",
        "go": "जाईं",
        "searcharticle": "जाईं",
        "talk": "बात-चीत",
        "views": "कइसन लउकी?",
        "toolbox": "औजार",
+       "tool-link-userrights": "{{GENDER:$1|प्रयोगकर्ता}} के सदस्यसमूह बदलीं",
+       "tool-link-emailuser": "{{GENDER:$1|प्रयोगकर्ता}} के ईमेल करीं",
        "userpage": "प्रयोगकर्ता पन्ना देखीं",
        "projectpage": "परियोजना पन्ना देखीं",
        "imagepage": "फाइल पन्ना देखीं",
        "viewsource": "स्रोत देखीं",
        "viewsource-title": "$1 के स्रोत देखीं",
        "actionthrottled": "कार्य समाप्त कर दिहल गइल बा",
-       "actionthrottledtext": "सà¥\8dपà¥\88म à¤\95à¥\87 à¤°à¥\8bà¤\95थाम à¤\96ातिर, à¤\87 à¤\95à¥\8dरिया à¤\8fतना à¤\95म à¤¸à¤®à¤¯ à¤®à¥\87à¤\82 à¤\8fà¤\95 à¤¸à¥\80मा à¤¸à¥\87 à¤\85धिà¤\95 à¤¬à¤¾à¤° à¤\95रà¥\87 à¤\95à¥\87 à¤®à¤¨à¤¾ à¤¬à¤¾, à¤\86 à¤°à¤\89à¤\86 à¤\87 à¤¸à¥\80मा à¤\95à¥\87 à¤ªà¤¾à¤° à¤\95र à¤\9aà¥\81à¤\95ल à¤¬à¤¾à¤¨à¥\80।\nà¤\95à¥\83पया à¤\95à¥\81à¤\9b à¤¸à¤®à¤¯ à¤¬à¤¾à¤¦ à¤ªà¥\81न: à¤¯à¤¤à¥\8dन करीं।",
+       "actionthrottledtext": "दà¥\81रà¥\81पयà¥\8bà¤\97 à¤°à¥\8bà¤\95थाम à¤\89पाय à¤\95à¥\87 à¤°à¥\82प à¤®à¥\87à¤\82, à¤\8fह à¤\95ाम à¤\95à¥\87 à¤¬à¤¹à¥\81त à¤\95म à¤¸à¤®à¤¯ à¤®à¥\87à¤\82 à¤\8fà¤\95 à¤¸à¥\80मा à¤¸à¥\87 à¤\85धिà¤\95 à¤¬à¥\87 à¤\95रà¥\87 à¤\95à¥\87 à¤®à¤¨à¤¾ à¤¬à¤¾, à¤\86 à¤°à¤\89à¤\86 à¤\88 à¤¸à¥\80मा à¤\95à¥\87 à¤ªà¤¾à¤° à¤\95र à¤\9aà¥\81à¤\95ल à¤¬à¤¾à¤¨à¥\80।\nà¤\95à¥\83पया à¤\95à¥\81à¤\9b à¤¸à¤®à¤¯ à¤¬à¤¾à¤¦ à¤¦à¥\8bबारा à¤\95à¥\8bसिस करीं।",
        "protectedpagetext": "इ पन्ना संपादन आ अन्य कार्यं से बचाव खातिर सुरक्षित कर दिहल गइल बा।",
        "viewsourcetext": "रउआँ एह पन्ना के स्रोत देख सकत बानी आ एकर नकल उतार सकत बानी:",
        "viewyourtext": "एह पन्ना पर <strong>राउर आपन संपादन सब</strong>के स्रोत देख सकत बानी आ ओकर नकल ले सकत बानी।",
        "virus-scanfailed": "जाँच विफल (कोड $1)",
        "virus-unknownscanner": "अज्ञात ऐंटीवायरस:",
        "logouttext": "'''रउआ अब खाता से बाहर बानी'''\n\nध्यान रहे कि जब तक रउआ आपन ब्राउजर के कैश साफ ना करब, तब तक कुछ पन्नन में हो सकत बा रउआ के खाता में लगातार प्रवेशित दिखावत रही।",
+       "cannotlogoutnow-title": "एह समय लॉगआउट ना हो सकी",
+       "cannotlogoutnow-text": "$1 के इस्तेमाल करत समय लॉगआउट नइखे संभव।",
        "welcomeuser": "राउर स्वागत बा, $1!",
        "welcomecreation-msg": "राउर खाता बना दिहल गईल बा।\nआपन [[Special:Preferences|{{SITENAME}} वरीयतां]] के बदले के ना भूलब।",
        "yourname": "सदस्यनाम:",
        "yourpasswordagain": "गुप्त-शब्द पुन:डालीं:",
        "createacct-yourpasswordagain": "गुप्तशब्द (पासवर्ड) के पुष्टि करीं",
        "createacct-yourpasswordagain-ph": "गुप्तशब्द (पासवर्ड) फेर से प्रवेश करीं",
-       "remembermypassword": "इ ब्राउजर पर हमार प्रवेश याद रखीं (अधिकतम $1 {{PLURAL:$1|दिन|दिनं}} तक)",
        "userlogin-remembermypassword": "हमके लॉग इन रहे दीं",
        "userlogin-signwithsecure": "सुरक्षित कनेक्शन के प्रयोग करीं",
+       "cannotlogin-title": "लॉगइन नइखे हो पावत",
+       "cannotlogin-text": "लॉगइन कइल संभव नइखे।",
+       "cannotloginnow-title": "एह समय लॉगइन नइखे हो सकत",
+       "cannotloginnow-text": "$1 के इस्तेमाल करत समय लॉगइन कइल नइखे संभव।",
+       "cannotcreateaccount-title": "खाता नइखे बनावल जा सकत",
+       "cannotcreateaccount-text": "एह विकि पर सीधे खाता बनावले के सुबिधा सक्षम नइखे।",
        "yourdomainname": "राउर डोमेनः",
        "password-change-forbidden": "रउआ इ विकी पर गुप्तशब्द नइखीं बदल सकत।",
        "externaldberror": "या त प्रमाणिकरण डाटाबेस में भइल बा या फिर रउआ के आपन बाह्य खाता अपडेट करे के अनुमति नइखे।",
        "login": "लॉग इन",
+       "login-security": "आपन पहिचान साबित करीं",
        "nav-login-createaccount": "खाता प्रवेश / खाता बनाईं",
        "userlogin": "खाता प्रवेश / खाता बनाईं",
        "userloginnocreate": "खाता में प्रवेश",
        "userlogin-resetpassword-link": "आपन गुप्तशब्द भूला गईनी का?",
        "userlogin-helplink2": "लॉग इन में मदद",
        "userlogin-loggedin": "रउआ {{GENDER:$1|$1}} के रूप में पहिले से लॉग्ड इन बानीं।\nकौनो अन्य सदस्य के रूप में लॉग इन करे खातिर निम्नलिखित फ़ॉर्म के प्रयोग करीं।",
+       "userlogin-reauth": "आप के ई साबित करे खातिर की आपे {{GENDER:$1|$1}} बानी, दुबारा लॉगिन करे के पड़ी।",
        "userlogin-createanother": "एगो दूसर खाता बनाईं",
        "createacct-emailrequired": "ई-मेल पता",
        "createacct-emailoptional": "ई-मेल पता (वैकल्पिक)",
        "createaccountreason": "कारण:",
        "createacct-reason": "कारण",
        "createacct-reason-ph": "रउआ एगो अन्य खाता काहे बना रहल बानी",
+       "createacct-reason-help": "खाता बनवले के लॉग में देखाई पड़े वाला संदेस",
        "createacct-submit": "आपन खाता बनाईं",
-       "createacct-another-submit": "एगो दोसर खाता बनाईं",
+       "createacct-another-submit": "खाता बनाईं",
+       "createacct-continue-submit": "खाता बनावल जारी राखीं",
+       "createacct-another-continue-submit": "खाता बनावल जारी राखीं",
        "createacct-benefit-heading": "{{SITENAME}} रउआ जइसन लोगन द्वारा बनावल गईल बा।",
        "createacct-benefit-body1": "{{PLURAL:$1|संपादन}}",
        "createacct-benefit-body2": "{{PLURAL:$1|पन्ना}}",
        "nocookiesnew": "प्रयोगकर्ता खाता त बन गईल, बाँकी रउआ प्रवेश नईखीं भईल।\n{{SITENAME}} प्रयोगकर्ता लोग के खाता में प्रवेश करावे खातिर कुकिज के प्रयोग करेला।\nराउर कुकिज असक्षम बा।\nकृपया उ के सक्षम करीं, उ के बाद राउर नया प्रयोगकर्ता नाम आ गुप्त शब्द के साथ प्रवेश करीं।",
        "nocookieslogin": "{{SITENAME}} प्रयोगकर्ता लोग के खाता में प्रवेश करावे खातिर कुकिज के प्रयोग करेला।\nराउर कुकिज असक्षम बा।\nकृपया उ के सक्षम करीं आ फिर से कोशिश करीं",
        "nocookiesfornew": "स्रोत के पुष्टि ना हो पावे के कारण इ खाता निर्मित ना करल गइल। \nसुनिश्चित करीं कि रउआ कुकीज़ सक्षम कइले बानी, पृष्ठ के पुनः लोड करीं आ पुनः प्रयास करीं।",
+       "createacct-loginerror": "खाता बनावल सफल भइल बाकी रउआँ अपने-आप लॉगिन ना हो पवलीं। [[Special:UserLogin|मैनुअल लॉगिन]] करीं।",
        "noname": "रउआ उपयुक्त प्रयोगकर्ता नाम नईखीं निर्दिष्ट कईले।",
        "loginsuccesstitle": "लॉगिन पूरा",
        "loginsuccess": "''' \"$1\" के रुप में रउआ {{SITENAME}} में अब प्रवेश कर चुकल बानी।'''",
        "noemail": "\"$1\" सदस्य खातिर कउनो भी ई-मेल पता दर्ज नइखे करल गइल।",
        "noemailcreate": "रउआ एगो जायज ई-मेल पता उपलब्ध करावे के पड़ी।",
        "passwordsent": "\"$1\" के ई-मेल पता पर एगो नया गुप्तशब्द भेज दिहल गइल बा।\nई-मेल पावे के बाद कृपया दुबारा खाता में प्रवेश करब।",
-       "blocked-mailpassword": "राà¤\89र à¤\86à¤\87॰पà¥\80 à¤ªà¤¤à¤¾ à¤\95à¥\87 à¤¸à¤®à¥\8dपादन à¤\95रà¥\87 à¤¸à¥\87 à¤µà¤\82à¤\9aित à¤\95र à¤¦à¤¿à¤¹à¤² à¤\97à¤\87ल à¤¬à¤¾, à¤\86 à¤\97लत à¤ªà¥\8dरयà¥\8bà¤\97 à¤°à¥\8bà¤\95à¥\87 à¤\96ातिर à¤\97à¥\81पà¥\8dतशबà¥\8dद à¤ªà¥\81नà¤\83 à¤ªà¥\8dरापà¥\8dति à¤\95à¥\87 à¤¸à¥\81विधा à¤\87 à¤\86à¤\87॰पà¥\80 à¤ªà¤° à¤¬à¤\82द à¤\95र à¤¦à¤¿à¤¹à¤² à¤\97à¤\87ल à¤¬à¤¾।",
+       "blocked-mailpassword": "राà¤\89र à¤\86à¤\87पà¥\80 à¤ªà¤¤à¤¾ à¤\95à¥\87 à¤¸à¤\82पादन à¤\95रà¥\87 à¤¸à¥\87 à¤°à¥\8bà¤\95 à¤¦à¤¿à¤¹à¤² à¤\97à¤\87ल à¤¬à¤¾à¥¤ à¤¦à¥\81रà¥\81पयà¥\8bà¤\97 à¤°à¥\8bà¤\95à¥\87 à¤\96ातिर, à¤\8f à¤\86à¤\87पà¥\80 à¤¸à¥\87 à¤ªà¤¾à¤¸à¤µà¤°à¥\8dड à¤°à¤¿à¤\95वरà¥\80 à¤\95à¥\87 à¤\85नà¥\81मति à¤¨à¤\87à¤\96à¥\87।",
        "eauthentsent": "दर्ज करावल गइल ई-मेल पता पर एगो पुष्टिकरण ई-मेल भेज दिहल गइल बा।\nउ खाता पर कौनो दुसर ईमेल भेजल जाओ उ से पहिले, रउआ भेजल गईल ई-मेल पर दिहल गइल निर्देश के अनुसरण कर के ई-मेल पता के पुष्टिकरण करावे के पड़ी ताकि पता चले की सही में उ राउरे खाता ह।",
        "throttled-mailpassword": "पिछला {{PLURAL:$1|एक घंटा|$1 घंटा}} के अंदर एगो गुप्तशब्द पुनर्स्थापन ई-मेल भेजल जा चुकल बा।\nदुरुपयोग से बचावे खातिर {{PLURAL:$1|एक घंटा|$1 घंटा}} में सिर्फ एगो गुप्तशब्द पुनर्स्थापन ई-मेल भेजल जाई।",
        "mailerror": "ई-मेल भेजे में त्रुटि: $1",
-       "acct_creation_throttle_hit": "राà¤\89र à¤\86à¤\87॰पà¥\80 à¤ªà¤¤à¤¾ à¤¸à¥\87 à¤\86à¤\88ल à¤\86à¤\97à¤\82तà¥\81à¤\95 à¤ªà¤¿à¤\9bला à¤\9aà¥\8cबà¥\80स à¤\98à¤\82à¤\9fा à¤®à¥\87à¤\82 à¤\87 à¤µà¤¿à¤\95ि à¤ªà¤° {{PLURAL:$1|à¤\8fà¤\95 à¤\96ाता|$1 à¤\96ाता}} à¤¬à¤¨à¤¾ à¤\9aà¥\81à¤\95ल à¤¬à¤¾à¤¨à¥\80, à¤\87 à¤¸à¤®à¤¯à¤¾à¤µà¤§à¤¿ à¤®à¥\87à¤\82 à¤\87हà¥\87 à¤\85धिà¤\95तम à¤¸à¥\80मा à¤¬à¤¾à¥¤\nà¤\85तà¤\83 à¤\87 à¤¸à¤®à¤¯ à¤\87 à¤\86à¤\87॰पà¥\80 à¤ªà¤¤à¤¾ à¤\95à¥\87 à¤ªà¥\8dरयà¥\8bà¤\97 à¤\95रà¥\87 à¤µà¤¾à¤²à¤¾ à¤\86à¤\97à¤\82तà¥\81à¤\95 à¤\85à¤\89र à¤\85धिà¤\95 à¤\96ाता à¤¨à¤\87à¤\96न बना सकत।",
+       "acct_creation_throttle_hit": "राà¤\89र à¤\86à¤\87पà¥\80 à¤ªà¤¤à¤¾ à¤¸à¥\87 à¤\86à¤\87ल à¤\86à¤\97à¤\82तà¥\81à¤\95 à¤²à¥\8bà¤\97 à¤ªà¤¿à¤\9bला à¤\9aà¥\8cबà¥\80स à¤\98à¤\82à¤\9fा à¤®à¥\87à¤\82 à¤\8fह à¤µà¤¿à¤\95ि à¤ªà¤° {{PLURAL:$1|à¤\8fà¤\95 à¤ à¥\8b à¤\96ाता|$1 à¤\96ाता}} à¤¬à¤¨à¤¾ à¤\9aà¥\81à¤\95ल à¤¬à¤¾ à¤\9cवन à¤\8fह à¤¸à¤®à¤¯à¤\85वधि à¤®à¥\87à¤\82 à¤\85धिà¤\95तम à¤¸à¥\80मा à¤¬à¤¾à¥¤\nà¤\8fहà¥\80 à¤\95ारण, à¤\8fह à¤\86à¤\87पà¥\80 à¤ªà¤¤à¤¾ à¤\95à¥\87 à¤\87सà¥\8dतà¥\87माल à¤\95रà¥\87 à¤µà¤¾à¤²à¤¾ à¤\86à¤\97à¤\82तà¥\81à¤\95 à¤\85ब à¤\95à¥\8cनà¥\8bà¤\82 à¤\85à¤\89रà¥\80 à¤\96ाता à¤\8fह à¤¸à¤®à¤¯ à¤¨à¤\87à¤\96à¥\87à¤\82 बना सकत।",
        "emailauthenticated": "$2 के $3 पर राउर ई-मेल पता के पुष्टीकरण हो चुकल बा।",
        "emailnotauthenticated": "राउर ई-मेल पता के अभी तक प्रमाणिकरण नइखे भईल।\nनिम्नलिखित कउनो भी सुविधा खातिर रउआ के कौनो भी ई-मेल ना भेजल जाई।",
        "noemailprefs": "इ सुविधा के प्रयोग करे खातिर आपन वरियता में एगो ई-मेल पता दिहीं।",
        "createaccount-title": "{{SITENAME}} खातिर खाता बनाईं",
        "createaccount-text": "राउर ई-मेल पता खातिर {{SITENAME}} ($4) पर \"$2\" सदस्य नाम से \"$3\" गुप्तशब्द (पासवर्ड) सहित खाता खोलले बानी। रउआ खाता में प्रवेश कर के आपन गुप्तशब्द (पासवर्ड) तुरंत बदल लेवे के चाहीं।\n\nयदि इ खाता गलती से खोलल गईल बा, त रउआ इ संदेश के अनदेखा कर सकत बानी।",
        "login-throttled": "रउआ हाले में कईयन बार खाता में प्रवेश करे के कोशिश कर चुकल बानी।\nकृपया $1 प्रतिक्षा करला के बाद फिर से प्रयास करब।",
-       "login-abort-generic": "राà¤\89र à¤\96ाता à¤®à¥\87à¤\82 à¤ªà¥\8dरवà¥\87श à¤\85सफल à¤°à¤¹à¤² - à¤¨à¤¿à¤·à¥\8dफलित",
+       "login-abort-generic": "राà¤\89र à¤²à¥\89à¤\97िन à¤¬à¤¿à¤«à¤² à¤°à¤¹à¤² - à¤°à¤¦à¥\8dद à¤\95à¤\87ल à¤\97à¤\87ल",
        "login-migrated-generic": "आप के खाता माइग्रेट हो चुकल बा अउर आप के सदस्यनाम इ विकी पर अब मौजूद नइखे।",
        "loginlanguagelabel": "भाषा: $1",
        "suspicious-userlogout": "राउर खाता से बाहर जाये के अनुरोध अस्वीकृत कर दिहल गइल बा काहे कि  अइसन लग रहल बा कि इ कउनो खराब ब्राउज़र या कैश करे वाली प्रॉक्सी द्वारा भेजल गईल रहल।",
        "createacct-another-realname-tip": "असली नाम वैकल्पिक बा।\nयदि रउआ इ के उपलब्ध करावे के चुनत बानी त, एकर प्रयोग सदस्य के ओकरा काम के अधिकार देवे खातिर होखी।",
        "pt-login": "खाता में प्रवेश",
        "pt-login-button": "लॉग इन",
+       "pt-login-continue-button": "लॉगिन जारी राखीं",
        "pt-createaccount": "खाता बनाईं",
        "pt-userlogout": "लॉग आउट",
        "php-mail-error-unknown": "PHP के mail() फ़ंक्शन में अज्ञात त्रुटि बा।",
        "newpassword": "नया गुप्त-शब्द:",
        "retypenew": "नया गुप्त-शब्द पुन: डालीं:",
        "resetpass_submit": "गुप्तशब्द बनाईं आ खाता में प्रवेश करीं",
-       "changepassword-success": "राà¤\89र à¤\97à¥\81पà¥\8dतशबà¥\8dद à¤¸à¤«à¤²à¤¤à¤¾à¤ªà¥\81रà¥\8dवà¤\95 à¤¬à¤¦à¤² à¤¦à¤¿à¤¹à¤² à¤\97à¤\88ल बा!",
+       "changepassword-success": "राà¤\89र à¤ªà¤¾à¤¸à¤µà¤°à¥\8dड à¤¬à¤¦à¤² à¤¦à¤¿à¤¹à¤² à¤\97à¤\87ल बा!",
        "changepassword-throttled": "रउआ हाले में कईयन बार खाता में प्रवेश करे के कोशिश कर चुकल बानी।\nकृपया $1 प्रतिक्षा करला के बाद फिर से प्रयास करब।",
+       "botpasswords": "बॉट पासवर्ड",
+       "botpasswords-disabled": "बॉट पासवर्ड अक्षम कइल गइल बा।",
+       "botpasswords-no-central-id": "बॉट पासवर्ड के प्रयोग करे खातिर आपके सेंट्रलाइज्ड खाता से लॉगिन होखल जरूरी बा।",
+       "botpasswords-existing": "मौजूद बॉट पासवर्ड",
+       "botpasswords-createnew": "नया बॉट पासवर्ड बनाईं",
+       "botpasswords-editexisting": "मौजूद बॉट पासवर्ड के संपादित करीं",
+       "botpasswords-label-appid": "बॉट नाँव:",
+       "botpasswords-label-create": "बनाईं",
+       "botpasswords-label-update": "अपडेट",
+       "botpasswords-label-cancel": "कैंसिल",
+       "botpasswords-label-delete": "मिटाईं",
+       "botpasswords-label-resetpassword": "पासवर्ड रिसेट करीं",
+       "botpasswords-label-grants-column": "मंजूर भइल",
+       "botpasswords-bad-appid": "बॉट नाँव \"$1\" वैध नइखे।",
+       "botpasswords-created-title": "बॉट पासवर्ड बनावल गइल",
        "resetpass_forbidden": "गुप्तशब्द बदलल नइखे जा सकत",
        "resetpass-no-info": "इ पन्ना के सिधे प्रयोग करे खातिर रउआ पहिले खाता में प्रवेश करे के पड़ी।",
        "resetpass-submit-loggedin": "गुप्त शब्द बदलीं",
        "passwordreset-emailtext-user": "{{SITENAME}} ($4) पर सदस्य $1 राउर {{PLURAL:$3|खाता}} के गुप्तशब्द के पुनर्स्थापित करे के अनुरोध कइले बानी। इ ई-मेल पता से निम्न {{PLURAL:$3|खाता जुड़ल बा}}:\n\n$2\n\n{{PLURAL:$3|इ}} अस्थायी गुप्तशब्द {{PLURAL:$5|एक दिन|$5 दिन}} के बाद काम ना करी।\nरउआ खाता में प्रवेश करके एगो नया गुप्तशब्द अभीये चुन लेवे के चाहीं। यदि इ अनुरोध केहु अउर कइले बा, या फिर रउआ आपन मूल गुप्तशब्द याद आ गईल बा, अउर रउआ {{PLURAL:$3|आपन}} गुप्तशब्द नईखीं बदले के चाहत त, रउआ इ संदेश के अनदेखा कर के आपन पुरनका गुप्तशब्द के प्रयोग जारी रख सकत बानीं।",
        "passwordreset-emailelement": "सदस्यनाम: \n$1\n\nअस्थायी गुप्तशब्द: \n$2",
        "passwordreset-emailsentemail": "एगो गुप्तशब्द रिसेट ई-मेल भेजल जा चुकल बा।",
+       "passwordreset-invalideamil": "अवैध ईमेल पता",
        "changeemail": "ई-मेल पता बदलीं",
        "changeemail-header": "खाता के ई-मेल पता बदलीं",
        "changeemail-no-info": "इ पन्ना के सिधे प्रयोग करे खातिर रउआ पहिले खाता में प्रवेश करे के पड़ी।",
        "sig_tip": "समय मोहर की संघे राउर दस्खत",
        "hr_tip": "पड़ी लकीर (कम प्रयोग करीं)",
        "summary": "छोट विवरण (सारांश):",
-       "subject": "विषय/शिरà¥\8dषà¤\95:",
+       "subject": "बिसय:",
        "minoredit": "छोट परिवर्तन",
        "watchthis": "धियानसूची में डालीं",
        "savearticle": "पन्ना सहेजीं",
+       "savechanges": "बदलाव सहेजीं",
+       "publishpage": "पन्ना प्रकाशित करीं",
+       "publishchanges": "बदलाव प्रकाशित करीं",
        "preview": "पूर्वावलोकन",
        "showpreview": "झलक देखीं",
        "showdiff": "बदलाव देखीं",
        "missingsummary": "'''स्मरणपत्र:'''रउआ एगो सारांश के सम्पादन नईखीं प्रदान कईले। अगर रउआ \"फिर से सुरक्षित करीं\" पर क्लिक करेब, त राउर सम्पादन बिना एगो सारांश के सुरक्षित हो जाई।",
        "selfredirect": "<strong>चेतावनी:</strong> आप खुद के इ पन्ना पर पुनः निर्देशित कर रहल बानी।\nआप अनुप्रेषित खातिर गलत लक्ष्य निर्दिष्ट हो सकत बानी, या आप के द्वारा गलत पन्ना के संपादन हो सकत बा।\nआप यदि फेर से \"{{int:savearticle}}\" क्लिक करत बानी त, पुन: निर्देषण ओइसहु बनावल जाई।",
        "missingcommenttext": "कृपया निचे एगो टिप्पणी करीं।",
-       "missingcommentheader": "'''सà¥\8dमरणपतà¥\8dर:''' à¤°à¤\89à¤\86 à¤\88 à¤\9fिपà¥\8dपणà¥\80 à¤\96ातिर à¤\95à¥\8cनà¥\8b à¤µà¤¿à¤·à¤¯/शिरà¥\8dषà¤\95 à¤ªà¥\8dरदान à¤¨à¤\88à¤\96à¥\80à¤\82 à¤\95à¤\88लà¥\87। \"{{int:savearticle}}\" à¤¯à¤¦à¤¿ à¤°à¤\89à¤\86 à¤«à¤¿à¤° à¤¸à¥\87 à¤¸à¥\81रà¤\95à¥\8dषित à¤\95रब à¤¤ à¤°à¤¾à¤\89र à¤¸à¤®à¥\8dपादन à¤¬à¤¿à¤¨à¤¾ à¤\95à¥\8cनà¥\8b à¤¶à¤¿à¤°à¥\8dषà¤\95 à¤\95à¥\87 à¤¸à¥\81रà¤\95à¥\8dषित à¤¹à¥\8b जाई।",
+       "missingcommentheader": "'''याद à¤¦à¤¿à¤¯à¤¾à¤µà¤² à¤\9cात à¤¬à¤¾:''' à¤°à¤\89à¤\86à¤\81 à¤\8fह à¤\95मà¥\87à¤\82à¤\9f à¤\96ातिर à¤\95à¥\8cनà¥\8bà¤\82 à¤¬à¤¿à¤¸à¤¯ à¤¨à¤\87à¤\96à¥\80à¤\82 à¤¦à¤¿à¤¹à¤²à¥\87। à¤\85à¤\97र à¤\86प \"{{int:savearticle}}\" à¤ªà¤° à¤\95à¥\8dलिà¤\95 à¤\95रब à¤¤à¤¬ à¤°à¤¾à¤\89र à¤¸à¤\82पादन à¤\8fà¤\95रà¥\87 à¤¬à¤¿à¤¨à¤¾ à¤¸à¤¹à¥\87à¤\9cा जाई।",
        "summary-preview": "सारांश पूर्वावलोकन:",
-       "subject-preview": "विषय/शिरà¥\8dषà¤\95 à¤ªà¥\82रà¥\8dवावलà¥\8bà¤\95न:",
+       "subject-preview": "बिसय à¤\95à¥\87 à¤\9dलà¤\95:",
        "previewerrortext": "जब आप आपन बदलाव के पुर्वावलोकन देखे खातिर प्रयास कइनी ह तवने घड़ी एगो त्रुटी उत्पन्न हो गइल बा।",
        "blockedtitle": "निष्क्रिय प्रयोगकर्ता",
        "blockedtext": "'''राउर सदस्यनाम अथवा आइ॰पी पता अवरोधित कर दिहल गईल बा ।'''\n\nअवरोध $1 द्वारा करल गईल रहल।\nअवरोध के कारण बा ''$2''\n\n* अवरोध के आरंभ: $8\n* अवरोध के समाप्ति: $6\n* अवरोधित इकाई: $7\n\nइ अवरोध के बारे में चर्चा करे खातिर रउआ $1 या केहु अन्य [[{{MediaWiki:Grouppage-sysop}}|प्रबन्धक]] से संपर्क कर सकत बानी।\nअगर रउआ [[Special:Preferences|आपन वरीयता]] में वैद्य ई-मेल पता प्रविष्ट कइले होखब तबे 'इ प्रयोक्ता के ई-मेल भेजीं' वाला सुविधा के प्रयोग कर सकत बानी अउर रउआ एकर प्रयोग करे से ना रोकल गईल होखे।\nराउर हाल के आइ॰पी पता $3 ह अउर अवरोध क्रमांक #$5 ह।\nआपन कउनो भी प्रश्न में कृपया इ सब जानकारी भी शामिल करब।",
        "previewnote": "'''याद रखीं, इ एगो झलक मात्र हो।'''\nराउर बदलाव अभी तक सुरक्षित नईखे करल गईल!",
        "continue-editing": "संपादन क्षेत्र में जाईं",
        "previewconflict": "ई नमूना ई देखावत बा की अगर रउआँ ए संपादन बक्सा में मौजूद पाठ के सहेजब त ऊ कइसन देखाई पड़ी।",
-       "session_fail_preview": "<strong>माफ करीं! एह सत्र के आँकड़ा के गायब हो गइला की कारण आपके संपादन के प्रॉसेस करे में हमनी के असमर्थ बाणी।</strong>\nदोबारा से कोसिस करीं।\nअगर तबो काम ना होखे तब [[Special:UserLogout|लॉग आउट करीं]] आ दोबारा लॉग इन कइ के कोसिस करी।",
+       "session_fail_preview": "माफ करीं! एह सत्र के आँकड़ा के गायब हो गइला के कारण आपके संपादन के प्रॉसेस करे में हमनी के असमर्थ बानी जा।\nहो सकेला आप लॉगआउट हो गइल होखीं।\n<strong>जाँच लेईं कि आप अभी लॉगिन बानी आ दुबारा कोसिस करीं</strong>।\nअगर तबो काम ना होखे तब [[Special:UserLogout|लॉगआउट कइके]] आ दोबारा लॉग इन कइ के कोसिस करी, आ जाँच करीं कि आपके ब्राउजर एह साइट से कुकीज सभ के मंजूर करत बा।",
        "session_fail_preview_html": "<strong>माफ करीं! सत्र आँकड़ा के गायब होखला की कारन आपके संपादन सहेजल नइखे जा सकत।</strong>\n\n<em>चूँकि, {{SITENAME}} में मूल HTML सक्षम कइल बाटे, जावास्क्रिप्ट हमला से बचाव की खातिर नमूना देखावे के छिपावल गइल बा।</em>\n\n<strong>अगर ई एगो वैध संपादन बाटे तब एक बेर फिर से कोसिस करीं।</strong>\nअगर तबो पर काम नइखे हो पावत त [[Special:UserLogout|लॉग आउट करीं]] आ दुबारा लॉगिन क के कोसिस करीं।",
        "token_suffix_mismatch": "<strong>राउर संपादन रिजेक्ट कइल जात बा काहें से की राउर क्लायंट संपादन टोकन में विराम चीन्हा सब से गड़बड़ क दिहले बा।</strong>\nपन्ना के पाठ के तहस-नहस होखे से बचावे खाती ई संपादन रिजेक्ट कइल गइल बा।\nकबो-कबो अइसन एहू दसा में हो सकेला जब आप खराबी-युक्त वेबआधारित बेनाम प्रॉक्सी सर्वर के इस्तेमाल करत होखीं।",
        "edit_form_incomplete": "<strong>संपादन के कुछ हिस्सा सर्वर ले ना पहुँच पावल ह; दोहरा के चेक करीं की राउर संपादन बदलल न होखे आ एक बेर फिर से सहेजे के कोसिस करीं।</strong>",
        "invalid-content-data": "अवैध डाटा सामग्री",
        "content-not-allowed-here": "\"$1\" सामग्री, पन्ना [[$2]] पर ना डालल जा सकेला।",
        "editwarning-warning": "ए पन्ना के छोड़ के हटला पर आपके कइल बदलाव गायब हो जाई।\nअगर आप लॉगिन कइले बानी तब ए चेतावनी के अपनी सेटिंग में \"{{int:prefs-editing}}\" खंड में जा के बन्द क सकत बानीं।",
+       "editpage-invalidcontentmodel-title": "सामग्री के मॉडल सपोर्टेड नइखे",
        "editpage-notsupportedcontentformat-title": "सामग्री के फॉरमैट सपोर्टेड नइखे।",
        "editpage-notsupportedcontentformat-text": "सामग्री फॉरमैट $1 के सामग्री मॉडल $2 सपोर्ट नइखे करत।",
        "content-model-wikitext": "विकीपाठ्य",
        "searchprofile-everything-tooltip": "सब जगह खोजीं (बातचीत पन्ना सहित)",
        "searchprofile-advanced-tooltip": "विशेष नामस्थान में खोजीं",
        "search-result-size": "$1 ({{PLURAL:$2|1 शब्द|$2 शब्द}})",
-       "search-redirect": "(अनुप्रेषण$1)",
+       "search-redirect": "($1 से अनुप्रेषित)",
        "search-section": "(खंड $1)",
        "search-category": "(श्रेणी $1)",
        "search-suggest": "का राउर मतलब बा: $1",
        "rightslogtext": "ई सदस्यन के सदस्य-अधिकार के बदलाव के लॉग बा",
        "action-read": "ई पन्ना पढ़ीं",
        "action-edit": "ई पन्ना संपादित करीं",
-       "action-createpage": "पन्ना बनाईं",
-       "action-createtalk": "वारà¥\8dता पन्ना बनाईं",
+       "action-createpage": "à¤\88 à¤ªà¤¨à¥\8dना à¤¬à¤¨à¤¾à¤\88à¤\82",
+       "action-createtalk": "à¤\88 à¤¬à¤¾à¤¤à¤\9aà¥\80त पन्ना बनाईं",
        "action-createaccount": "ई सदस्यखाता बनाईं",
        "action-history": "ए पन्ना के इतिहास देखीं",
        "action-minoredit": "ए संपादन के छोट चिह्नित करीं",
index 61c1ed8..31ecf59 100644 (file)
        "booksources-search": "অনুসন্ধান",
        "booksources-text": "নতুন ও পুরাতন ব্যবহৃত বই বিক্রি করে, এমন কতগুলি সাইটের সংযোগের তালিকা নিচে দেওয়া হল, যে সাইটগুলিতে আপনার অনুসন্ধানকৃত বইগুলির উপর আরও তথ্য থাকতে পারে:",
        "booksources-invalid-isbn": "উল্লেখিত ISBN সঠিক নয়; অনুগ্রহ করে মূল উৎস থেকে আবার পরীক্ষা করুন।",
+       "magiclink-tracking-rfc": "আরএফসি জাদু সংযোগ ব্যবহার করা পাতা",
+       "magiclink-tracking-pmid": "পিএমআইডি জাদু সংযোগ ব্যবহার করা পাতা",
+       "magiclink-tracking-isbn": "আইএসবিএন জাদু সংযোগ ব্যবহার করা পাতা",
        "specialloguserlabel": "সম্পাদক:",
        "speciallogtitlelabel": "লক্ষ্য (শিরোনাম বা {{ns:user}}:ব্যবহারকারীর জন্য ব্যবহারকারী নাম):",
        "log": "লগগুলি",
        "activeusers-intro": "এটি ব্যবহারকারী তালিকা যাদের $1 {{PLURAL:$1|দিনে|দিনে}} যেকোন কর্মকান্ড রয়েছে।",
        "activeusers-count": "গত {{PLURAL:$3|কালে|$3 দিনে}} সর্বমোট {{PLURAL:$1|কর্মের}} সংখ্যা $1টি",
        "activeusers-from": "ব্যবহারকারী দেখাও যাদের নাম এই অক্ষর দিয়ে শুরু:",
-       "activeusers-hidebots": "বট লুকাও",
-       "activeusers-hidesysops": "প্রশাসক লুকাও",
        "activeusers-noresult": "কোনো ব্যবহারকারী পাওয়া যায়নি।",
        "activeusers-submit": "সক্রিয় ব্যবহারকারী প্রদর্শন করুন",
        "listgrouprights": "দলগত ব্যবহারকারী অধিকার",
        "changecontentmodel-submit": "পরিবর্তন করুন",
        "changecontentmodel-success-title": "বিষয়বস্তুর প্রতিরূপ পরিবর্তিত হয়েছিলো",
        "changecontentmodel-success-text": "[[:$1]]-এর বিষয়বস্তুর ধরণ পরিবর্তন হয়েছে।",
+       "changecontentmodel-emptymodels-title": "কোন বিষয়বস্তুর মডেল উপলব্ধ নয়",
        "log-name-contentmodel": "বিষয়বস্তুর মডেল পরিবর্তন লগ",
        "logentry-contentmodel-change": "$1 $3 পাতার বিষয়বস্তুর মডেল \"$4\" থেকে \"$5\"-এ {{GENDER:$2|পরিবর্তন করেছেন}}",
        "logentry-contentmodel-change-revertlink": "প্রত্যাবর্তন",
        "modifiedarticleprotection": "\"[[$1]]\"-এর জন্য সুরক্ষার স্তর পরিবর্তন করা হয়েছে",
        "unprotectedarticle": "\"[[$1]]\"-এর সুরক্ষা সরিয়ে নেওয়া হয়েছে",
        "movedarticleprotection": "সুরক্ষা সেটিংস \"[[$2]]\" থেকে \"[[$1]]\"-এ স্থানান্তরিত হয়েছে",
+       "protectedarticle-comment": "\"[[$1]]\" {{GENDER:$2|সুরক্ষিত করা হয়েছে}}",
+       "modifiedarticleprotection-comment": "\"[[$1]]\"-এর {{GENDER:$2|সুরক্ষার স্তর পরিবর্তন করা হয়েছে}}",
+       "unprotectedarticle-comment": "\"[[$1]]\" থেকে {{GENDER:$2|সুরক্ষা সরানো হয়েছে}}",
        "protect-title": "\"$1\" সুরক্ষিত করা হচ্ছে",
        "protect-title-notallowed": "\"$1\" এর সুরক্ষা মাত্রা দেখুন",
        "prot_1movedto2": "[[$1]]-কে [[$2]]-এ সরিয়ে নেওয়া হয়েছে",
index b8261e2..271b343 100644 (file)
        "about": "درباره",
        "newwindow": "(پنجره تازه واز کن)",
        "cancel": "لغو",
-       "mytalk": "صحبت مو",
+       "mytalk": "چأک چنأ",
        "navigation": "ناڤجوری",
        "and": "&#32;و",
        "qbfind": "پیدا کردن",
        "faqpage": "Project:اف ای کیو",
        "namespaces": "نوم ڤأرگأ آ",
        "variants": "آلشدگأرا",
+       "navigation-heading": "نوم جاگأ ناڤگردي",
        "errorpagetitle": "خطا",
        "returnto": "بازگشت به $1.",
        "tagline": "از {{SITENAME}}",
        "site-rss-feed": "خبرخو RSS سی $1",
        "site-atom-feed": "حأڤال خوٙنئ Atom سی $1",
        "page-rss-feed": "خبرخو RSS سی «$1»",
+       "page-atom-feed": "هأڤال خۈن Atom سي $1",
        "red-link-title": "$1 (چونو بألگئ یی نیدٙئس)",
        "nstab-main": "بلگه",
        "nstab-user": "صفحه کاربر",
        "viewsource": "مشاهده منبع",
        "viewsourcetext": "ایسا ترین بوینین وکپی کنین منبع ای صفحه را:",
        "yourname": "نام کاربر:",
+       "userlogin-yourname": "نوم کارياري",
        "yourpassword": "رمز:",
        "login": "اویدن به سیستم",
        "nav-login-createaccount": "اویدن به سیستم",
        "noemail": "وجود نداره نشانی امیل ضبط وابده زه کاریر \"$1\".",
        "passwordsent": "یه رمز تازه ارسال وابید به نشانی امیل ثبت وابده سی \"$1\".\nلطفا بعد از دریافت آن داخل سیستم بوین.",
        "eauthentsent": "یه ایمیل سی تایید آدرس ایمیل به آدرس مورنظر ارسال وابید. قبل زه یو که ایمیل دیگری قابل ارسال به این آدرس بوه، وا دستورهایی که در آن ایمیل اویده را جهت تأیید ای مساله که ای آدرس مال ایسانه اجرا کنین.",
+       "loginlanguagelabel": "زۈن:$1",
        "pt-login": "ڤامین اوڤیڌن",
        "pt-createaccount": "راسد کردن هساڤ کارياري",
        "retypenew": "تایپ دوباره رمز:",
        "lineno": "سطر $1:",
        "compareselectedversions": "مقایسه نسخه‌های انتخاب‌ وابیده",
        "editundo": "لغو اصلاح آخر",
+       "searchresults": "نتيجأ آ پی جۈري سي",
+       "searchresults-title": "نتيجإ آ پی جوري سي \"$1\"",
        "prevn": "قبلی {{PLURAL:$1|$1}}",
        "nextn": "بعدی {{PLURAL:$1|$1}}",
        "viewprevnext": "مشاهده ($1 {{int:pipe-separator}} $2) ($3)",
        "searchprofile-articles": "بلگه آ مینونه دار",
+       "searchprofile-images": "ڤارسگرا خلکمند",
        "searchprofile-everything": "همه چی",
        "searchprofile-advanced": "پیشکرده",
        "searchprofile-articles-tooltip": "بگرد مئن $1",
        "searchprofile-images-tooltip": "جانیاانه پی جوری کو",
        "search-result-size": "$1 ({{PLURAL:$2|1 ڤاجه یل|$2 ڤاجه یل}})",
+       "search-section": "(بهرجا $1)",
        "searchall": "همه",
        "search-nonefound": "هیژ نتیجه یی وا پی جست تو یکی نئ.",
        "preferences": "اولویتها",
        "nchanges": "$1 {{PLURAL:$1|تغییر|تغییرات}}",
        "enhancedrc-history": "ڤیرگار",
        "recentchanges": "تغییرات اخیر",
+       "recentchanges-legend": "گزينإ آ آلشدا ايسإني",
        "recentchanges-feed-description": "ردیابی آخرین تغییرات  ویکی در ای خورد",
        "recentchanges-label-minor": "یو یه ويرايشت کوچيره",
        "recentchanges-label-unpatrolled": "ای ويرايشت هنی تيه واداشت نوابيه",
+       "recentchanges-legend-heading": "<strong>میراث:</strong>",
        "rcnotefrom": "در زیر تغییرات زه تاریخ <b>$2</b> آمده‌اند (تا <b>$1</b> مورد نشو داده ابوه).",
        "rclistfrom": "نشودادن تغییرات تازه با شروع زه $3 $2",
        "rcshowhideminor": "اصلاحات کوچیک $1",
        "upload": "آپلود فایل",
        "uploadbtn": "آپلود فایل",
        "uploadlogpage": "نمایه آپلود",
+       "filedesc": "چكستأ",
+       "imgfile": "جانيا",
        "listfiles": "لیست فایل",
        "file-anchor-link": "فایل",
        "filehist": "گزارش تاریخی فایل",
        "invert": "انتخاب برعکس بوه",
        "blanknamespace": "(اصلی)",
        "contributions": "{{GENDER:$1|کاریار}} هومیاریا",
-       "mycontris": "شراکتهای مو",
+       "mycontris": "هومياریا",
        "contribsub2": "سی $1 ($2)",
        "uctop": "(بالا)",
        "month": "در این ماه (و قبل زه آن):",
        "whatlinkshere-prev": "{{PLURAL:$1|قبلی |مورد قبلی$1}}",
        "whatlinkshere-next": "{{PLURAL:$1|بعدی |مورد بعدی $1}}",
        "whatlinkshere-links": "← لینکها",
+       "whatlinkshere-filters": "فيلترا",
        "blockip": "بستن کاربر",
        "ipboptions": "۲ ساعت:2 hours,۱ روز:1 day,۳ روز:3 days,۱ هفته:1 week,۲ هفته:2 weeks,۱ ماه:1 month,۳ ماه:3 months,۶ ماه:6 months,۱ سال:1 year,بی‌نهایت:infinite",
        "ipblocklist": "آدرسهای  آی پی وکاربران بسته وابیدند",
        "thumbnail-more": "گپ کردن",
        "thumbnail_error": "خطا سی درست کردن ناخن دانه: $1",
        "importlogpage": "داخل نمایه کردن",
-       "tooltip-pt-userpage": "صفحه کاربری مو",
+       "tooltip-pt-userpage": "{{GENDER:|بألگأ کارياريتۈن}} بألگأ",
        "tooltip-pt-mytalk": "صفحه صحبت مو",
-       "tooltip-pt-preferences": "اولویت های مو",
+       "tooltip-pt-preferences": "{{GENDER:|ايسا}} أصل کاريا",
        "tooltip-pt-watchlist": "لیست صفحه‌هایی که ایسا تغییرات هونو  دنبال اکنین",
        "tooltip-pt-mycontris": "لیست شراکتهای مو",
        "tooltip-pt-login": "توصیه ابوه که به سیستم داخل بوین اما اجباری نه.",
        "tooltip-ca-unwatch": "حذف ای صفحه زه لیست پی‌گیری‌های ایسا",
        "tooltip-search": "جستن {{SITENAME}}",
        "tooltip-search-fulltext": "بألگأ آنأ سي چونو نإڤشدإیي پإی جۈري کو",
+       "tooltip-p-logo": "بإنیرين بإ سرآسۈنأ",
        "tooltip-n-mainpage": "دیدن صفحه اصلی",
        "tooltip-n-mainpage-description": "بإنیرين به سرآسونه",
        "tooltip-n-portal": "درباره ای پروژه چه ترین  کنین و  کیه  ترین آن جیزها رو پیدا کنین",
        "file-nohires": "قابلیت تفکیک بالاتری در دسترس نه.",
        "svg-long-desc": "SVG فایل, تقریبا$1 × $2 پیکسل, اندازه فایل: $3",
        "show-big-image": "جانیا اصلی",
+       "show-big-image-size": "$1 × $2 پیکسل",
        "newimages": "گالری فایلهای تازه",
        "bad_image_list": "اطلاعات را وا به ای شکل وارد کنین:\n\nفقط سطرهایی که با * آغاز ابون در نظر گریده ابون. اولین لینک در هر سطر، باید لینکی به یک تصویر بد باشد.\nلینکهای بعدی در همان سطر، به عنوان موارد استثنا در نظر گریده ابون",
        "metadata": "فراداده",
        "metadata-expand": "نشودادن جزئیات تفصیلی",
        "metadata-collapse": "قایم کردن جزئیات تفصیلی",
        "metadata-fields": "فراداده EXIF نشو داده وابیده در این پیام وقتی جدول فراداده‌های تصویر جمع وابیده بوه هم نمایش داده ابوه.\nبقیه موارد فقط وقتی نشوداده ابوه که جدول یادشده واز بوه.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
+       "exif-orientation": "سرچشمأ",
+       "exif-make": "سازیار دیربین",
+       "exif-model": "مودل ديربين",
+       "exif-colorspace": "رنگ ڤأرگأ",
+       "exif-orientation-1": "عادي",
        "namespacesall": "همه",
        "monthsall": "همه ماهها",
        "semicolon-separator": "؛&#32;",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|چک چنه]])",
        "version": "ترجمه یا تفسیر",
        "specialpages": "صفحات ویژه",
+       "tag-filter": "[[Special:سرديسا|سرديس]] فيلتر:",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|سرديس|سرديسا}}]]: $2)",
        "searchsuggest-search": "جستن {{SITENAME}}"
 }
index 8c49a2e..114b000 100644 (file)
        "period-am": "AM",
        "period-pm": "PM",
        "pagecategories": "{{PLURAL:$1|Kategorija|Kategorije}}",
-       "category_header": "Članci u kategoriji \"$1\"",
+       "category_header": "Stranice u kategoriji \"$1\"",
        "subcategories": "Potkategorije",
        "category-media-header": "Datoteke u kategoriji \"$1\"",
        "category-empty": "''Ova kategorija trenutno ne sadrži članke ni medije.''",
        "hidden-category-category": "Skrivene kategorije",
        "category-subcat-count": "{{PLURAL:$2|Ova kategorija samo ima sljedeću potkategoriju.|Ova kategorija ima {{PLURAL:$1|sljedeću potkategoriju|sljedeće $1 potkategorije|sljedećih $1 potkategorija}}, od $2 ukupno.}}",
        "category-subcat-count-limited": "Ova kategorija sadrži {{PLURAL:$1|sljedeću $1 potkategoriju|sljedeće $1 potkategorije|sljedećih $1 potkategorija}}.",
-       "category-article-count": "{{PLURAL:$2|U ovoj kategoriji nalazi se $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": "{{PLURAL:$2|Ova kategorija sadrži samo sljedeću stranicu.|{{PLURAL:$1|Sljedeća stranica je|Sljedeće $1 stranice su|Sljedećih $1 stranica je}} u ovoj kategoriji, od ukupno $2.}}",
        "category-article-count-limited": "{{PLURAL:$1|Slijedeća $1 stranica je|Slijedeće $1 stranice su|Slijedećih $1 stranica je}} u ovoj kategoriji.",
        "category-file-count": "{{PLURAL:$2|Ova kategorija ima slijedeću $1 datoteku.|{{PLURAL:$1|Prikazana je $1 datoteka|Prikazane su $1 datoteke|Prikazano je $1 datoteka}} u ovoj kategoriji, od ukupno $2.}}",
        "category-file-count-limited": "{{PLURAL:$1|Slijedeća $1 datoteka je|Slijedeće $1 datoteke su|Slijedećih $1 datoteka je}} u ovoj kategoriji.",
        "filehist-filesize": "Veličina datoteke",
        "filehist-comment": "Komentar",
        "imagelinks": "Upotreba datoteke",
-       "linkstoimage": "{{PLURAL:$1|Slijedeća stranica koristi|Slijedećih $1 stranica koriste}} ovu sliku:",
+       "linkstoimage": "{{PLURAL:$1|Sljedeća stranica koristi|Sljedeće $1 stranice koriste|Sljedećih $1 stranica koristi}} ovu datoteku:",
        "linkstoimage-more": "Više od $1 {{PLURAL:$1|datoteke|datoteka}} povezano je s ovom datotekom.\nSljedeći spisak pokazuje samo {{PLURAL:$1|prvu stranicu povezanu|prve $1 stranice povezane|prvih $1 stranica povezanih}} s ovom datotekom.\nOvdje je dostupan [[Special:WhatLinksHere/$2|potpuni spisak]].",
        "nolinkstoimage": "Nema stranica koje koriste ovu datoteku.",
        "morelinkstoimage": "Vidi [[Special:WhatLinksHere/$1|ostale linkove]] prema ovoj datoteci.",
        "pageswithprop-prophidden-long": "sakriveno dugo tekstualno svojstvo ($1)",
        "pageswithprop-prophidden-binary": "sakriveno dugo binarno svojstvo ($1)",
        "doubleredirects": "Dvostruka preusmjerenja",
-       "doubleredirectstext": "Ova stranica prikazuje stranice koje preusmjeravaju na druga preusmjerenja.\nSvaki red sadrži veze na prvo i drugo preusmjerenje, kao i na prvu liniju teksta drugog preusmjerenja, što obično daje \"pravi\" ciljni članak, na koji bi prvo preusmjerenje i trebalo da pokazuje.\n<del>Precrtane</del> stavke su riješene.",
+       "doubleredirectstext": "Ova stranica prikazuje stranice koje preusmjeravaju na druga preusmjerenja.\nSvaki red sadrži linkove na prvo i drugo preusmjerenje, kao i na odredišnu stranicu drugog preusmjerenja koja je obično \"pravi\" članak na koji bi prvo preusmjerenje trebalo upućivati.\n<del>Precrtane</del> stavke su riješene.",
        "double-redirect-fixed-move": "[[$1]] je premješten.\nAutomatski je ažuriran i sada preusmjerava na [[$2]].",
        "double-redirect-fixed-maintenance": "Automatsko ospravljanje dvostrukih preusmjerenja sa [[$1]] na [[$2]] je posao održavanja.",
        "double-redirect-fixer": "Popravljač preusmjerenja",
        "activeusers-intro": "Ovo je spisak korisnika koji su imali neku aktivnost u {{PLURAL:$1|posljednji $1 dan|posljednja $1 dana|posljednjih $1 dana}}.",
        "activeusers-count": "$1 {{PLURAL:$1|izmjena|izmjene|izmjena}} u {{PLURAL:$3|posljednji $3 dan|posljednja $3 dana|posljednjih $3 dana}}",
        "activeusers-from": "Prikaži korisnike koji počinju sa:",
-       "activeusers-hidebots": "Sakrij botove",
-       "activeusers-hidesysops": "Sakrij administratore",
        "activeusers-noresult": "Nije pronađen korisnik.",
        "listgrouprights": "Prava korisničkih grupa",
        "listgrouprights-summary": "Slijedi spisak korisničkih grupa na ovoj wiki, s njihovim pripadajućim pravima pristupa.\nMoguće je da o svakoj grupi postoje [[{{MediaWiki:Listgrouprights-helppage}}|dodatne informacije]].",
        "logentry-contentmodel-change": "$1 {{GENDER:$2|promijenio|promijenila}} je model sadržaja stranice $3 iz \"$4\" u \"$5\"",
        "logentry-contentmodel-change-revertlink": "vrati",
        "logentry-contentmodel-change-revert": "vrati",
-       "protectlogpage": "Zapisnik zaključavanja",
+       "protectlogpage": "Zapisnik zaštite",
        "protectlogtext": "Ispod je spisak promjena zaštićenja stranice.\nPogledajte [[Special:ProtectedPages|spisak zaštićenih stranica]] za pregled trenutno zaštićenih stranica.",
        "protectedarticle": "{{GENDER:|zaštitio|zaštitila}} je stranicu \"[[$1]]\"",
        "modifiedarticleprotection": "{{GENDER:|promijenio|promijenila}} je stepen zaštite stranice \"[[$1]]\"",
        "restriction-level-all": "svi nivoi",
        "undelete": "Pregled obrisanih stranica",
        "undeletepage": "Pregled i vraćanje obrisanih stranica",
-       "undeletepagetitle": "<strong>Sljedeći sadržaj prikazuje obrisane izmjene stranice [[:$1|$1]]<strong>.",
+       "undeletepagetitle": "<strong>Sljedeći sadržaj prikazuje obrisane izmjene stranice [[:$1|$1]]</strong>.",
        "viewdeletedpage": "Pregled obrisanih stranica",
        "undeletepagetext": "{{PLURAL:$1|Slijedeća $1 stranica je obrisana|Slijedeće $1 stranice su obrisane|Slijedećih $1 je obrisano}} ali su još uvijek u arhivi i mogu biti vraćene.\nArhiva moše biti periodično čišćena.",
        "undelete-fieldset-title": "Vraćanje izmjena",
        "move-watch": "Prati izvornu i odredišnu stranicu",
        "movepagebtn": "Premjesti stranicu",
        "pagemovedsub": "Premještanje uspjelo",
-       "movepage-moved": "'''\"$1\" je premještena na \"$2\"'''",
+       "movepage-moved": "<strong>\"$1\" je premještena na \"$2\"</strong>",
        "movepage-moved-redirect": "Preusmjerenje je napravljeno.",
        "movepage-moved-noredirect": "Pravljenje preusmjerenja je onemogućeno.",
        "articleexists": "Stranica pod tim imenom već postoji ili je ime koje ste izabrali neispravno. Molimo Vas da izaberete drugo ime.",
        "movenosubpage": "Ova stranica nema podstranica.",
        "movereason": "Razlog:",
        "revertmove": "vrati",
-       "delete_and_move_text": "==Potebno brisanje==\nOdredišna stranica \"[[:$1]]\" već postoji.\nDa li je želite obrisati kako bi ste mogli izvršiti premještanje?",
+       "delete_and_move_text": "Odredišna stranica \"[[:$1]]\" već postoji.\nŽelite li je obrisati da biste oslobodili mjesto za premještanje?",
        "delete_and_move_confirm": "Da, obriš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.",
        "tooltip-ca-move": "Premjesti ovu stranicu",
        "tooltip-ca-watch": "Dodajte stranicu u listu praćnih članaka",
        "tooltip-ca-unwatch": "Ukloni ovu stranicu sa spiska praćenih članaka",
-       "tooltip-search": "Pretraži projekat {{SITENAME}}",
+       "tooltip-search": "Pretraži {{GRAMMAR:akuzativ|{{SITENAME}}}}",
        "tooltip-search-go": "Idi na stranicu s tačno ovim imenom ako postoji",
        "tooltip-search-fulltext": "Pretražite stranice s ovim tekstom",
        "tooltip-p-logo": "Glavna stranica",
        "pageinfo-category-subcats": "Broj potkategorija",
        "pageinfo-category-files": "Broj datoteka",
        "markaspatrolleddiff": "Označi kao patrolirano",
-       "markaspatrolledtext": "Označi ovaj članak kao patroliran",
+       "markaspatrolledtext": "Označi stranicu kao patroliranu",
        "markedaspatrolled": "Označeno kao patrolirano",
        "markedaspatrolledtext": "Izabrana revizija [[:$1]] je bila označena kao patrolirana.",
        "rcpatroldisabled": "Patroliranje nedavnih izmjena onemogućeno",
        "htmlform-user-not-valid": "<strong>$1</strong> nije ispravno korisničko ime.",
        "logentry-delete-delete": "$1 {{GENDER:$2|obrisao|obrisala}} je stranicu $3",
        "logentry-delete-restore": "$1 {{GENDER:$2|vratio|vratila}} je stranicu $3",
-       "logentry-delete-event": "$1 je {{GENDER:$2|promijenio|promijenila}} vidljivost {{PLURAL:$5|događaja|$5 događaja}} u evidenciji na $3: $4",
+       "logentry-delete-event": "$1 {{GENDER:$2|promijenio|promijenila}} je vidljivost {{PLURAL:$5|unosa|$5 unosa}} u zapisniku na $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|promijenio|promijenila}} je vidljivost {{PLURAL:$5|izmjene|$5 izmjene|$5 izmjena}} na stranici $3: $4",
        "logentry-delete-event-legacy": "$1 je {{GENDER:$2|promijenio|promijenila}} vidljivost događaja u evidenciji na $3",
        "logentry-delete-revision-legacy": "$1 je {{GENDER:$2|promijenio|promijenila}} vidljivost izmjena na stranici $3",
        "mw-widgets-titleinput-description-redirect": "preusmjerava na $1",
        "randomrootpage": "Slučajna root stranica",
        "log-action-filter-block": "Vrsta blokiranja:",
+       "log-action-filter-contentmodel": "Vrsta izmjene modela sadržaja:",
        "log-action-filter-delete": "Vrsta brisanja:",
+       "log-action-filter-import": "Vrsta uvoza:",
+       "log-action-filter-managetags": "Vrsta uređivanja oznaka:",
+       "log-action-filter-move": "Vrsta premještanja:",
+       "log-action-filter-newusers": "Način stvaranja računa:",
+       "log-action-filter-patrol": "Vrsta patroliranja:",
+       "log-action-filter-protect": "Vrsta zaštite:",
+       "log-action-filter-rights": "Vrsta izmjene korisničkih prava:",
+       "log-action-filter-upload": "Vrsta postavljanja:",
        "log-action-filter-all": "Sve",
        "log-action-filter-block-block": "Blokiranje",
        "log-action-filter-block-reblock": "Izmjena blokiranja",
        "log-action-filter-block-unblock": "Deblokiranje",
+       "log-action-filter-contentmodel-change": "Izmjena modela sadržaja",
+       "log-action-filter-contentmodel-new": "Nova stranica s nestandardnim modelom sadržaja",
        "log-action-filter-delete-delete": "Brisanje stranice",
        "log-action-filter-delete-restore": "Vraćanje obrisane stranice",
        "log-action-filter-delete-event": "Brisanje unosa u zapisniku",
-       "log-action-filter-delete-revision": "Brisanje izmjene"
+       "log-action-filter-delete-revision": "Brisanje izmjene",
+       "log-action-filter-import-interwiki": "Uvoz između wikija",
+       "log-action-filter-import-upload": "Uvoz postavljanjem XML-a",
+       "log-action-filter-managetags-create": "Nova oznaka",
+       "log-action-filter-managetags-delete": "Brisanje oznake",
+       "log-action-filter-managetags-activate": "Aktiviranje oznake",
+       "log-action-filter-managetags-deactivate": "Deaktiviranje oznake",
+       "log-action-filter-move-move": "Premještanje bez presnimavanja preusmjerenja",
+       "log-action-filter-move-move_redir": "Premještanje s presnimavanjem preusmjerenja",
+       "log-action-filter-newusers-create": "Stvorio anonimni korisnik",
+       "log-action-filter-newusers-create2": "Stvorio registrirani korisnik",
+       "log-action-filter-newusers-autocreate": "Automatski stvoren",
+       "log-action-filter-newusers-byemail": "Stvoren lozinkom poslanom na adresu e-pošte",
+       "log-action-filter-patrol-patrol": "Ručno patrolirano",
+       "log-action-filter-patrol-autopatrol": "Automatski patrolirano",
+       "log-action-filter-protect-protect": "Dodavanje zaštite",
+       "log-action-filter-protect-modify": "Izmjena zaštite",
+       "log-action-filter-protect-unprotect": "Uklanjanje zaštite",
+       "log-action-filter-protect-move_prot": "Premještanje zaštite",
+       "log-action-filter-rights-rights": "Ručna izmjena",
+       "log-action-filter-rights-autopromote": "Automatska izmjena",
+       "log-action-filter-upload-upload": "Nova datoteka",
+       "log-action-filter-upload-overwrite": "Izmjena postojeće datoteke"
 }
index 695b726..5140c81 100644 (file)
        "grant-basic": "Základní oprávnění",
        "grant-viewdeleted": "Prohlížet si smazané soubory a stránky",
        "grant-viewmywatchlist": "Prohlížet si váš seznam sledovaných stránek",
+       "grant-viewrestrictedlogs": "Prohlížet si tajné protokolovací záznamy",
        "newuserlogpage": "Kniha nových uživatelů",
        "newuserlogpagetext": "Toto je záznam nově zaregistrovaných uživatelů.",
        "rightslog": "Kniha práv uživatelů",
        "rcshowhideminor": "$1 malé editace",
        "rcshowhideminor-show": "Zobrazit",
        "rcshowhideminor-hide": "Skrýt",
-       "rcshowhidebots": "$1 boty",
+       "rcshowhidebots": "$1 roboty",
        "rcshowhidebots-show": "Zobrazit",
        "rcshowhidebots-hide": "Skrýt",
        "rcshowhideliu": "$1 registrované uživatele",
        "booksources-search": "Hledat",
        "booksources-text": "Níže je seznam odkazů na servery prodávající knihy, nebo které mohou mít další informace o knihách, které hledáte.",
        "booksources-invalid-isbn": "Zadané ISBN se zdá být neplatné. Zkontrolujte jej s originálním zdrojem.",
+       "magiclink-tracking-rfc": "Stránky používající kouzelné odkazy RFC",
+       "magiclink-tracking-rfc-desc": "Tato stránka používá kouzelné odkazy RFC. Více informací k migraci najdete na [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org].",
+       "magiclink-tracking-pmid": "Stránky používající kouzelné odkazy PMID",
+       "magiclink-tracking-pmid-desc": "Tato stránka používá kouzelné odkazy PMID. Více informací k migraci najdete na [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org].",
+       "magiclink-tracking-isbn": "Stránky používající kouzelné odkazy ISBN",
+       "magiclink-tracking-isbn-desc": "Tato stránka používá kouzelné odkazy ISBN. Více informací k migraci najdete na [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org].",
        "specialloguserlabel": "Původce:",
        "speciallogtitlelabel": "Cíl (název nebo {{ns:user}}:Jméno pro uživatele):",
        "log": "Protokolovací záznamy",
        "activeusers-intro": "Toto je seznam uživatelů, kteří byli nějak aktivní v {{PLURAL:$1|posledním dni|posledních $1 dnech}}.",
        "activeusers-count": "$1 {{PLURAL:$1|akce|akce|akcí}} během {{PLURAL:$3|posledního dne|posledních $3 dnů}}",
        "activeusers-from": "Zobrazit uživatele počínaje od:",
-       "activeusers-hidebots": "Skrýt roboty",
-       "activeusers-hidesysops": "Skrýt správce",
+       "activeusers-groups": "Zobrazit uživatele patřící do skupin:",
        "activeusers-noresult": "Nenalezen žádný uživatel.",
        "activeusers-submit": "Zobrazit aktivní uživatele",
        "listgrouprights": "Práva skupin uživatelů",
        "watchlist-submit": "Zobrazit",
        "wlshowtime": "Zobrazené období:",
        "wlshowhideminor": "malé editace",
-       "wlshowhidebots": "boty",
+       "wlshowhidebots": "roboty",
        "wlshowhideliu": "registrované uživatele",
        "wlshowhideanons": "anonymní uživatele",
        "wlshowhidepatr": "prověřené editace",
        "modifiedarticleprotection": "mění zámek stránky „[[$1]]“",
        "unprotectedarticle": "odemyká „[[$1]]“",
        "movedarticleprotection": "nastavení zámků přesunuto z „[[$2]]“ na „[[$1]]“",
+       "protectedarticle-comment": "{{GENDER:$2|Zamkl|Zamkla}} stránku „[[$1]]“",
+       "modifiedarticleprotection-comment": "{{GENDER:$2|Změnil|Změnila}} nastavení zámků stránky „[[$1]]“",
+       "unprotectedarticle-comment": "{{GENDER:$2|Odemkl|Odemkla}} stránku „[[$1]]“",
        "protect-title": "Zamyká se „$1“",
        "protect-title-notallowed": "Zobrazení zámků na „$1“",
        "prot_1movedto2": "Stránka [[$1]] přemístěna na stránku [[$2]]",
        "newimages-summary": "Na této speciální stránce se zobrazují poslední načtené soubory.",
        "newimages-legend": "Filtr",
        "newimages-label": "Název souboru (nebo jeho část):",
-       "newimages-showbots": "Zobrazit soubory načtené boty",
+       "newimages-showbots": "Zobrazit soubory načtené roboty",
        "newimages-hidepatrolled": "Skrýt prověřená načtení souborů",
        "noimages": "Není co zobrazit.",
        "gallery-slideshow-toggle": "Přepnout náhledy",
        "tags-active-yes": "Ano",
        "tags-active-no": "Ne",
        "tags-source-extension": "Definována softwarem",
-       "tags-source-manual": "Přidávána ručně uživateli a boty",
+       "tags-source-manual": "Přidávána ručně uživateli a roboty",
        "tags-source-none": "Už nepoužívána",
        "tags-edit": "editovat",
        "tags-delete": "smazat",
        "log-description-managetags": "Tato stránka obsahuje seznam správcovských úkonů týkajících se [[Special:Tags|značek]]. Protokol obsahuje pouze akce, které provedl ručně správce; značky může vytvářet či mazat přímo software wiki, aniž by v tomto protokolu vznikl záznam.",
        "logentry-managetags-create": "$1 {{GENDER:$2|vytvořil|vytvořila}} značku „$4“",
        "logentry-managetags-delete": "$1 {{GENDER:$2|smazal|smazala}} značku „$4“ (odstraněna z $5 {{PLURAL:$5|revize nebo protokolovacího záznamu|revizí nebo protokolovacích záznamů}})",
-       "logentry-managetags-activate": "$1 {{GENDER:$2|aktivoval|aktivovala}} značku „$4“ pro uživatele a boty",
-       "logentry-managetags-deactivate": "$1 {{GENDER:$2|deaktivoval|deaktivovala}} značku „$4“ pro uživatele a boty",
+       "logentry-managetags-activate": "$1 {{GENDER:$2|aktivoval|aktivovala}} značku „$4“ pro uživatele a roboty",
+       "logentry-managetags-deactivate": "$1 {{GENDER:$2|deaktivoval|deaktivovala}} značku „$4“ pro uživatele a roboty",
        "log-name-tag": "Kniha značek",
        "log-description-tag": "Tato stránka zobrazuje přidání či odebrání [[Special:Tags|značek]] na stránkách či protokolovacích záznamech uživateli. Tato kniha nezaznamenává označování probíhající jako součást editace, smazání či podobné akce.",
        "logentry-tag-update-add-revision": "$1 {{GENDER:$2|přidal|přidala}} {{PLURAL:$7|značku|značky}} $6 na revizi $4 stránky $3",
index c2eeeba..df0b4e1 100644 (file)
@@ -86,7 +86,7 @@
        "tog-enotifminoredits": "Send mig også en e-mail ved mindre ændringer af sider og filer på min overvågningsliste",
        "tog-enotifrevealaddr": "Vis min e-mailadresse i e-mails med besked om ændringer",
        "tog-shownumberswatching": "Vis antal brugere, der overvåger",
-       "tog-oldsig": "Nuværende signatur:",
+       "tog-oldsig": "Din nuværende signatur:",
        "tog-fancysig": "Behandl signatur som wikitekst uden automatisk henvisning",
        "tog-uselivepreview": "Benyt løbende forhåndsvisning",
        "tog-forceeditsummary": "Advar mig hvis jeg ikke udfylder beskrivelsesfeltet",
        "newwindow": "(åbner i et nyt vindue)",
        "cancel": "Afbryd",
        "moredotdotdot": "Mere...",
-       "morenotlisted": "Denne liste er ikke komplet.",
+       "morenotlisted": "Denne liste er måske ikke fuldstændig.",
        "mypage": "Side",
        "mytalk": "Diskussion",
        "anontalk": "Diskussion",
        "searchprofile-advanced-tooltip": "Søg i bestemte navnerum",
        "search-result-size": "$1 ({{PLURAL:$2|et ord|$2 ord}})",
        "search-result-category-size": "{{PLURAL:$1|1 medlem|$1 medlemmer}} ({{PLURAL:$2|1 underkategori|$2 underkategorier}}, {{PLURAL:$3|1 fil|$3 filer}})",
-       "search-redirect": "(omdirigering $1)",
+       "search-redirect": "(omdirigering fra $1)",
        "search-section": "(afsnit $1)",
        "search-category": "(kategorien $1)",
        "search-file-match": "(svarer til filens indhold)",
        "upload-copy-upload-invalid-domain": "Uploads af kopier er ikke tilgængelig fra dette domæne.",
        "upload-dialog-title": "Læg en fil op",
        "upload-dialog-button-cancel": "Annuller",
+       "upload-dialog-button-back": "Tilbage",
        "upload-dialog-button-done": "Færdig",
        "upload-dialog-button-save": "Gem",
        "upload-dialog-button-upload": "Læg op",
        "upload-form-label-infoform-description": "Beskrivelse",
        "upload-form-label-usage-title": "Anvendelse",
        "upload-form-label-usage-filename": "Filnavn",
+       "upload-form-label-own-work": "Dette er mit eget værk",
        "upload-form-label-infoform-categories": "Kategorier",
        "upload-form-label-infoform-date": "Dato",
        "upload-form-label-own-work-message-generic-local": "Jeg bekræfter at jeg uploader filen i overenstemmelse med betingelser for brug og licenseringspoltikken på {{SITENAME}}.",
        "activeusers-intro": "Dette er en liste over brugere, som har haft en eller anden form for aktivitet inden for {{PLURAL:$1|den|de}} seneste {{PLURAL:$1|dag|$1 dage}}.",
        "activeusers-count": "$1 {{PLURAL:$1|handling|handlinger}} i {{PLURAL:$3|det seneste døgn|de seneste $3 dage}}",
        "activeusers-from": "Vis brugere som starter med:",
-       "activeusers-hidebots": "Skjul robotter",
-       "activeusers-hidesysops": "Skjul administratorer",
        "activeusers-noresult": "Ingen brugere fundet.",
        "listgrouprights": "Brugergrupperettigheder",
        "listgrouprights-summary": "Denne side viser de brugergrupper der er defineret på denne wiki og de enkelte gruppers rettigheder.\n\nDer findes muligvis [[{{MediaWiki:Listgrouprights-helppage}}|yderligere information]] om de enkelte rettigheder.",
        "export-download": "Tilbyd at gemme som en fil",
        "export-templates": "Medtag skabeloner",
        "export-pagelinks": "Inkluder henviste sider til en dybde på:",
+       "export-manual": "Tilføj sider manuelt:",
        "allmessages": "Alle beskeder",
        "allmessagesname": "Navn",
        "allmessagesdefault": "Standardtekst",
        "confirm-watch-top": "Tilføj denne side til din overvågningsliste?",
        "confirm-unwatch-button": "OK",
        "confirm-unwatch-top": "Fjern denne side fra din overvågningsliste?",
+       "confirm-rollback-button": "OK",
        "quotation-marks": "\"$1\"",
        "imgmultipageprev": "← forrige side",
        "imgmultipagenext": "næste side →",
        "htmlform-cloner-create": "Tilføj flere",
        "htmlform-cloner-delete": "Fjern",
        "htmlform-cloner-required": "Der kræves mindst en værdi.",
+       "htmlform-date-placeholder": "ÅÅÅÅ-MM-DD",
        "logentry-delete-delete": "$1 {{GENDER:$2|slettede}} siden $3",
        "logentry-delete-restore": "$1 {{GENDER:$2|gendannede}} siden $3",
        "logentry-delete-event": "$1 {{GENDER:$2|ændrede}} synligheden af {{PLURAL:$5|en loghændelse|$5 loghændelser}} for siden $3: $4",
        "feedback-cancel": "Afbryd",
        "feedback-close": "Færdig",
        "feedback-dialog-title": "Indsend feedback",
-       "feedback-error-title": "Fejl",
        "feedback-error1": "Fejl: Ukendt resultat fra API",
        "feedback-error2": "Fejl: Redigering mislykkedes",
        "feedback-error3": "Fejl: Intet svar fra API",
        "feedback-submit": "Send",
        "feedback-thanks": "Tak! Dine tilbagemeldinger er blevet noteret på siden \"[$2 $1]\".",
        "feedback-thanks-title": "Tak!",
-       "searchsuggest-search": "Søg",
+       "searchsuggest-search": "Søg på {{SITENAME}}",
        "searchsuggest-containing": "indeholder...",
        "api-error-badaccess-groups": "Du har ikke tilladelse til at overføre filer til denne wiki.",
        "api-error-badtoken": "Intern fejl: ugyldigt mærke.",
        "special-characters-group-ipa": "IPA",
        "special-characters-group-symbols": "Symboler",
        "special-characters-group-greek": "Græsk",
+       "special-characters-group-greekextended": "Udvidet græsk",
        "special-characters-group-cyrillic": "Kyrillisk",
        "special-characters-group-arabic": "Arabisk",
        "special-characters-group-arabicextended": "Udvidet arabisk",
        "log-action-filter-protect-protect": "Beskyttelse",
        "log-action-filter-protect-modify": "Ændring af beskyttelse",
        "log-action-filter-protect-unprotect": "Fjernede beskyttelse",
-       "log-action-filter-protect-move_prot": "Flyttede beskyttelse"
+       "log-action-filter-protect-move_prot": "Flyttede beskyttelse",
+       "authmanager-provider-temporarypassword": "Midlertidig adgangskode",
+       "edit-error-short": "Fejl: $1"
 }
index 794a936..792991a 100644 (file)
        "tog-enotifminoredits": "Auch bei kleinen Änderungen an Seiten und Dateien E-Mails senden",
        "tog-enotifrevealaddr": "Meine E-Mail-Adresse in Benachrichtigungs-E-Mails anzeigen",
        "tog-shownumberswatching": "Anzahl der beobachtenden Benutzer anzeigen",
-       "tog-oldsig": "Deine vorhandene Signatur:",
+       "tog-oldsig": "Die vorhandene Signatur:",
        "tog-fancysig": "Signatur als Wikitext behandeln (ohne automatische Verlinkung)",
        "tog-uselivepreview": "Vorschau sofort anzeigen",
        "tog-forceeditsummary": "Warnen, sofern beim Speichern die Zusammenfassung fehlt",
        "tog-watchlisthidepatrolled": "Kontrollierte Änderungen in der Beobachtungsliste ausblenden",
        "tog-watchlisthidecategorization": "Kategorisierungen von Seiten in der Beobachtungsliste ausblenden",
        "tog-ccmeonemails": "Schicke mir Kopien der E-Mails, die ich anderen Benutzern sende",
-       "tog-diffonly": "Beim Versionsvergleich nur die Unterschiede und nicht die vollständige Seite anzeigen",
+       "tog-diffonly": "Nur die Unterschiede und nicht die vollständige Seite anzeigen",
        "tog-showhiddencats": "Versteckte Kategorien anzeigen",
-       "tog-norollbackdiff": "Unterschied nach dem Zurücksetzen nicht anzeigen",
+       "tog-norollbackdiff": "Unterschiede nach dem Zurücksetzen nicht anzeigen",
        "tog-useeditwarning": "Warnen, sofern eine zur Bearbeitung geöffnete Seite verlassen wird, die nicht gespeicherte Änderungen enthält",
        "tog-prefershttps": "Während angemeldet, immer eine sichere Verbindung benutzen.",
        "underline-always": "immer",
        "botpasswords-label-delete": "Löschen",
        "botpasswords-label-resetpassword": "Passwort zurücksetzen",
        "botpasswords-label-grants": "Anwendbare Berechtigungen:",
-       "botpasswords-help-grants": "Jede Berechtigung gibt Zugriff auf gelistete Benutzerrechte, die ein Benutzerkonto bereits hat. Siehe die [[Special:ListGrants|Tabelle]] für weitere Informationen.",
+       "botpasswords-help-grants": "Berechtigungen erlauben den Zugriff auf Rechte, die bereits dein Benutzerkonto besitzt. Das Aktivieren einer Berechtigung hier bietet keinen Zugriff auf Rechte, die dein Benutzerkonto ansonsten nicht hat. Siehe die [[Special:ListGrants|Berechtigungstabelle]] für weitere Informationen.",
        "botpasswords-label-grants-column": "Gewährt",
        "botpasswords-bad-appid": "Der Botname „$1“ ist nicht gültig.",
        "botpasswords-insert-failed": "Der Botname „$1“ konnte nicht hinzugefügt werden. Wurde er bereits hinzugefügt?",
        "prefs-custom-js": "Benutzerdefiniertes JavaScript",
        "prefs-common-css-js": "Gemeinsames CSS/JavaScript aller Benutzeroberflächen:",
        "prefs-reset-intro": "Du kannst diese Seite verwenden, um die Einstellungen auf die Standards zurückzusetzen.\nDies kann nicht mehr rückgängig gemacht werden.",
-       "prefs-emailconfirm-label": "E-Mail-Bestätigung:",
+       "prefs-emailconfirm-label": "Bestätigung:",
        "youremail": "E-Mail-Adresse:",
        "username": "{{GENDER:$1|Benutzername}}:",
        "prefs-memberingroups": "{{GENDER:$2|Mitglied}} der {{PLURAL:$1|Benutzergruppe|Benutzergruppen}}:",
        "grant-basic": "Basisrechte",
        "grant-viewdeleted": "Gelöschte Dateien und Seiten ansehen",
        "grant-viewmywatchlist": "Deine Beobachtungsliste ansehen",
+       "grant-viewrestrictedlogs": "Beschränkte Logbucheinträge ansehen",
        "newuserlogpage": "Neuanmeldungs-Logbuch",
        "newuserlogpagetext": "Dies ist ein Logbuch der neu erstellten Benutzerkonten.",
        "rightslog": "Rechte-Logbuch",
        "booksources-search": "Suchen",
        "booksources-text": "Dies ist eine Liste mit Links zu Internetseiten, die neue und gebrauchte Bücher verkaufen. Dort kann es auch weitere Informationen über die Bücher geben. {{SITENAME}} ist mit keinem dieser Anbieter geschäftlich verbunden.",
        "booksources-invalid-isbn": "Vermutlich ist die ISBN ungültig.\nBitte prüfe, ob sie korrekt von der Quelle übertragen wurde.",
+       "magiclink-tracking-rfc": "Seiten, die magische RFC-Links verwenden",
+       "magiclink-tracking-rfc-desc": "Diese Seite verwendet magische RFC-Links. Siehe [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] für die Migration.",
+       "magiclink-tracking-pmid": "Seiten, die magische PMID-Links verwenden",
+       "magiclink-tracking-pmid-desc": "Diese Seite verwendet magische PMID-Links. Siehe [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] für die Migration.",
+       "magiclink-tracking-isbn": "Seiten, die magische ISBN-Links verwenden",
+       "magiclink-tracking-isbn-desc": "Diese Seite verwendet magische ISBN-Links. Siehe [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] für die Migration.",
        "specialloguserlabel": "Ausführender Benutzer:",
        "speciallogtitlelabel": "Ziel (Titel oder {{ns:user}}:Benutzername für einen Benutzer):",
        "log": "Logbücher",
        "activeusers-intro": "Dies ist eine Liste von Benutzern, die innerhalb {{PLURAL:$1|des letzten Tages|der letzten $1 Tage}} Aktivitäten aufwiesen.",
        "activeusers-count": "$1 {{PLURAL:$1|Aktion|Aktionen}} in den {{PLURAL:$3|letzten 24 Stunden|vergangenen $3 Tagen}}",
        "activeusers-from": "Zeige Benutzer ab:",
-       "activeusers-hidebots": "Bots ausblenden",
-       "activeusers-hidesysops": "Administratoren ausblenden",
+       "activeusers-groups": "Benutzer anzeigen, die zu diesen Gruppen gehören:",
        "activeusers-noresult": "Keine Benutzer gefunden.",
        "activeusers-submit": "Aktive Benutzer anzeigen",
        "listgrouprights": "Benutzergruppenrechte",
        "modifiedarticleprotection": "änderte den Schutz von „[[$1]]“",
        "unprotectedarticle": "hob den Schutz von „[[$1]]“ auf",
        "movedarticleprotection": "übertrug den Seitenschutz von „[[$2]]“ auf „[[$1]]“",
+       "protectedarticle-comment": "{{GENDER:$2|Schützte}} „[[$1]]“",
+       "modifiedarticleprotection-comment": "{{GENDER:$2|Änderte}} den Schutzstatus für „[[$1]]“",
+       "unprotectedarticle-comment": "{{GENDER:$2|Entfernte}} den Schutz von „[[$1]]“",
        "protect-title": "Schutz ändern von „$1“",
        "protect-title-notallowed": "Schutz ansehen von „$1“",
        "prot_1movedto2": "hat „[[$1]]“ nach „[[$2]]“ verschoben",
        "patrol-log-header": "Dies ist das Kontroll-Logbuch.",
        "log-show-hide-patrol": "Kontroll-Logbuch $1",
        "log-show-hide-tag": "Markierungs-Logbuch $1",
+       "confirm-markpatrolled-button": "Okay",
+       "confirm-markpatrolled-top": "Version $3 von $2 als kontrolliert markieren?",
        "deletedrevision": "alte Version $1 gelöscht",
        "filedeleteerror-short": "Fehler bei Datei-Löschung: $1",
        "filedeleteerror-long": "Bei der Datei-Löschung wurden Fehler festgestellt:\n\n$1",
        "htmlform-float-invalid": "Der angegebene Wert ist keine Zahl.",
        "htmlform-int-toolow": "Der angegebene Wert ist unter dem Minimum von $1",
        "htmlform-int-toohigh": "Der angegebene Wert ist über dem Maximum von $1",
-       "htmlform-required": "Dieser Wert wird benötigt",
+       "htmlform-required": "Diese Angabe wird benötigt.",
        "htmlform-submit": "Speichern",
        "htmlform-reset": "Änderungen rückgängig machen",
        "htmlform-selectorother-other": "Andere",
        "authmanager-authn-autocreate-failed": "Die automatische Erstellung des lokalen Benutzerkontos ist fehlgeschlagen: $1",
        "authmanager-change-not-supported": "Die angegebenen Anmeldeinformationen konnten nicht geändert werden, da sie von nichts genutzt werden würden.",
        "authmanager-create-disabled": "Die Benutzerkontenerstellung ist deaktiviert.",
-       "authmanager-create-from-login": "Um dein Benutzerkonto zu erstellen, fülle bitte die unten stehenden Felder aus.",
+       "authmanager-create-from-login": "Um dein Benutzerkonto zu erstellen, fülle bitte die Felder aus.",
        "authmanager-create-not-in-progress": "Die Benutzerkontenerstellung ist nicht im Gang oder es sind Sitzungsdaten verloren gegangen. Bitte beginne von vorn.",
        "authmanager-create-no-primary": "Die angegebenen Anmeldeinformationen konnten nicht für die Benutzerkontenerstellung verwendet werden.",
        "authmanager-link-no-primary": "Die angegebenen Anmeldeinformationen konnten nicht für die Benutzerkontenverknüpfung verwendet werden.",
index cd9fd62..82507cb 100644 (file)
        "semiprotectedpagewarning": "'''Diqet: No pel pawyeno, teyna serkari eşkeni bıvurni.'''\nWexta ke şıma no pel vurneni diqet bıkeri, log bivini:",
        "cascadeprotectedwarning": "'''Diqet:''' Na pele kılit biya, tenya karberê idarekeri şenê ke naye bıvurnê, çıke na zerrey {{PLURAL:$1|na pela şipa-kılitkerdiye|nê pelanê şipanê-kılitkerdiyan}} dera:",
        "titleprotectedwarning": "'''Diqet: Na pele kılit biya, [[Special:ListGroupRights|heqê xususiy]] lazımê ke naye vırazê.'''\nLoge peniye cor de este:",
-       "templatesused": "{{PLURAL:$1|Şablon|Şabloni}} ke na pela de xebtênê:",
+       "templatesused": "{{PLURAL:$1|Şablon|Şabloni}} ke ena perrer de karneyayê:",
        "templatesusedpreview": "{{PLURAL:$1|Sablon|Sabloni}}  ke na verqayt de xebetnayê:",
        "templatesusedsection": "{{PLURAL:$1|Template|Templateyan}}  ke na qısım de xebetniyenê:",
        "template-protected": "(kılit biyo)",
        "activeusers-intro": "Ena yew listeya karberê ke $1 {{PLURAL:$1|roc|rocan}} ra tepya iştiraq kerdo ênan mocneno.",
        "activeusers-count": "Peyni  {{PLURAL:$3|roc de|$3 rocan de}} $1  {{PLURAL:$1|hereket kerdo|hereketi kerdê}}",
        "activeusers-from": "Enê karberi ra tepya bımocne:",
-       "activeusers-hidebots": "Botan bınımne",
-       "activeusers-hidesysops": "İdarekaran bınımne",
        "activeusers-noresult": "Karberi nêdiyayê.",
        "activeusers-submit": "Karberanê aktivan bıasene",
        "listgrouprights": "heqê grubê karberi",
        "feedback-subject": "Mewzu:",
        "feedback-submit": "Bırışe",
        "feedback-thanks": "Teşekkur kemê! Vatışê şıma pela da \"[$2 $1]\" esta.",
-       "searchsuggest-search": "Cı geyre",
+       "searchsuggest-search": "{{SITENAME}} de cı geyre",
        "searchsuggest-containing": "estebiyaye...",
        "api-error-badaccess-groups": "Ena wiki de dosya barkerdışi rê mısade nêdeyêno.",
        "api-error-badtoken": "Xetaya zerreki: Antışo xırabın.",
index 3d272a3..a033edd 100644 (file)
        "botpasswords-label-delete": "Delete",
        "botpasswords-label-resetpassword": "Reset the password",
        "botpasswords-label-grants": "Applicable grants:",
-       "botpasswords-help-grants": "Each grant gives access to listed user rights that a user account already has. See the [[Special:ListGrants|table of grants]] for more information.",
+       "botpasswords-help-grants": "Grants allow access to rights already held by your user account. Enabling a grant here does not provide access to any rights that your user account would not otherwise have. See the [[Special:ListGrants|table of grants]] for more information.",
        "botpasswords-label-grants-column": "Granted",
        "botpasswords-bad-appid": "The bot name \"$1\" is not valid.",
        "botpasswords-insert-failed": "Failed to add bot name \"$1\". Was it already added?",
        "grant-basic": "Basic rights",
        "grant-viewdeleted": "View deleted files and pages",
        "grant-viewmywatchlist": "View your watchlist",
+       "grant-viewrestrictedlogs": "View restricted log entries",
        "newuserlogpage": "User creation log",
        "newuserlogpagetext": "This is a log of user creations.",
        "rightslog": "User rights log",
        "booksources-search": "Search",
        "booksources-text": "Below is a list of links to other sites that sell new and used books, and may also have further information about books you are looking for:",
        "booksources-invalid-isbn": "The given ISBN does not appear to be valid; check for errors copying from the original source.",
+       "magiclink-tracking-rfc": "Pages using RFC magic links",
+       "magiclink-tracking-rfc-desc": "This page uses RFC magic links. See [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] on how to migrate.",
+       "magiclink-tracking-pmid": "Pages using PMID magic links",
+       "magiclink-tracking-pmid-desc": "This page uses PMID magic links. See [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] on how to migrate.",
+       "magiclink-tracking-isbn": "Pages using ISBN magic links",
+       "magiclink-tracking-isbn-desc": "This page uses ISBN magic links. See [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] on how to migrate.",
        "rfcurl": "//tools.ietf.org/html/rfc$1",
        "pubmedurl": "//www.ncbi.nlm.nih.gov/pubmed/$1?dopt=Abstract",
        "specialloguserlabel": "Performer:",
        "activeusers-intro": "This is a list of users who had some kind of activity within the last $1 {{PLURAL:$1|day|days}}.",
        "activeusers-count": "$1 {{PLURAL:$1|action|actions}} in the last {{PLURAL:$3|day|$3 days}}",
        "activeusers-from": "Display users starting at:",
-       "activeusers-hidebots": "Hide bots",
-       "activeusers-hidesysops": "Hide administrators",
+       "activeusers-groups": "Display users belonging to groups:",
        "activeusers-noresult": "No users found.",
        "activeusers-submit": "Display active users",
        "listgrouprights": "User group rights",
        "modifiedarticleprotection": "changed protection level for \"[[$1]]\"",
        "unprotectedarticle": "removed protection from \"[[$1]]\"",
        "movedarticleprotection": "moved protection settings from \"[[$2]]\" to \"[[$1]]\"",
+       "protectedarticle-comment": "{{GENDER:$2|Protected}} \"[[$1]]\"",
+       "modifiedarticleprotection-comment": "{{GENDER:$2|Changed protection level}} for \"[[$1]]\"",
+       "unprotectedarticle-comment": "{{GENDER:$2|Removed protection}} from \"[[$1]]\"",
        "protect-title": "Change protection level for \"$1\"",
        "protect-title-notallowed": "View protection level of \"$1\"",
        "prot_1movedto2": "[[$1]] moved to [[$2]]",
        "patrol-log-header": "This is a log of patrolled revisions.",
        "log-show-hide-patrol": "$1 patrol log",
        "log-show-hide-tag": "$1 tag log",
+       "confirm-markpatrolled-button": "OK",
+       "confirm-markpatrolled-top": "Mark revision $3 of $2 as patrolled?",
        "deletedrevision": "Deleted old revision $1",
        "filedeleteerror-short": "Error deleting file: $1",
        "filedeleteerror-long": "Errors were encountered while deleting the file:\n\n$1",
        "tags-deactivate": "deactivate",
        "tags-hitcount": "$1 {{PLURAL:$1|change|changes}}",
        "tags-manage-no-permission": "You do not have permission to manage change tags.",
-       "tags-manage-blocked": "You cannot manage change tags while blocked.",
+       "tags-manage-blocked": "You cannot manage change tags while you are blocked.",
        "tags-create-heading": "Create a new tag",
        "tags-create-explanation": "By default, newly created tags will be made available for use by users and bots.",
        "tags-create-tag-name": "Tag name:",
        "tags-deactivate-not-allowed": "It is not possible to deactivate the tag \"$1\".",
        "tags-deactivate-submit": "Deactivate",
        "tags-apply-no-permission": "You do not have permission to apply change tags along with your changes.",
-       "tags-apply-blocked": "You cannot apply change tags along with your changes while blocked.",
+       "tags-apply-blocked": "You cannot apply change tags along with your changes while you are blocked.",
        "tags-apply-not-allowed-one": "The tag \"$1\" is not allowed to be manually applied.",
        "tags-apply-not-allowed-multi": "The following {{PLURAL:$2|tag is|tags are}} not allowed to be manually applied: $1",
        "tags-update-no-permission": "You do not have permission to add or remove change tags from individual revisions or log entries.",
-       "tags-update-blocked": "You cannot add or remove change tags while blocked.",
+       "tags-update-blocked": "You cannot add or remove change tags while you are blocked.",
        "tags-update-add-not-allowed-one": "The tag \"$1\" is not allowed to be manually added.",
        "tags-update-add-not-allowed-multi": "The following {{PLURAL:$2|tag is|tags are}} not allowed to be manually added: $1",
        "tags-update-remove-not-allowed-one": "The tag \"$1\" is not allowed to be removed.",
        "authmanager-authn-autocreate-failed": "Auto-creation of a local account failed: $1",
        "authmanager-change-not-supported": "The supplied credentials cannot be changed, as nothing would use them.",
        "authmanager-create-disabled": "Account creation is disabled.",
-       "authmanager-create-from-login": "To create your account, please fill in the fields below.",
+       "authmanager-create-from-login": "To create your account, please fill in the fields.",
        "authmanager-create-not-in-progress": "Account creation is not in progress or session data has been lost. Please start again from the beginning.",
        "authmanager-create-no-primary": "The supplied credentials could not be used for account creation.",
        "authmanager-link-no-primary": "The supplied credentials could not be used for account linking.",
index ac7e828..b4df263 100644 (file)
        "botpasswords-updated-body": "La robota pasvorto por robota nomo \"$1\" de la uzanto \"$2\" estis ĝisdatigita.",
        "botpasswords-deleted-title": "Robota pasvorto forigita",
        "botpasswords-deleted-body": "La robota pasvorto por robota nomo \"$1\" de la uzanto \"$2\" estis forigita.",
-       "botpasswords-newpassword": "La nova pasvorto por ensaluti per <strong>$1</strong> estas <strong>$2</strong>. <em>Bonvolu noti ĝin por estonta konsultado.",
+       "botpasswords-newpassword": "La nova pasvorto por ensaluti per <strong>$1</strong> estas <strong>$2</strong>. <em>Bonvolu noti ĝin por estonta konsultado.</em> <br> (Por malnovaj robotoj, kiuj postulas, ke la ensaluta nomo estu sama kiel la eventuala uzantonomo, vi povas uzi <strong>$3</strong> kiel uzantonomon kaj <strong>$4</strong> kiel pasvorton.)",
        "botpasswords-no-provider": "Robotopasvortensalutoprovizilo (''BotPasswordsSessionProvider'') maldisponeblas.",
        "botpasswords-restriction-failed": "Limigoj pri robota pasvorto malebligas tiun ensalutadon.",
        "botpasswords-invalid-name": "La difinita uzantnomo malenhavas la robotopasvortan disigilon (\"$1\").",
        "passwordreset-emailelement": "Salutnomo: \n$1\n\nProvizora pasvorto: \n$2",
        "passwordreset-emailsentemail": "Se tiu ĉu retpoŝta adreso estas kunligita kun via konto, tiam al ĉi tiu adreso estos sendita retpoŝto por renovigi pasvorton.",
        "passwordreset-emailsentusername": "Se estas retpoŝta adreso, kiu estas asociita kun tiu uzantnomo, tiam ni sendos retpoŝtan mesaĝon pri reagordado de la pasvorto.",
-       "passwordreset-emailsent-capture2": "La {{PLURAL:$1|retpoŝto|retpoŝtojn}} de pasvorta reensignado estis sendita. La {{PLURAL:$1|salutnomo kaj pasvorto|listo de salutnomoj kaj pasvortoj}} estas vidigita sube.",
-       "passwordreset-emailerror-capture2": "Retpoŝtado al la {{GENDER:$2|uzanto}} malsukcesis: $1 La {{PLURAL:$3|uzantnomo kaj pasvorto|listo de uzantnomoj kaj pasvortoj}} estas vidigita malsupre.",
+       "passwordreset-emailsent-capture2": "La {{PLURAL:$1|retpoŝto|retpoŝtoj}} por pasvorta restarigo estis {{PLURAL:$1|sendita|senditaj}}. La {{PLURAL:$1|salutnomo kaj pasvorto|listo de salutnomoj kaj pasvortoj}} estas montrita ĉi tie.",
+       "passwordreset-emailerror-capture2": "Retpoŝtado al la {{GENDER:$2|uzanto}} malsukcesis: $1 La {{PLURAL:$3|uzantonomo kaj pasvorto|listo de uzantonomoj kaj pasvortoj}} estas montrita ĉi tie.",
        "passwordreset-nocaller": "Vokanto devas esti provizita",
        "passwordreset-nosuchcaller": "Vokanto ne ekzistas: $1",
        "passwordreset-ignored": "La pasvorta reensignado ne estis pritraktita. Eble neniu provizanto estis formita?",
        "invalid-content-data": "Enhavo estas malvalida",
        "content-not-allowed-here": "Enhavo de $1 ne estas permesita en paĝo [[$2]]",
        "editwarning-warning": "Forlaso de ĉi tiu paĝo kaŭzos al vi perdi iun ajn ŝanĝojn kiujn vi faris.\nSe vi estas ensalutinta, vi povas malŝalti ĉi tiun averton en la sekcio \"{{int:prefs-editing}}\" de viaj preferoj.",
+       "editpage-invalidcontentmodel-title": "Enhava modelo ne subtenata",
+       "editpage-invalidcontentmodel-text": "La enhava modelo \"$1\" ne estas subtenata.",
        "editpage-notsupportedcontentformat-title": "Nesubtenata enhavoformo",
        "editpage-notsupportedcontentformat-text": "La enhava aranĝo $1 ne estas subtenata de la enhava modelo $2.",
        "content-model-wikitext": "vikiteksto",
        "grant-basic": "Bazaj rajtoj",
        "grant-viewdeleted": "Vidi forigitajn dosierojn kaj paĝojn",
        "grant-viewmywatchlist": "Rigardi vian atentaron",
+       "grant-viewrestrictedlogs": "Rigardi protokolerojn kun limigita aliro",
        "newuserlogpage": "Protokolo de uzanto-kreado",
        "newuserlogpagetext": "Jen protokolo de lastaj kreadoj de uzantoj.",
        "rightslog": "Protokolo de uzanto-rajtoj",
        "zip-wrong-format": "La specifigita dosiero ne estis ZIP-dosiero",
        "zip-bad": "La dosiero estas fuŝa aŭ alimaniere estas nelegebla ZIP-dosiero.\nĜi ne povas esti ĝuste kontrolita por sekureco.",
        "zip-unsupported": "Ĉi tiu dosiero estas ZIP-dosiero kiu uzas ZIP-funkciojn malsubtenita de MediaWiki.\nĜi ne povas esti ĝuste kontrolita por sekureco.",
-       "uploadstash": "Konservejo de alŝutoj",
+       "uploadstash": "Kaŝkonservejo de alŝutoj",
        "uploadstash-summary": "Tiu ĉi paĝo alirebligas la dosierojn alŝutitajn (aŭ alŝutatajn), kiuj ne jam estas publikigitaj per la vikio. Tiujn ĉi dosierojn ne povas vidi  iu ajn, krom la alŝutinto mem.",
        "uploadstash-clear": "Malplenigi la dosierkonversejon.",
        "uploadstash-nofiles": "Mankas dosieroj en la konservejo.",
        "uploadstash-errclear": "Malsukcesis la forigo de la dosieroj.",
        "uploadstash-refresh": "Aktualigi la dosierliston.",
        "uploadstash-thumbnail": "Vidi bildeton",
+       "uploadstash-exception": "Ne eblas alŝuti en kaŝkonservejon ($1): \"$2\".",
        "invalid-chunk-offset": "Malvalida deŝovo de dosierpeco",
        "img-auth-accessdenied": "Atingo malpermisita",
        "img-auth-nopathinfo": "Mankas PATH_INFO (informo pri dosiervojo).\nVia servilo ne estas konfigurita por sendi ĉi tiun informon.\nEble ĝi estas CGI-bazita kaj ne subtenas img_auth.\nVidu https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization (angle).",
        "filerevert-submit": "Restarigi",
        "filerevert-success": "'''[[Media:$1|$1]]''' estis restarigita al [$4 versio ekde $3, $2].",
        "filerevert-badversion": "Ne estas antaŭa loka versio de ĉi tiu dosiero ĉe tiu tempo.",
+       "filerevert-identical": "La nuntempa versio de la dosiero jam samas al la elektita.",
        "filedelete": "Forigi $1",
        "filedelete-legend": "Forigi dosieron.",
        "filedelete-intro": "Vi preskaŭ forigos dosieron '''[[Media:$1|$1]]''' kune kun ĉiom da ĝia historio.",
        "apisandbox-results-fixtoken-fail": "Malsukcese venigis ĵetonon je \"$1\".",
        "apisandbox-alert-page": "Kampoj de ĉi tiu paĝo ne estas validaj.",
        "apisandbox-alert-field": "La valoro de ĉi tiu kampo ne estas valida.",
+       "apisandbox-continue": "Daŭrigi",
+       "apisandbox-continue-clear": "Vakigi",
+       "apisandbox-continue-help": "{{int:apisandbox-continue}} [https://www.mediawiki.org/wiki/API:Query#Continuing_queries daŭrigos] la lastan peton; {{int:apisandbox-continue-clear}} forviŝos parametrojn rilatajn al daŭrigo.",
        "booksources": "Librofontoj",
        "booksources-search-legend": "Serĉi librofontojn",
        "booksources-search": "Serĉi",
        "activeusers-intro": "Jen listo de uzantoj kiu faris iom da agoj dum la lastaj $1 {{PLURAL:$1|tago|tagoj}}.",
        "activeusers-count": "$1 {{PLURAL:$1|ago|agoj}} dum la {{PLURAL:$3|lasta tago|lastaj $3 tagoj}}",
        "activeusers-from": "Montri uzantojn ekde:",
-       "activeusers-hidebots": "kaŝi robotojn",
-       "activeusers-hidesysops": "Kaŝi administrantojn",
+       "activeusers-groups": "Montri uzantojn apartenantajn al grupoj:",
        "activeusers-noresult": "Neniuj uzantoj trovitaj.",
        "activeusers-submit": "Montri la agemajn uzantojn",
        "listgrouprights": "Gruprajtoj de uzantoj",
        "movelogpagetext": "Jen listo de movitaj paĝoj",
        "movesubpage": "{{PLURAL:$1|Subpaĝo|Subpaĝoj}}",
        "movesubpagetext": "Ĉi tiu paĝo havas $1 {{PLURAL:$1|subpaĝon montritan|subpaĝojn montritajn}} sube.",
+       "movesubpagetalktext": "La koncerna diskutpaĝo havas $1 {{PLURAL:$1|subpaĝon montritan|subpaĝojn montritajn}} sube.",
        "movenosubpage": "Ĉi tiu paĝo havas neniujn subpaĝojn.",
        "movereason": "Kialo:",
        "revertmove": "restarigi",
        "pageinfo-category-pages": "Nombro de paĝoj",
        "pageinfo-category-subcats": "Nombro de subkategorioj",
        "pageinfo-category-files": "Nombro de dosieroj",
+       "pageinfo-user-id": "Identigilo de uzanto",
        "markaspatrolleddiff": "Marki kiel patrolitan",
        "markaspatrolledtext": "Marki ĉi tiun paĝon patrolita",
        "markaspatrolledtext-file": "Marki ĉi tiu versio de dosiero kiel patrolita",
        "newimages-showbots": "Montri alŝutojn per robotoj",
        "newimages-hidepatrolled": "Malvidigi la patrolitajn alŝutitojn",
        "noimages": "Nenio videbla.",
+       "gallery-slideshow-toggle": "Baskuligi miniaturojn",
        "ilsubmit": "Serĉi",
        "bydate": "laŭ dato",
        "sp-newimages-showfrom": "Montru novajn dosierojn komencante de $2, $1",
        "tag-filter": "[[Special:Tags|Etikeda]] filtrilo:",
        "tag-filter-submit": "Filtrilo",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Etikedo|Etikedoj}}]]: $2)",
+       "tag-mw-contentmodelchange": "ŝanĝo de enhavomodelo",
+       "tag-mw-contentmodelchange-description": "Redaktoj kiuj [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:ChangeContentModel ŝanĝas la enhavmodelon] de paĝo",
        "tags-title": "Etikedoj",
        "tags-intro": "Ĉi tiu paĝo montras la etikedojn kun kiuj la programaro markus redakton, kaj iliaj signifoj.",
        "tags-tag": "Etikeda nomo",
        "htmlform-date-placeholder": "JJJJ-MM-TT",
        "htmlform-time-placeholder": "HH:MM:SS",
        "htmlform-datetime-placeholder": "JJJJ-MM-TT HH:MM:SS",
+       "htmlform-date-invalid": "La valoro, kiun vi indikis, ne estas rekonita kiel dato. Provu uzi la formon JJJJ-MM-TT.",
+       "htmlform-time-invalid": "La valoro, kiun vi indikis, ne estas rekonita kiel tempo. Provu uzi la formon HH:MM:SS.",
+       "htmlform-datetime-invalid": "La valoro, kiun vi indikis, ne estas rekonita kiel dato kaj tempo. Provu uzi la formon JJJJ-MM-TT HH:MM:SS.",
+       "htmlform-date-toolow": "La valoro, kiun vi indikis estas antaŭ la plej frua permesita dato $1.",
+       "htmlform-date-toohigh": "La valoro, kiun vi indikis estas post la plej malfrua permesita dato $1.",
+       "htmlform-time-toolow": "La valoro, kiun vi indikis estas antaŭ la plej frua permesita tempo $1.",
+       "htmlform-time-toohigh": "La valoro, kiun vi indikis estas post la plej malfrua permesita tempo $1.",
+       "htmlform-datetime-toolow": "La valoro, kiun vi indikis estas antaŭ la plej frua permesita dato kaj tempo $1.",
+       "htmlform-datetime-toohigh": "La valoro, kiun vi indikis estas post la plej malfrua permesita dato kaj tempo $1.",
        "htmlform-title-badnamespace": "[[:$1]] ne  estas en \"{{ns:$2}}\" nomspaco.",
        "htmlform-title-not-creatable": "\"$1\" estas nekreebla titolo por paĝo",
        "htmlform-title-not-exists": "$1 ne ekzistas.",
        "feedback-thanks": "Dankon! Via opinio-esprimo estis afiŝita al la paĝo \"[$2 $1]\".",
        "feedback-thanks-title": "Dankon!",
        "feedback-useragent": "Klienta aplikaĵo:",
-       "searchsuggest-search": "Serĉi",
+       "searchsuggest-search": "Serĉi tra {{SITENAME}}",
        "searchsuggest-containing": "enhavas...",
        "api-error-autoblocked": "Via IPa adreso estis blokita aŭtomate, ĉar ĝi estis uzita far forbara uzanto.",
        "api-error-badaccess-groups": "Vi ne havas permeson alŝuti dosierojn al tiu ĉi vikio.",
        "unlinkaccounts-success": "La konto estis malligita.",
        "authenticationdatachange-ignored": "La ŝanĝo de dateno pri aŭtentikigado ne estis traktita. Eble neniu provizanto estis agorda?",
        "userjsispublic": "Bonvolu noti: subpaĝoj en JavaScript ne enhavu konfidenciajn datumojn ĉar ili estas videblaj por aliaj uzantoj.",
-       "usercssispublic": "Bonvolu noti: subpaĝoj en CSS ne enhavu konfidenciajn datumojn ĉar ili estas videblaj por aliaj uzantoj."
+       "usercssispublic": "Bonvolu noti: subpaĝoj en CSS ne enhavu konfidenciajn datumojn ĉar ili estas videblaj por aliaj uzantoj.",
+       "restrictionsfield-badip": "Malvalida IP-adreso de la intervalo: $1",
+       "restrictionsfield-label": "Permesita IP-intervalo:",
+       "restrictionsfield-help": "Unu IP-adreso aŭ CIDR-intervalo per linio. Por permesigi ĉion, uzu<br><code>0.0.0.0/0</code><br><code>::/0</code>",
+       "edit-error-short": "Eraro: $1",
+       "edit-error-long": "Eraroj\n\n$1"
 }
index 7393b67..6dd1515 100644 (file)
        "grant-basic": "Permisos básicos",
        "grant-viewdeleted": "Ver archivos y páginas eliminados",
        "grant-viewmywatchlist": "Ver tu lista de seguimiento",
+       "grant-viewrestrictedlogs": "Ver entradas restringidas del registro",
        "newuserlogpage": "Registro de creación de usuarios",
        "newuserlogpagetext": "Este es un registro de creación de usuarios.",
        "rightslog": "Registro de permisos de usuario",
        "file-thumbnail-no": "El nombre del archivo comienza con <strong>$1</strong>.\nParece ser una imagen de tamaño reducido ''(thumbnail)''.\nSi tiene esta imagen a toda resolución súbala, si no, por favor cambie el nombre del archivo.",
        "fileexists-forbidden": "Ya existe un archivo con este nombre, y no puede ser grabado encima de otro. Si quiere subir su archivo de todos modos, por favor vuelva atrás y utilice otro nombre. [[File:$1|thumb|center|$1]]",
        "fileexists-shared-forbidden": "Ya existe un archivo con este nombre en el repositorio compartido.\nSi todavía quiere subir su archivo, por favor, regrese a la página anterior y use otro nombre. [[File:$1|thumb|center|$1]]",
+       "fileexists-no-change": "Este es un duplicado exacto de la versión actual de <strong>[[:$1]]</strong>.",
+       "fileexists-duplicate-version": "Este es un duplicado exacto de {{PLURAL:$2|una versión anterior|versiones anteriores}} de <strong>[[:$1]]</strong>.",
        "file-exists-duplicate": "Este archivo es un duplicado {{PLURAL:$1|del siguiente|de los siguientes}}:",
        "file-deleted-duplicate": "Un archivo idéntico a este ([[:$1]]) ha sido borrado con anterioridad. Debes comprobar el historial de borrado del archivo ante de volver a subirlo.",
        "file-deleted-duplicate-notitle": "Un archivo idéntico a este ha sido borrado con anterioridad, y el título ha sido suprimido. Deberías contactar con alguien capaz de ver los datos de archivos borrados para que revise esta situación antes de proceder a subir de nuevo este archivo.",
        "activeusers-intro": "Esta es una lista de usuarios que han tenido alguna actividad en los últimos $1 {{PLURAL:$1|día|días}}.",
        "activeusers-count": "$1 {{PLURAL:$1|acción|acciones}} en {{PLURAL:$3|el último día|los últimos $3 días}}",
        "activeusers-from": "Mostrando a los usuarios empezando por:",
-       "activeusers-hidebots": "Ocultar robots",
-       "activeusers-hidesysops": "Ocultar administradores",
+       "activeusers-groups": "Mostrar los usuarios que pertenecen a los grupos:",
        "activeusers-noresult": "No se encontraron usuarios.",
        "activeusers-submit": "Mostrar usuarios activos",
        "listgrouprights": "Permisos de los grupos de usuarios",
index eaa4754..ec27ab5 100644 (file)
        "resetpass_submit": "Sisesta parool ja logi sisse",
        "changepassword-success": "Sinu parool on muudetud!",
        "changepassword-throttled": "Oled hiljuti proovinud liiga palju kordi sisse logida.\nPalun oota $1, enne kui uuesti proovid.",
+       "botpasswords": "Robotiparoolid",
+       "botpasswords-summary": "<em>Robotiparoolid</em> võimaldavad API-põhist juurdepääsu kasutajakontole, ilma kasutamata konto peamisi autentimisandmeid. Kui konto on sisse logitud robotiparooliga, võivad saadaolevad kasutajaõigused olla piiratud.\n\nKui sa ei tea, miks sul on vaja robotiparooli, siis on parem seda mitte kasutada. Mitte keegi ei peaks paluma sul robotiparooli genereerida ja seda talle edasi anda.",
+       "botpasswords-createnew": "Uue robotiparooli loomine",
+       "botpasswords-label-appid": "Roboti nimi:",
+       "botpasswords-label-create": "Loo",
        "resetpass_forbidden": "Paroole ei saa muuta",
        "resetpass-no-info": "Pead olema sisselogitud, et sellele lehele pääseda.",
        "resetpass-submit-loggedin": "Muuda parool",
        "activeusers-intro": "See on loetelu kasutajatest, kes on viimase $1 {{PLURAL:$1|päev|päeva}} jooksul midagi teinud.",
        "activeusers-count": "$1 {{PLURAL:$1|toiming|toimingut}} viimase {{PLURAL:$3|päeva|$3 päeva}} jooksul",
        "activeusers-from": "Näita kasutajaid alates:",
-       "activeusers-hidebots": "Peida robotid",
-       "activeusers-hidesysops": "Peida administraatorid",
        "activeusers-noresult": "Kasutajaid ei leidunud.",
        "activeusers-submit": "Kuva aktiivsed kasutajad",
        "listgrouprights": "Kasutajarühma õigused",
        "mediastatistics-header-text": "Tekstifailid",
        "mediastatistics-header-executable": "Täitmisfailid",
        "mediastatistics-header-archive": "Tihendatud vormingud",
+       "mediastatistics-header-total": "Kõik failid",
        "json-warn-trailing-comma": "$1 lõpukoma eemaldati JSON-ist.",
        "json-error-unknown": "JSON-iga oli probleem. Tõrge: $1",
        "json-error-depth": "Suurim võimalik pinusügavus on ületatud.",
        "mw-widgets-titleinput-description-new-page": "lehekülge pole veel",
        "mw-widgets-titleinput-description-redirect": "ümbersuunamine leheküljele \"$1\"",
        "randomrootpage": "Juhuslik juurlehekülg",
+       "log-action-filter-block": "Blokeeringu tüüp:",
+       "log-action-filter-all": "Kõik",
+       "log-action-filter-block-block": "Blokeerimine",
+       "log-action-filter-block-reblock": "Blokeeringu muutmine",
+       "log-action-filter-block-unblock": "Blokeeringu tühistamine",
        "authmanager-provider-password": "Paroolipõhine autentimine",
        "authmanager-provider-password-domain": "Parooli- ja domeenipõhine autentimine",
        "authmanager-provider-temporarypassword": "Ajutine parool",
index 302bc58..38189f2 100644 (file)
        "nstab-main": "Artículu",
        "nstab-user": "Páhina d'usuáriu",
        "nstab-media": "Páhina \"Meya\"",
-       "nstab-special": "Artículu especial",
+       "nstab-special": "Páhina especial",
        "nstab-project": "Página el proyeutu",
        "nstab-image": "Archivu",
        "nstab-mediawiki": "Mensahi",
        "undo-norev": "La eición nu pué sel eshecha ebiu a que nu dessisti, u hue esborrá",
        "undo-summary": "Eshazel revisión $1 de [[Special:Contributions/$2|$2]] ([[User talk:$2|Caraba]])",
        "cantcreateaccount-text": "La criación de cuentas pol parti e la IP ('''$1''') á siu pará pol el usuáriu [[User:$3|$3]].\n\nLa razón dá pol $3 es ''$2''",
-       "viewpagelogs": "Vel los rustrihus d´esta páhina",
+       "viewpagelogs": "Vel los rustrihus desta páhina",
        "nohistory": "Nu ai dengún estorial d´eicionis pa esta páhina.",
        "currentrev": "Revisión atual",
        "currentrev-asof": "Úrtima revisión: $1",
        "history-feed-title": "Estorial de revisionis",
        "history-feed-description": "Estorial de revisionis pa esta páhina nel güiqui",
        "history-feed-item-nocomment": "$1 en $2",
-       "history-feed-empty": "Esa páhina nu desisti.\nEs posibri qu´aiga siu esborrá e la güiqui, u que s´aiga chambau el su nombri.\nPreba [[Special:Search|landeandu]] entri las nuevas páhinas de la güiqui.",
+       "history-feed-empty": "Esa páhina nu desisti.\nEs posibri qu’aiga siu esborrá e la güiqui, u que s’aiga chambau el su nombri.\nPreba [[Special:Search|landeandu]] entri las nuevas páhinas de la güiqui.",
        "rev-deleted-comment": "(comentáriu esborrau)",
        "rev-deleted-user": "(nombri d´usuáriu esborrau)",
        "rev-deleted-event": "(entrá esborrá)",
        "enhancedrc-history": "Estorial",
        "recentchanges": "Úrtimus chambus",
        "recentchanges-legend": "Ocionis enos úrtimus chambus",
-       "recentchanges-summary": "Sigui los úrtimus chambus d´esti güiqui nesta páhina.",
+       "recentchanges-summary": "Sigui los úrtimus chambus desti güiqui nesta páhina.",
        "recentchanges-feed-description": "Sigui los úrtimus chambus nel güiqui nesti feed.",
        "rcnotefrom": "Embahu se muestran los chambus hechus dendi el '''$2''' (hata el '''$1''').",
        "rclistfrom": "Muestral los chambus hechus dendi el $3 $2",
        "filehist-comment": "Comentáriu",
        "imagelinks": "Atihus",
        "linkstoimage": "{{PLURAL:$1|El siguienti artículu atiha|Los siguientis $1 artículus atihan}} a esti archivu:",
-       "nolinkstoimage": "Nu ai denguna páhina qu´atihi a esti archivu.",
+       "nolinkstoimage": "Nu ai denguna páhina quatihi a esti archivu.",
        "morelinkstoimage": "Guipal [[Special:WhatLinksHere/$1|mas atijus]] a esti archivu.",
        "sharedupload": "Esti archivu procei de $1 i puei gastalsi dendi otrus proyeutus.",
        "uploadnewversion-linktext": "Empuntal una nueva velsión d´esti archivu",
        "tooltip-t-print": "Velsión pa imprental desta páhina",
        "tooltip-t-permalink": "Atihu remanenti a esta velsión de la páhina",
        "tooltip-ca-nstab-main": "Vel el artículu",
-       "tooltip-ca-nstab-user": "Vel la páhina d´usuáriu",
+       "tooltip-ca-nstab-user": "Vel la páhina dusuáriu",
        "tooltip-ca-nstab-media": "Vel la páhina e \"meya\"",
        "tooltip-ca-nstab-special": "Esta es una páhina especial, razón pola que nu pueis eitala",
        "tooltip-ca-nstab-project": "Vel la páhina el proyeutu",
        "tooltip-ca-nstab-image": "Vel la páhina el archivu",
        "tooltip-ca-nstab-mediawiki": "Vel el mensahi el sistema",
        "tooltip-ca-nstab-template": "Vel la prantilla",
-       "tooltip-ca-nstab-help": "Vel la páhina d´ayua",
+       "tooltip-ca-nstab-help": "Vel la páhina dayua",
        "tooltip-ca-nstab-category": "Vel la categoria",
        "tooltip-minoredit": "Aseñalal cumu eición chiquenina",
        "tooltip-save": "Emburacal los tus chambus",
index 199d7a6..76610b4 100644 (file)
@@ -52,7 +52,8 @@
                        "01miki10",
                        "Matma Rex",
                        "BiscuitMan",
-                       "Alluk."
+                       "Alluk.",
+                       "Tumm1"
                ]
        },
        "tog-underline": "Linkkien alleviivaus:",
@@ -60,7 +61,7 @@
        "tog-hidepatrolled": "Piilota tarkastetut muutokset tuoreet muutokset -listasta",
        "tog-newpageshidepatrolled": "Piilota tarkastetut sivut uusien sivujen listalta",
        "tog-hidecategorization": "Piilota sivujen luokittelu",
-       "tog-extendwatchlist": "Laajenna tarkkailulista näyttämään kaikki tehdyt muutokset eikä vain viimeisimmät",
+       "tog-extendwatchlist": "Laajenna tarkkailulista näyttämään kaikki tehdyt muutokset, eikä vain viimeisimmät",
        "tog-usenewrc": "Ryhmittele muutokset sivun mukaan tuoreiden muutosten listalla ja tarkkailulistalla",
        "tog-numberheadings": "Numeroi otsikot automaattisesti",
        "tog-showtoolbar": "Näytä työkalupalkki",
        "right-changetags": "Lisätä ja poistaa satunnaisia [[Special:Tags|merkkauksia]] yksittäisissä sivuversioissa tai lokimerkinnöissä",
        "right-deletechangetags": "Poistaa [[Special:Tags|merkkauksia]] tietokannasta",
        "grant-generic": "\"$1\" oikeuksien joukko",
-       "grant-group-page-interaction": "Ole vuorovaikutuksessa sivujen kanssa",
-       "grant-group-file-interaction": "Ole vuorovaikutuksessa mediatiedostojen kanssa",
-       "grant-group-watchlist-interaction": "Ole vuorovaikutuksessa oman tarkkailulistasi kanssa",
+       "grant-group-page-interaction": "Käsitellä sivuja",
+       "grant-group-file-interaction": "Käsitellä mediatiedostoja",
+       "grant-group-watchlist-interaction": "Käsitellä tarkkailulistaasi",
        "grant-group-email": "Lähettää sähköpostia",
        "grant-group-high-volume": "Suorittaa suuri määrä toimintoja",
        "grant-group-customization": "Mukauttaminen ja asetukset",
        "grant-editinterface": "Muokata järjestelmäviesti-nimiavaruutta ja käyttäjien CSS/JavaScript-sivuja",
        "grant-editmycssjs": "Muokata käyttäjän omia CSS/JavaScript-sivuja",
        "grant-editmyoptions": "Muokata käyttäjän omia asetuksia",
-       "grant-editmywatchlist": "Muokata omaa tarkkailulistaa",
+       "grant-editmywatchlist": "Muokata tarkkailulistaasi",
        "grant-editpage": "Muokata olemassa olevia sivuja",
        "grant-editprotected": "Muokata suojattuja sivuja",
        "grant-highvolume": "Suorittaa paljon muokkauksia",
        "grant-oversight": "Piilottaa käyttäjiä ja häivyttää yksittäisiä versioita",
        "grant-patrol": "Partioida sivuihin tehtyjä muutoksia",
        "grant-protect": "Suojata sivuja tai poistaa suojauksia",
-       "grant-rollback": "Peräyttää sivuun tehdyt muutokset",
+       "grant-rollback": "Palauttaa sivuun tehtyjä muutoksia",
        "grant-sendemail": "Lähettää sähköpostia toisille käyttäjille",
        "grant-uploadeditmovefile": "Tallentaa, korvata ja siirtää tiedostoja",
        "grant-uploadfile": "Tallentaa uusia tiedostoja",
        "activeusers-intro": "Tämä on luettelo käyttäjistä, jotka ovat tehneet jotain viimeisen $1 {{PLURAL:$1|päivän}} sisällä.",
        "activeusers-count": "$1 {{PLURAL:$1|toiminto|toimintoa}} viimeisen {{PLURAL:$3|päivän|$3 päivän}} aikana",
        "activeusers-from": "Näytä käyttäjät alkaen",
-       "activeusers-hidebots": "Piilota botit",
-       "activeusers-hidesysops": "Piilota ylläpitäjät",
        "activeusers-noresult": "Käyttäjiä ei löytynyt.",
        "activeusers-submit": "Hae aktiiviset käyttäjät",
        "listgrouprights": "Käyttäjäryhmien oikeudet",
        "feedback-thanks": "Kiitos. Palautteesi on jätetty sivulle [$2 $1].",
        "feedback-thanks-title": "Kiitos!",
        "feedback-useragent": "User agent:",
-       "searchsuggest-search": "Hae",
+       "searchsuggest-search": "Hae {{GRAMMAR:elative|{{SITENAME}}}}",
        "searchsuggest-containing": "sisältää...",
        "api-error-autoblocked": "Sinun IP-osoitteesi on estetty automaattisesti, koska sitä on käyttänyt estetty käyttäjätunnus.",
        "api-error-badaccess-groups": "Sinulla ei ole oikeutta tallentaa tiedostoja tähän wikiin.",
index 42002f5..2387cb4 100644 (file)
        "loginerror": "Erreur de connexion",
        "createacct-error": "Erreur lors de la création du compte",
        "createaccounterror": "Impossible de créer le compte : $1",
-       "nocookiesnew": "Le compte utilisateur a été créé, mais vous n’êtes pas connecté{{GENDER:||e|(e)}}.\n{{SITENAME}} utilise des cookies pour conserver la connexion mais vous les avez désactivés.\nVeuillez les activer et vous reconnecter avec le même nom et le même mot de passe.",
-       "nocookieslogin": "{{SITENAME}} utilise des cookies pour conserver la connexion mais vous les avez désactivés.\nVeuillez les activer et vous reconnecter.",
-       "nocookiesfornew": "Le compte utilisateur n’a pas été créé, car nous n’avons pas pu identifier son origine.\nVérifiez que vous avez activé les cookies, rechargez la page et essayez à nouveau.",
+       "nocookiesnew": "Le compte utilisateur a été créé, mais vous n’êtes pas connecté{{GENDER:||e|(e)}}.\n{{SITENAME}} utilise des témoins (''cookies'') pour conserver la connexion mais vous les avez désactivés.\nVeuillez les activer et vous reconnecter avec le même nom et le même mot de passe.",
+       "nocookieslogin": "{{SITENAME}} utilise des témoins (''cookies'') pour conserver la connexion mais vous les avez désactivés.\nVeuillez les activer et vous reconnecter.",
+       "nocookiesfornew": "Le compte utilisateur n’a pas été créé, car nous n’avons pas pu identifier son origine.\nVérifiez que vous avez activé les témoins (''cookies''), rechargez la page et essayez à nouveau.",
        "createacct-loginerror": "Le compte a bien été créé mais vous ne pouvez pas vous connecter automatiquement. Veuillez vous [[Special:UserLogin|connecter manuellement]].",
        "noname": "Vous n’avez pas saisi un nom d’utilisateur valide.",
        "loginsuccesstitle": "Connecté",
        "botpasswords-label-delete": "Supprimer",
        "botpasswords-label-resetpassword": "Réinitialiser le mot de passe",
        "botpasswords-label-grants": "Droits applicables :",
-       "botpasswords-help-grants": "Chaque droit accordé donne accès à la liste des droits utilisateurs dont l’utilisateur dispose déjà. Voyez le [[Special:ListGrants|tableau des droits]] pour plus d’informations.",
+       "botpasswords-help-grants": "Les autorisations permettent d’accéder aux droits déjà accordés à votre compte utilisateur. Activer une autorisation ici ne fournit l’accès à aucun droit que votre compte utilisateur n’aurait pas par ailleurs. Voyez le [[Special:ListGrants|tableau des autorisations]] pour plus d’information.",
        "botpasswords-label-grants-column": "Accordé",
        "botpasswords-bad-appid": "Le nom de robot « $1 » n’est pas valide.",
        "botpasswords-insert-failed": "Échec de l’ajout du nom de robot « $1 ». A-t-il déjà été ajouté ?",
        "passwordreset-capture-help": "Si vous cochez cette case, le courriel (avec le mot de passe temporaire) vous sera affiché en même temps qu’il sera envoyé à l’utilisateur.",
        "passwordreset-email": "Adresse de courriel :",
        "passwordreset-emailtitle": "Détails du compte sur {{SITENAME}}",
-       "passwordreset-emailtext-ip": "Quelqu’un (probablement vous, depuis l’adresse IP $1) a demandé un réinitialisation de votre mot de passe pour {{SITENAME}} ($4). {{PLURAL:$3|Le compte utilisateur suivant est associé|Les comptes utilisateurs suivants sont associés}} à cette adresse de courriel :\n\n$2\n\n{{PLURAL:$3|Ce mot de passe temporaire expirera|Ces mots de passe temporaires expireront}} dans {{PLURAL:$5|un jour|$5 jours}}. \nVous devez maintenant vous connecter et choisir un nouveau mot de passe. Si cette demande ne provient pas de vous, ou que vous avez retrouvé votre mot de passe initial, et ne souhaitez plus le modifier, vous pouvez ignorer ce message et continuer à utiliser votre ancien mot de passe.",
+       "passwordreset-emailtext-ip": "Quelqu’un (probablement vous, depuis l’adresse IP $1) a demandé une réinitialisation de votre mot de passe pour {{SITENAME}} ($4). {{PLURAL:$3|Le compte utilisateur suivant est associé|Les comptes utilisateurs suivants sont associés}} à cette adresse de courriel :\n\n$2\n\n{{PLURAL:$3|Ce mot de passe temporaire expirera|Ces mots de passe temporaires expireront}} dans {{PLURAL:$5|un jour|$5 jours}}. \nVous devez maintenant vous connecter et choisir un nouveau mot de passe. Si cette demande ne provient pas de vous, ou si vous avez retrouvé votre mot de passe initial, et ne souhaitez plus le modifier, vous pouvez ignorer ce message et continuer à utiliser votre ancien mot de passe.",
        "passwordreset-emailtext-user": "L’utilisateur $1 sur {{SITENAME}} a demandé une réinitialisation de votre mot de passe pour {{SITENAME}} ($4). {{PLURAL:$3|Le compte utilisateur suivant est associé|Les comptes utilisateurs suivants sont associés}} à cette adresse de courriel :\n\n$2\n\n{{PLURAL:$3|Ce mot de passe temporaire expirera|Ces mots de passe temporaires expireront}} dans {{PLURAL:$5|un jour|$5 jours}}. \nVous devez maintenant vous connecter et choisir un nouveau mot de passe. Si cette demande ne provient pas de vous, ou si vous avez retrouvé votre mot de passe initial, et ne souhaitez plus le modifier, vous pouvez ignorer ce message et continuer à utiliser votre ancien mot de passe.",
        "passwordreset-emailelement": "Nom d’utilisateur : \n$1\n\nMot de passe temporaire : \n$2",
        "passwordreset-emailsentemail": "Si cette adresse de courriel est associée à votre compte, alors un courriel de réinitialisation de mot de passe sera envoyé.",
        "previewnote": "<strong>Rappelez-vous que ce n’est qu’une prévisualisation.</strong>\nVos modifications n’ont pas encore été enregistrées !",
        "continue-editing": "Aller à la zone de modification",
        "previewconflict": "Cette prévisualisation montre le texte de la boîte supérieure de modification tel qu’il apparaîtra si vous choisissez de le publier.",
-       "session_fail_preview": "Désolé, nous ne pouvons enregistrer votre modification à cause d’une perte d’informations concernant votre session.\n\nVous avez peut-être été déconnecté. <strong>Veuillez vérifier que vous êtes toujours connecté et réessayer.</strong>\nSi cela échoue de nouveau, essayez en vous [[Special:UserLogout|déconnectant]], puis en vous reconnectant, et vérifiez que votre navigateur accepte les cookies de ce site.",
-       "session_fail_preview_html": "Désolé, nous ne pouvons enregistrer votre modification à cause d’une perte d’informations concernant votre session.\n\n<em>Parce que {{SITENAME}} a activé le HTML brut, la prévisualisation est masquée afin de prévenir les attaques par JavaScript.</em>\n\n<strong>Si la tentative de modification est légitime, veuillez réessayer.</strong>\nSi cela échoue de nouveau, [[Special:UserLogout|déconnectez-vous]], puis reconnectez-vous, et vérifiez que votre navigateur accepte les cookies de ce site.",
+       "session_fail_preview": "Désolé, nous ne pouvons enregistrer votre modification à cause d’une perte d’informations concernant votre session.\n\nVous avez peut-être été déconnecté. <strong>Veuillez vérifier que vous êtes toujours connecté et réessayer.</strong>\nSi cela échoue de nouveau, essayez en vous [[Special:UserLogout|déconnectant]], puis en vous reconnectant, et vérifiez que votre navigateur accepte les témoins (''cookies'') de ce site.",
+       "session_fail_preview_html": "Désolé, nous ne pouvons enregistrer votre modification à cause d’une perte d’informations concernant votre session.\n\n<em>Parce que {{SITENAME}} a activé le HTML brut, la prévisualisation est masquée afin de prévenir les attaques par JavaScript.</em>\n\n<strong>Si la tentative de modification est légitime, veuillez réessayer.</strong>\nSi cela échoue de nouveau, [[Special:UserLogout|déconnectez-vous]], puis reconnectez-vous, et vérifiez que votre navigateur accepte les témoins (''cookies'') de ce site.",
        "token_suffix_mismatch": "<strong>Votre modification n’a pas été acceptée car votre navigateur a mal codé les caractères de ponctuation dans l’identifiant de modification.</strong>\nCe rejet est nécessaire pour empêcher la corruption du texte de la page.\nCe problème se produit parfois lorsque vous utilisez un serveur mandataire anonyme problématique basé sur le web.",
        "edit_form_incomplete": "<strong>Certaines parties du formulaire de modification n’ont pas atteint le serveur, vérifiez que vos modifications sont intactes et essayez à nouveau.</strong>",
        "editing": "Modification de $1",
        "editingsection": "Modification de $1 (section)",
        "editingcomment": "Modification de $1 (nouvelle section)",
        "editconflict": "Conflit de modification : $1",
-       "explainconflict": "Cette page a été changée après que vous ayez commencé à la modifier.\nLa zone de modification supérieure contient le texte tel qu’il est actuellement enregistré dans la base de données.\nVos modifications apparaissent dans la zone de modification inférieure.\nVous allez devoir fusionner vos modifications dans le texte existant.\n<strong>Seul</strong> le texte de la zone supérieure sera sauvegardé si vous cliquez sur « {{int:savearticle}} ».",
+       "explainconflict": "Cette page a été changée après que vous avez commencé à la modifier.\nLa zone de modification supérieure contient le texte tel qu’il est actuellement enregistré dans la base de données.\nVos modifications apparaissent dans la zone de modification inférieure.\nVous allez devoir fusionner vos modifications dans le texte existant.\n<strong>Seul</strong> le texte de la zone supérieure sera sauvegardé si vous cliquez sur « {{int:savearticle}} ».",
        "yourtext": "Votre texte",
        "storedversion": "La version enregistrée",
        "nonunicodebrowser": "<strong>Attention : votre navigateur ne prend pas en charge l’Unicode.</strong>\nUn palliatif est en place vous permettant de modifier les pages en toute sécurité, faisant apparaître les caractères non-ASCII sous forme hexadécimale dans la boîte de modification.",
        "grant-basic": "Droits de base",
        "grant-viewdeleted": "Afficher les fichiers et pages supprimés",
        "grant-viewmywatchlist": "Afficher votre liste de suivi",
+       "grant-viewrestrictedlogs": "Afficher les entrées de journal confidentielles",
        "newuserlogpage": "Journal des créations de comptes utilisateur",
        "newuserlogpagetext": "Cette page affiche l’historique des créations de comptes utilisateur.",
        "rightslog": "Journal des modifications de droits d’utilisateurs",
        "booksources-search": "Rechercher",
        "booksources-text": "Voici une liste indicative de liens vers d’autres sites vendant des livres neufs et d’occasion et sur lesquels vous trouverez peut-être des informations sur les ouvrages que vous cherchez :",
        "booksources-invalid-isbn": "L’ISBN donné ne semble pas être correct ; vérifiez si vous avez fait une erreur en copiant la source originale.",
+       "magiclink-tracking-rfc": "Pages utilisant des liens magiques RFC",
+       "magiclink-tracking-rfc-desc": "Cette page utilise des liens magiques RFC. Voyez [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] sur la manière de migrer.",
+       "magiclink-tracking-pmid": "Pages utilisant des liens magiques PMID",
+       "magiclink-tracking-pmid-desc": "Cette page utilise des liens magiques PMID. Voyez [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] sur la manière de migrer.",
+       "magiclink-tracking-isbn": "Pages utilisant des liens magiques ISBN",
+       "magiclink-tracking-isbn-desc": "Cette page utilise des liens magiques ISBN. Voyez [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] sur la manière de migrer.",
        "specialloguserlabel": "Auteur :",
        "speciallogtitlelabel": "Cible (titre ou {{ns:user}}:nom d'utilisateur) :",
        "log": "Journaux d’opérations",
        "activeusers-intro": "Ceci est une liste des utilisateurs qui ont exercé une quelconque activité au cours {{PLURAL:$1|de la dernière journée|des $1 derniers jours}}.",
        "activeusers-count": "$1 {{PLURAL:$1|action|actions}} lors {{PLURAL:$3|du dernier jour|des $3 derniers jours}}",
        "activeusers-from": "Afficher les utilisateurs depuis :",
-       "activeusers-hidebots": "Masquer les robots",
-       "activeusers-hidesysops": "Masquer les administrateurs",
+       "activeusers-groups": "Afficher les utilisateurs appartenant aux groupes :",
        "activeusers-noresult": "Aucun utilisateur trouvé.",
        "activeusers-submit": "Afficher les utilisateurs actifs",
        "listgrouprights": "Droits des groupes d'utilisateurs",
        "modifiedarticleprotection": "a modifié le niveau de protection de « [[$1]] »",
        "unprotectedarticle": "a supprimé la protection de « [[$1]] »",
        "movedarticleprotection": "a déplacé les paramètres de protection depuis « [[$2]] » vers « [[$1]] »",
+       "protectedarticle-comment": "{{GENDER:$2|A protégé}} « [[$1]] »",
+       "modifiedarticleprotection-comment": "{{GENDER:$2|A changé le niveau de protection}} pour « [[$1]] »",
+       "unprotectedarticle-comment": "{{GENDER:$2|A supprimé la protection}} de « [[$1]] »",
        "protect-title": "Changer le niveau de protection pour « $1 »",
        "protect-title-notallowed": "Voir le niveau de protection de « $1 »",
        "prot_1movedto2": "[[$1]] renommé en [[$2]]",
        "import-nonewrevisions": "Aucune révision importée (toutes étaient soit déjà présentes, soit ignorées du fait d’erreurs).",
        "xml-error-string": "$1 à la ligne $2, colonne $3 (octet $4) : $5",
        "import-upload": "Import de données XML",
-       "import-token-mismatch": "Perte des données de session.\n\nVous avez peut-être été déconnecté. <strong>Veuillez vérifier que vous êtes toujours connecté et réessayez</strong>.\nSi cela ne fonctionne toujours pas, essayez de [[Special:UserLogout|vous déconnecter]] et reconnectez-vous, et vérifiez que votre navigateur accepte les cookies de ce site.",
+       "import-token-mismatch": "Perte des données de session.\n\nVous avez peut-être été déconnecté. <strong>Veuillez vérifier que vous êtes toujours connecté et réessayez</strong>.\nSi cela ne fonctionne toujours pas, essayez de [[Special:UserLogout|vous déconnecter]] et de vous reconnecter, et vérifiez que votre navigateur accepte les témoins (''cookies'') de ce site.",
        "import-invalid-interwiki": "Impossible d'importer depuis le wiki spécifié.",
        "import-error-edit": "La page « $1 » n’a pas été importée parce que vous n’êtes pas autorisé à la modifier.",
        "import-error-create": "La page « $1 » n’a pas été importée parce que vous n’êtes pas autorisé à la créer.",
        "api-error-hookaborted": "La modification que vous avez essayé de faire a été annulée par une extension.",
        "api-error-http": "Erreur interne : ne peut se connecter au serveur.",
        "api-error-illegal-filename": "Le nom du fichier n'est pas autorisé.",
-       "api-error-internal-error": "Erreur interne : Quelque chose s'est mal passé lors du traitement de votre import sur le wiki.",
-       "api-error-invalid-file-key": "Erreur interne : aucun fichier trouvé dans le stockage temporaire.",
+       "api-error-internal-error": "Erreur interne : quelque chose s'est mal passé lors du traitement de votre import sur le wiki.",
+       "api-error-invalid-file-key": "Erreur interne : fichier non trouvé dans l'espace de stockage temporaire.",
        "api-error-missingparam": "Erreur interne : Il manque des paramètres dans la requête.",
        "api-error-missingresult": "Erreur interne : Nous n'avons pas pu déterminer si la copie avait réussi.",
        "api-error-mustbeloggedin": "Vous devez être connecté pour télécharger des fichiers.",
        "api-error-timeout": "Le serveur n'a pas répondu dans le délai imparti.",
        "api-error-unclassified": "Une erreur inconnue s'est produite",
        "api-error-unknown-code": "Erreur inconnue : « $1 »",
-       "api-error-unknown-error": "Erreur interne : Quelque chose a mal tourné lors du versement de votre fichier.",
+       "api-error-unknown-error": "Erreur interne : quelque chose s'est mal passé lors du téléversement de votre fichier.",
        "api-error-unknown-warning": "Avertissement inconnu : « $1 ».",
        "api-error-unknownerror": "Erreur inconnue : « $1 ».",
        "api-error-uploaddisabled": "Le téléversement est désactivé sur ce wiki.",
        "expand_templates_generate_xml": "Voir l’arborescence d’analyse XML",
        "expand_templates_generate_rawhtml": "Afficher le HTML brut",
        "expand_templates_preview": "Aperçu du rendu",
-       "expand_templates_preview_fail_html": "<em>Comme {{SITENAME}} a HTML brut activé et qu’il y a eu une perte de données de session, l’aperçu est masqué par précaution contre les attaques JavaScript.</em>\n\n<strong>Si c’est une demande d’aperçu légitime, veuillez réessayer.</strong>\nSi cela ne fonctionne toujours pas, essayez de [[Special:UserLogout|vous déconnecter]] et vous reconnecter, et vérifiez que votre navigateur accepte les cookies de ce site.",
+       "expand_templates_preview_fail_html": "<em>Comme {{SITENAME}} a l’HTML brut activé et qu’il y a eu une perte de données de session, l’aperçu est masqué par précaution contre les attaques JavaScript.</em>\n\n<strong>Si c’est une demande d’aperçu légitime, veuillez réessayer.</strong>\nSi cela ne fonctionne toujours pas, essayez de [[Special:UserLogout|vous déconnecter]] et de vous reconnecter, et vérifiez que votre navigateur accepte les témoins (''cookies'') de ce site.",
        "expand_templates_preview_fail_html_anon": "<em>Comme {{SITENAME}} a HTML brut activé et que vous n’êtes pas connecté, l’aperçu est masqué par précaution contre les attaques JavaScript.</em>\n\n<strong>Si c’est une demande d’aperçu légitime, veuillez [[Special:UserLogin|vous connecter]] et réessayer.</strong>",
        "expand_templates_input_missing": "Vous devez fournir au moins un texte d’entrée.",
        "pagelanguage": "Modifier la langue de la page",
        "mw-widgets-titleinput-description-redirect": "redirection vers $1",
        "sessionmanager-tie": "Impossible de combiner des types multiples de demandes d’authentification : $1.",
        "sessionprovider-generic": "sessions $1",
-       "sessionprovider-mediawiki-session-cookiesessionprovider": "sessions basées sur les cookies",
-       "sessionprovider-nocookies": "Il est possible que les cookies soient désactivés. Assurez-vous que vous avez activé les cookies et recommencez.",
+       "sessionprovider-mediawiki-session-cookiesessionprovider": "sessions basées sur les témoins (''cookies'')",
+       "sessionprovider-nocookies": "Il est possible que les témoins (''cookies'') soient désactivés. Assurez-vous que vous avez activé les témoins et recommencez.",
        "randomrootpage": "Page racine aléatoire",
        "log-action-filter-block": "Type de blocage :",
        "log-action-filter-contentmodel": "Type de modification de modèle de contenu :",
        "authmanager-authn-autocreate-failed": "La création automatique d’un compte local a échoué : $1",
        "authmanager-change-not-supported": "Les informations d’identification fournies ne peuvent pas être modifiées, car rien ne les utiliserait.",
        "authmanager-create-disabled": "La création de compte est désactivée.",
-       "authmanager-create-from-login": "Pour créer votre compte, veuillez remplir les champs ci-dessous.",
+       "authmanager-create-from-login": "Pour créer votre compte, veuillez remplir les champs.",
        "authmanager-create-not-in-progress": "La création de compte n’est pas en cours, ou les données de session ont été perdues. Veuillez recommencer depuis le début.",
        "authmanager-create-no-primary": "Les informations d’identification fournies n’ont pas pu être utilisées pour la création de compte.",
        "authmanager-link-no-primary": "Les informations d’identification fournies n’ont pas pu être utilisées pour lier un compte.",
index f97a07f..5182de0 100644 (file)
        "previewnote": "'''Lembre que esta é só unha vista previa e que aínda non gardou os seus cambios!'''",
        "continue-editing": "Ir ata a caixa de edición",
        "previewconflict": "Esta vista previa mostra o texto na área superior tal e como aparecerá se escolle gardar.",
-       "session_fail_preview": "Sentímolo! Non podemos procesar a súa edición porque se perderon os datos de inicio da sesión.\n\nA súa sesión pode que fose pechada. <strong> Por favor, verifique se aínda está conectado e probe de novo</strong>. En caso de que siga sen funcionar, intente [[Special:UserLogout|saír]] e volver a entrar na súa conta, e verifique que o seu navegador permite o uso de \"cookies\" neste sitio.",
+       "session_fail_preview": "Sentímolo! Non puidemos procesar a súa edición porque se perderon os datos de inicio da sesión.\n\nPoida que se pechase a súa sesión. <strong>Por favor, verifique que ten a sesión aberta e probe de novo.</strong>\nEn caso de que siga sen funcionar, intente [[Special:UserLogout|saír]] e volver entrar na súa conta e verifique que o seu navegador permite o uso de cookies neste sitio.",
        "session_fail_preview_html": "Sentímolo! Non foi posible procesar a edición debido á pérdida de datos da súa sesión.\n\n<em>Como a wiki {{SITENAME}} posibilita o uso de HTML puro, a vista previa está oculta por precaución contra ataques con JavaScript.</em>\n\n<strong>Se este é un intento lexítimo de edición probe de novo, por favor</strong>. \nEn caso de que continúe sen funcionar, intente [[Special:UserLogout|saír]] e volver a entrar na súa conta, e verifique se o seu navegador permite o uso de ''cookies'' deste sitio.",
        "token_suffix_mismatch": "'''Rexeitouse a súa edición porque o seu cliente confundiu os signos de puntuación na edición.'''\nRexeitouse a edición para evitar que se corrompa o texto do artigo.\nIsto pode acontecer porque estea a empregar un servizo de proxy anónimo defectuoso baseado na web.",
        "edit_form_incomplete": "'''Algunhas partes do formulario de edición non chegaron ao servidor; comprobe que a súa modificación está intacta e inténteo de novo.'''",
        "grant-basic": "Dereitos básicos",
        "grant-viewdeleted": "Ver ficheiros e páxinas eliminados",
        "grant-viewmywatchlist": "Ver a súa lista de vixilancia",
+       "grant-viewrestrictedlogs": "Ver as entradas de rexistro confidenciais",
        "newuserlogpage": "Rexistro de creación de usuarios",
        "newuserlogpagetext": "Este é un rexistro de creación de contas de usuario.",
        "rightslog": "Rexistro de dereitos de usuario",
        "booksources-search": "Procurar",
        "booksources-text": "A continuación aparece unha lista de ligazóns cara a outros sitios web que venden libros novos e usados, neles tamén pode obter máis información sobre as obras que está a buscar:",
        "booksources-invalid-isbn": "O ISBN inserido parece non ser válido; comprobe que non haxa erros ao copialo da fonte orixinal.",
+       "magiclink-tracking-rfc": "Páxinas que usan ligazóns máxicas RFC",
+       "magiclink-tracking-rfc-desc": "Esta páxina utiliza ligazóns máxicas RFC. Consulte [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] para descubrir como facer a migración.",
+       "magiclink-tracking-pmid": "Páxinas que usan ligazóns máxicas PMID",
+       "magiclink-tracking-pmid-desc": "Esta páxina utiliza ligazóns máxicas PMID. Consulte [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] para descubrir como facer a migración.",
+       "magiclink-tracking-isbn": "Páxinas que usan ligazóns máxicas ISBN",
+       "magiclink-tracking-isbn-desc": "Esta páxina utiliza ligazóns máxicas ISBN. Consulte [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] para descubrir como facer a migración.",
        "specialloguserlabel": "Executante:",
        "speciallogtitlelabel": "Obxectivo (título ou {{ns:user}}:nome de usuario):",
        "log": "Rexistros",
        "activeusers-intro": "Esta é unha lista cos usuarios que tiveron algún tipo de actividade {{PLURAL:$1|no último día|nos últimos $1 días}}.",
        "activeusers-count": "$1 {{PLURAL:$1|acción|accións}} {{PLURAL:$3|no último día|nos últimos $3 días}}",
        "activeusers-from": "Mostrar os usuarios que comecen por:",
-       "activeusers-hidebots": "Agochar os bots",
-       "activeusers-hidesysops": "Agochar os administradores",
+       "activeusers-groups": "Mostrar os usuarios que pertencen ós grupos:",
        "activeusers-noresult": "Non se atopou ningún usuario.",
        "activeusers-submit": "Mostrar usuarios activos",
        "listgrouprights": "Dereitos dun usuario segundo o seu grupo",
        "modifiedarticleprotection": "modificou o nivel de protección de \"[[$1]]\"",
        "unprotectedarticle": "eliminou a protección de \"[[$1]]\"",
        "movedarticleprotection": "cambiou as características da protección de \"[[$2]]\" a \"[[$1]]\"",
+       "protectedarticle-comment": "{{GENDER:$2|Protexido}} \"[[$1]]\"",
+       "modifiedarticleprotection-comment": "{{GENDER:$2|Cambiado o nivel de protección}} para \"[[$1]]\"",
+       "unprotectedarticle-comment": "{{GENDER:$2|Eliminada a protección}} para \"[[$1]]\"",
        "protect-title": "Cambiar o nivel de protección de \"$1\"",
        "protect-title-notallowed": "Ollar o nivel de protección de \"$1\"",
        "prot_1movedto2": "moveu \"[[$1]]\" a \"[[$2]]\"",
        "authmanager-authn-autocreate-failed": "A creación automatica dunha conta local fallou: $1",
        "authmanager-change-not-supported": "As credenciais proporcionadas non se poden modificar, xa que ninguén as utilizará.",
        "authmanager-create-disabled": "A creación de contas está desactivada.",
-       "authmanager-create-from-login": "Para crear a súa conta, complete os campos a continuación.",
+       "authmanager-create-from-login": "Para crear a súa conta, complete os campos.",
        "authmanager-create-not-in-progress": "O proceso de creación da conta non está en progreso ou perdéronse os datos da sesión. Empece de novo desde o principio.",
        "authmanager-create-no-primary": "As credenciais subministradas non poden usarse para a creación da conta.",
        "authmanager-link-no-primary": "As credenciais subministradas non poden usarse para a ligazón da conta.",
index dc26324..944b0bb 100644 (file)
        "botpasswords-label-delete": "מחיקה",
        "botpasswords-label-resetpassword": "איפוס ססמה",
        "botpasswords-label-grants": "זיכיונות מתאימים",
-       "botpasswords-help-grants": "×\9b×\9c ×\96×\99×\9b×\99×\95×\9f × ×\95ת×\9f ×\92×\99ש×\94 ×\9c×\94רש×\90×\95ת ×\9eשת×\9eש ×¨×©×\95×\9e×\95ת ×©×\99ש ×\9c×\97ש×\91×\95×\9f ×\94×\9eשת×\9eש. ×¢×\99×\99× ×\95 ×\91[[Special:ListGrants|×\98×\91×\9cת ×\94×\96×\99×\9b×\99×\95× ×\95ת]] ×\9c×\9e×\99×\93×¢ × ×\95סף.",
+       "botpasswords-help-grants": "×\96×\99×\9b×\99×\95× ×\95ת × ×\95תנ×\99×\9d ×\92×\99ש×\94 ×\9c×\94רש×\90×\95ת ×©×\9b×\91ר ×\9e×\95×\97×\96ק×\95ת ×\91×\99×\93×\99 ×\97ש×\91×\95×\9f ×\94×\9eשת×\9eש ×©×\9c×\9a. ×\94פע×\9cת ×\96×\99×\9b×\99×\95×\9f ×\91×\93×£ ×\96×\94 ×\90×\99× ×\94 × ×\95תנת ×\92×\99ש×\94 ×\9c×\94רש×\90×\95ת ×\90×\97ר×\95ת ×©×\90×\99× ×\9f ×\9e×\95×\97×\96ק×\95ת ×\91×\99×\93×\99 ×\97ש×\91×\95×\9f ×\94×\9eשת×\9eש ×©×\9c×\9a. ×\9e×\99×\93×¢ × ×\95סף ×\9e×\95פ×\99×¢ ×\91[[Special:ListGrants|×\98×\91×\9cת ×\94×\96×\99×\9b×\99×\95× ×\95ת]].",
        "botpasswords-label-grants-column": "ניתן זיכיון",
        "botpasswords-bad-appid": "שם הבוט \"$1\" אינו תקין.",
        "botpasswords-insert-failed": "הוספת שם הבוט \"$1\" נכשלה. האם הוא כבר נוסף?",
        "grant-basic": "הרשאות בסיסיות",
        "grant-viewdeleted": "צפייה בקבצים ודפים שנמחקו",
        "grant-viewmywatchlist": "צפייה ברשימת המעקב שלך",
+       "grant-viewrestrictedlogs": "צפייה בפריטי היומן המוגבלים",
        "newuserlogpage": "יומן רישום משתמשים",
        "newuserlogpagetext": "זהו יומן המכיל הרשמות של משתמשים.",
        "rightslog": "יומן הרשאות",
        "booksources-search": "חיפוש",
        "booksources-text": "להלן רשימת קישורים לאתרים אחרים המוכרים ספרים חדשים ויד־שנייה, ושבהם עשוי להיות מידע נוסף לגבי ספרים שאתם מחפשים:",
        "booksources-invalid-isbn": "המסת\"ב שניתן כנראה אינו תקין; אנא בדקו אם ביצעתם טעויות בהעתקה מהמידע המקורי.",
+       "magiclink-tracking-rfc": "דפים שמשתמשים בקישורי קסם ל־RFC",
+       "magiclink-tracking-rfc-desc": "דף זה משתמש בקישורי קסם ל־RFC. באתר [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] מוסבר כיצד יש לשנותם.",
+       "magiclink-tracking-pmid": "דפים שמשתמשים בקישורי קסם ל־PMID",
+       "magiclink-tracking-pmid-desc": "דף זה משתמש בקישורי קסם ל־PMID. באתר [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] מוסבר כיצד יש לשנותם.",
+       "magiclink-tracking-isbn": "דפים שמשתמשים בקישורי קסם ל־ISBN",
+       "magiclink-tracking-isbn-desc": "דף זה משתמש בקישורי קסם ל־ISBN. באתר [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] מוסבר כיצד יש לשנותם.",
        "specialloguserlabel": "בוצעו על־ידי המשתמש:",
        "speciallogtitlelabel": "יעד (שם הדף, או \"{{ns:user}}:שם\" עבור משתמש):",
        "log": "יומנים",
        "activeusers-intro": "זוהי רשימת המשתמשים שביצעו פעולה כלשהי {{PLURAL:$1|ביום האחרון|ביומיים האחרונים|ב־$1 הימים האחרונים}}.",
        "activeusers-count": "{{PLURAL:$1|פעולה אחת|$1 פעולות}} ב{{PLURAL:$3|יום האחרון|יומיים האחרונים|־$3 הימים האחרונים}}",
        "activeusers-from": "הצגת משתמשים החל מ:",
-       "activeusers-hidebots": "הסתרת בוטים",
-       "activeusers-hidesysops": "הסתרת מפעילי מערכת",
+       "activeusers-groups": "הצגת משתמשים השייכים לקבוצות:",
        "activeusers-noresult": "לא נמצאו משתמשים.",
        "activeusers-submit": "הצגת משתמשים פעילים",
        "listgrouprights": "רשימת הרשאות לקבוצה",
        "protectlogtext": "להלן רשימה של שינויי ההגנה על דפים.\nראו גם את [[Special:ProtectedPages|רשימת הדפים המוגנים]] הנוכחית.",
        "protectedarticle": "הופעלה הגנה על הדף \"[[$1]]\"",
        "modifiedarticleprotection": "רמת ההגנה של הדף \"[[$1]]\" שונתה",
-       "unprotectedarticle": "×\94×\94×\92× ×\94 ×¢×\9c ×\94×\93×£ \"[[$1]]\" ×\94×\95סר×\94",
+       "unprotectedarticle": "×\94×\94×\92× ×\94 ×\94×\95סר×\94 ×\9e×\94×\93×£ \"[[$1]]\"",
        "movedarticleprotection": "הגדרות ההגנה של הדף \"[[$2]]\" הועברו לדף \"[[$1]]\"",
+       "protectedarticle-comment": "{{GENDER:$2|הפעיל|הפעילה}} הגנה על הדף \"[[$1]]\"",
+       "modifiedarticleprotection-comment": "{{GENDER:$2|שינה|שינתה}} את רמת ההגנה של הדף \"[[$1]]\"",
+       "unprotectedarticle-comment": "{{GENDER:$2|הסיר|הסירה}} את ההגנה מהדף \"[[$1]]\"",
        "protect-title": "שינוי רמת ההגנה של הדף \"$1\"",
        "protect-title-notallowed": "הצגת רמת ההגנה של הדף \"$1\"",
        "prot_1movedto2": "[[$1]] הועבר לשם [[$2]]",
        "patrol-log-header": "יומן זה מציג גרסאות שנבדקו.",
        "log-show-hide-patrol": "$1 יומן שינויים בדוקים",
        "log-show-hide-tag": "$1 יומן תגיות",
+       "confirm-markpatrolled-button": "אישור",
+       "confirm-markpatrolled-top": "לסמן את גרסה $3 של $2 כבדוקה?",
        "deletedrevision": "מחיקת גרסה ישנה ($1)",
        "filedeleteerror-short": "שגיאה במחיקת הקובץ: $1",
        "filedeleteerror-long": "שגיאות שאירעו בעת מחיקת הקובץ:\n\n$1",
        "authmanager-authn-autocreate-failed": "יצירה אוטומטית של חשבון מקומי נכשלה: $1",
        "authmanager-change-not-supported": "לא ניתן לשנות את נתוני ההאמנה שניתנו, כי שום דבר לא ישתמש בהם.",
        "authmanager-create-disabled": "אפשרות יצירת החשבונות מבוטלת.",
-       "authmanager-create-from-login": "×\9b×\93×\99 ×\9c×\99צ×\95ר ×\90ת ×\94×\97ש×\91×\95×\9f, × ×\90 ×\9c×\9e×\9c×\90 ×\90ת ×\94ש×\93×\95ת ×©×\9c×\94×\9c×\9f.",
+       "authmanager-create-from-login": "×\9b×\93×\99 ×\9c×\99צ×\95ר ×\90ת ×\94×\97ש×\91×\95×\9f, ×\99ש ×\9c×\9e×\9c×\90 ×\90ת ×\94ש×\93×\95ת.",
        "authmanager-create-not-in-progress": "יצירת החשבון נכשלה או שנתוני הפעולה נאבדו. נא להתחיל את התהליך מחדש.",
        "authmanager-create-no-primary": "האישורים שסופקו לא יכולים להיות בשימוש ביצירת חשבון.",
        "authmanager-link-no-primary": "האישורים שסופקו לא יכולים להיות בשימוש בקישור חשבונות.",
index 3bfa0f1..7d15d79 100644 (file)
        "userlogin-yourname": "Suradničko ime",
        "userlogin-yourname-ph": "Unesite Vaše suradničko ime",
        "createacct-another-username-ph": "Upišite suradničko ime:",
-       "yourpassword": "Lozinka:",
+       "yourpassword": "Zaporka:",
        "userlogin-yourpassword": "Zaporka",
        "userlogin-yourpassword-ph": "Unesite Vašu zaporku",
        "createacct-yourpassword-ph": "Unesite zaporku",
-       "yourpasswordagain": "Ponovno upišite lozinku",
+       "yourpasswordagain": "Ponovno upišite zaporku",
        "createacct-yourpasswordagain": "Potvrdi zaporku",
        "createacct-yourpasswordagain-ph": "Unesite zaporku ponovno",
        "userlogin-remembermypassword": "Zapamti me",
        "createacct-benefit-body1": "{{PLURAL:$1|uređivanje|uređivanja}}",
        "createacct-benefit-body2": "{{PLURAL:$1|stranica|stranice|stranica}}",
        "createacct-benefit-body3": "{{PLURAL:$1|nedavni suradnik|nedavnih suradnika}}",
-       "badretype": "Unesene lozinke nisu istovjetne.",
+       "badretype": "Unesene zaporke nisu istovjetne.",
        "userexists": "Uneseno suradničko ime već je u upotrebi.\nUnesite neko drugo ime.",
        "loginerror": "Pogrješka u prijavi",
        "createacct-error": "Pogrješka u stvaranju računa",
        "wrongpassword": "Zaporka koju ste unijeli nije ispravna. Pokušajte ponovno.",
        "wrongpasswordempty": "Niste unijeli zaporku. Pokušajte ponovno.",
        "passwordtooshort": "Zaporka mora sadržavati najmanje {{PLURAL:$1|1 znak|$1 znaka|$1 znakova}}.",
-       "password-name-match": "Vaša lozinka mora biti različita od Vašeg suradničkog imena.",
+       "password-name-match": "Vaša zaporka mora biti različita od Vašeg suradničkog imena.",
        "password-login-forbidden": "Uporaba ovog suradničkog imena i lozinke nije dozvoljena.",
-       "mailmypassword": "Pošalji mi novu lozinku",
-       "passwordremindertitle": "{{SITENAME}}: nova lozinka.",
-       "passwordremindertext": "Netko je (vjerojatno Vi, s IP adrese $1) zatražio novu lozinku za projekt {{SITENAME}} ($4).\nPrivremena lozinka za suradnika \"$2\" je postavljena na \"$3\".\nUkoliko ste to Vi učinili, molimo Vas da se prijavite i promijenite lozinku.\nPrivremena lozinka vrijedi još {{PLURAL:$5|$5 dan|$5 dana}}.\n\nUkoliko niste zatražili novu lozinku, ili ste se sjetili stare lozinke i\nviše ju ne želite promijeniti, slobodno zanemarite ovu poruku i nastavite\nkoristiti staru lozinku.",
+       "mailmypassword": "Pošalji mi novu zaporku",
+       "passwordremindertitle": "{{SITENAME}}: nova zaporka.",
+       "passwordremindertext": "Netko je (vjerojatno Vi, s IP adrese $1) zatražio novu zaporku za projekt {{SITENAME}} ($4).\nPrivremena zaporka za suradnika \"$2\" je postavljena na \"$3\".\nUkoliko ste to Vi učinili, molimo Vas da se prijavite i promijenite zaporku.\nPrivremena zaporka vrijedi još {{PLURAL:$5|$5 dan|$5 dana}}.\n\nUkoliko niste zatražili novu zaporku, ili ste se sjetili stare zaporke i\nviše ju ne želite promijeniti, slobodno zanemarite ovu poruku i nastavite\nkoristiti staru zaporku.",
        "noemail": "Suradnik \"$1\" nema zapisanu e-mail adresu.",
        "noemailcreate": "Morate navesti važeću e-mail adresu",
        "passwordsent": "Nova je zaporka poslana na adresu elektroničke pošte suradnika \"$1\"",
-       "blocked-mailpassword": "Vašoj IP adresi je blokirano uređivanje stranica, a da bi se spriječila nedopuštena radnja, mogućnost zahtijevanja nove lozinke je također onemogućena.",
+       "blocked-mailpassword": "Vašoj IP adresi je blokirano uređivanje stranica, a da bi se spriječila nedopuštena radnja, mogućnost zahtijevanja nove zaporke je također onemogućena.",
        "eauthentsent": "Na navedenu adresu poslana je e-poruka s potvrdom.\nPrije nego što pošaljemo daljnje poruke, molimo Vas otvorite e-poruku i slijedite u njemu sadržana uputstva kako biste potvrdili da je adresa e-pošte zaista Vaša.",
        "throttled-mailpassword": "Već Vam je poslan e-mail za promjenu zaporke, u {{PLURAL:$1|posljednjih sat vremena|posljednja $1 sata|posljednjih $1 sati}}.\nDa bi spriječili zloupotrebu, moguće je poslati samo jedan e-mail za promjenu zaporke {{PLURAL:$1|svakih sat vremena|svaka $1 sata|svakih $1 sati}}.",
        "mailerror": "Pogrješka pri slanju e-pošte: $1",
        "accountcreated": "Suradnički račun otvoren",
        "accountcreatedtext": "Suradnički je račun [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]]) stvoren.",
        "createaccount-title": "Otvaranje suradničkog računa za {{SITENAME}}",
-       "createaccount-text": "Netko je stvorio suradnički račun s Vašom adresom elektronske pošte na {{SITENAME}} ($4) nazvan \"$2\", s lozinkom \"$3\". Trebali biste se prijaviti i odmah promijeniti lozinku.\n\nMožete zanemariti ovu poruku ako je suradnički račun stvoren nenamjerno.",
+       "createaccount-text": "Netko je stvorio suradnički račun s Vašom adresom e-pošte na {{SITENAME}} ($4) nazvan \"$2\", sa zaporkom \"$3\". Trebali biste se prijaviti i odmah promijeniti zaporku.\n\nMožete zanemariti ovu poruku ako je suradnički račun stvoren nenamjerno.",
        "login-throttled": "Nedavno ste se previše puta pokušali prijaviti.\nMolimo Vas pričekajte $1 prije nego što pokušate ponovno.",
        "login-abort-generic": "Vaša je prijava bila neuspješna te je stoga prekinuta.",
        "login-migrated-generic": "Vaš se suradnički račun preselio, te Vaše suradničko ime više ne postoji u ovom wikiju.",
        "user-mail-no-addy": "Pokušaj slanja e-maila bez e-mail adrese.",
        "user-mail-no-body": "Pokušali ste poslati e-mail bez sadržaja ili s prekratkim sadržajem.",
        "changepassword": "Promjena zaporke",
-       "resetpass_announce": "Da biste završili proces mijenjanja lozinke, upišite \nnovu lozinku.",
-       "resetpass_header": "Promijeni lozinku računa",
-       "oldpassword": "Stara lozinka",
-       "newpassword": "Nova lozinka",
-       "retypenew": "Ponovno unesite lozinku",
-       "resetpass_submit": "Postavite lozinku i prijavite se",
+       "resetpass_announce": "Da biste završili proces mijenjanja zaporke, upišite \nnovu zaporku.",
+       "resetpass_header": "Promijeni zaporku računa",
+       "oldpassword": "Stara zaporka",
+       "newpassword": "Nova zaporka",
+       "retypenew": "Ponovno unesite zaporku",
+       "resetpass_submit": "Postavite zaporku i prijavite se",
        "changepassword-success": "Zaporka je uspješno postavljena!",
        "changepassword-throttled": "Nedavno ste se previše puta pokušali prijaviti.\nMolimo Vas pričekajte $1 prije nego što pokušate ponovno.",
        "botpasswords": "Zaporke botova",
        "botpasswords-bad-appid": "Ime bota \"$1\" nije valjano.",
        "botpasswords-insert-failed": "Nije moguće dodavanje imena bota \"$1\". Možda je već dodano?",
        "botpasswords-update-failed": "Nije moguće ažurirati bot s imenom \"$1\". Možda je izbrisan?",
-       "resetpass_forbidden": "Lozinka ne može biti promijenjena",
+       "resetpass_forbidden": "Zaporka ne može biti promijenjena",
        "resetpass-no-info": "Morate biti prijavljeni da biste izravno pristupili ovoj stranici.",
-       "resetpass-submit-loggedin": "Promijeni lozinku",
+       "resetpass-submit-loggedin": "Promijeni zaporku",
        "resetpass-submit-cancel": "Odustani",
-       "resetpass-wrong-oldpass": "Pogrešna privremena ili trenutačna lozinka.\nMožda ste već uspješno promijenili Vašu lozinku ili ste zatražili novu privremenu lozinku.",
+       "resetpass-wrong-oldpass": "Pogrešna privremena ili trenutačna zaporka.\nMožda ste već uspješno promijenili Vašu zaporku ili ste zatražili novu privremenu zaporku.",
        "resetpass-recycled": "Molimo Vas, promijenite zaporku u nešto drugačiju od Vaše trenutačne zaporke.",
        "resetpass-temp-emailed": "Prijavljeni ste s privremenom zaporkom prijavljenom putem e-poruke.\nDa biste dovršili prijavu morate postaviti novu zaporku.",
-       "resetpass-temp-password": "Privremena lozinka:",
+       "resetpass-temp-password": "Privremena zaporka:",
        "resetpass-abort-generic": "Poništena je promjena zaporke.",
        "resetpass-expired": "Istekla Vam je valjanost zaporke. Molimo Vas, potvrdite novu zaporku za prijavu.",
        "resetpass-expired-soft": "Istekla vam je valjanost zaporke i trebate ju promijeniti. Molimo odaberite novu zaporku ili pritisnite na \"{{int:authprovider-resetpass-skip-label}}\", za kasniju promjenu.",
        "resetpass-validity-soft": "Zaporka Vam ne vrijedi: $1\n\nMolimo odaberite novu zaporku ili pritisnite na \"{{int:authprovider-resetpass-skip-label}}\", za kasniju promjenu.",
-       "passwordreset": "Ponovno postavi lozinku",
+       "passwordreset": "Ponovno postavi zaporku",
        "passwordreset-text-one": "Ispunite ovaj obrazac ako želite ponovno postaviti Vašu zaporku.",
        "passwordreset-text-many": "{{PLURAL:$1|Ispunite jedno od polja da biste dobili privremenu zaporku e-poštom.}}",
        "passwordreset-disabled": "Poništavanje lozinke je onemogućeno na ovom wikiju.",
        "passwordreset-capture-help": "Ako označite ovu kućicu, e-poruka s privremenom lozinkom će biti prikazana i poslana korisniku.",
        "passwordreset-email": "E-mail adresa:",
        "passwordreset-emailtitle": "Pojedinosti o računu na {{SITENAME}}",
-       "passwordreset-emailtext-ip": "Netko (vjerojatno Vi, s IP adrese $1) zatražio je podsjetnik za Vaše detalje računa\nza {{SITENAME}} ($4). Sljedeći {{PLURAL:$3|račun suradnika je|računi suradnika su}}\npovezani s ovom e-mail adresom:\n\n$2\n\n{{PLURAL:$3|Ova privremena lozinka|Ove privremene lozinke}} će isteći u {{PLURAL:$5|jedan dan|$5 dana}}.\nTrebate se prijaviti i odabrati novu lozinku. Ukoliko je netko drugi napravio ovaj\nzahtjev, ili ako ste sjeti Vaše izvorne lozinke, a vi je više ne želite promijeniti, \nmožete zanemariti ovu poruku i nastavite koristiti staru lozinku.",
-       "passwordreset-emailtext-user": "Suradnik $1 na {{SITENAME}} zatražio podsjetnik o pojedinostima vašeg računa za {{SITENAME}}\n($4). Sljedeći {{PLURAL:$3|račun suradnika je|računi suradnika su}} povezani s ovom e-mail adresom:\n\n$2\n\n{{PLURAL:$3|Ova privremena lozinka|Ove privremene lozinke}} će isteći u {{PLURAL:$5|jedan dan|$5 dana}}.\nTrebate se prijaviti i odabrati novu lozinku. Ukoliko je netko drugi napravio ovaj\nzahtjev, ili ako ste sjeti Vaše izvorne lozinke, a vi je više ne želite promijeniti, \nmožete zanemariti ovu poruku i nastavite koristiti staru lozinku.",
-       "passwordreset-emailelement": "Suradničko ime: \n$1\n\nPrivremena lozinka: \n$2",
+       "passwordreset-emailtext-ip": "Netko (vjerojatno Vi, s IP adrese $1) zatražio je podsjetnik za Vaše detalje računa\nza {{SITENAME}} ($4). Sljedeći {{PLURAL:$3|račun suradnika je|računi suradnika su}}\npovezani s ovom e-mail adresom:\n\n$2\n\n{{PLURAL:$3|Ova privremena zaporka|Ove privremene zaporke}} će isteći u {{PLURAL:$5|jedan dan|$5 dana}}.\nTrebate se prijaviti i odabrati novu zaporku. Ukoliko je netko drugi napravio ovaj\nzahtjev, ili ako ste se sjetili Vaše izvorne zaporke, a više je ne želite promijeniti, \nmožete zanemariti ovu poruku i nastavite koristiti staru zaporku.",
+       "passwordreset-emailtext-user": "Suradnik $1 na {{SITENAME}} zatražio je podsjetnik o pojedinostima vašeg računa za {{SITENAME}}\n($4). Sljedeći {{PLURAL:$3|račun suradnika je|računi suradnika su}} povezani s ovom e-mail adresom:\n\n$2\n\n{{PLURAL:$3|Ova privremena zaporka|Ove privremene zaporke}} će isteći u {{PLURAL:$5|jedan dan|$5 dana}}.\nTrebate se prijaviti i odabrati novu zaporku. Ukoliko je netko drugi napravio ovaj\nzahtjev, ili ako ste se sjetili Vaše izvorne zaporke, a više je ne želite promijeniti, \nmožete zanemariti ovu poruku i nastavite koristiti staru zaporku.",
+       "passwordreset-emailelement": "Suradničko ime: \n$1\n\nPrivremena zaporka: \n$2",
        "passwordreset-emailsentemail": "Ako je ova adresa povezana s Vašim suradničkim računom, na nju će biti poslan podsjetnik na zaporku.",
        "changeemail": "Promijeni ili izbriši e-mail adresu",
        "changeemail-header": "Promijeni adresu e-pošte računa",
        "loginreqtitle": "Nužna prijava",
        "loginreqlink": "prijavite se",
        "loginreqpagetext": "Da biste vidjeli ostale stranice, molimo $1.",
-       "accmailtitle": "Lozinka poslana.",
-       "accmailtext": "Nova lozinka za [[User talk:$1|$1]] je poslana na $2.\n\nNakon prijave, lozinka za ovaj novi račun može biti promijenjena na stranici ''[[Special:ChangePassword|promijeni lozinku]]'' nakon prijave.",
+       "accmailtitle": "Zaporka poslana.",
+       "accmailtext": "Nova zaporka za [[User talk:$1|$1]] je poslana na $2.\n\nNakon prijave, zaporka za ovaj novi račun može biti promijenjena na stranici ''[[Special:ChangePassword|promijeni zaporku]]'' nakon prijave.",
        "newarticle": "(Novo)",
        "newarticletext": "Došli ste na stranicu koja još ne postoji.\nAko želite stvoriti tu stranicu, počnite tipkati u prozor ispod ovog teksta (pogledajte [$1 stranicu za pomoć]).\nAko ste ovamo dospjeli slučajno, kliknite gumb '''natrag''' (back) u svom pregledniku.",
        "anontalkpagetext": "----''Ovo je stranica za razgovor s neprijavljenim suradnikom koji još nije otvorio suradnički račun ili se njime ne koristi. Zbog toga se moramo služiti brojčanom IP adresom kako bismo ga identificirali. Takvu adresu često može dijeliti više ljudi. Ako ste neprijavljeni suradnik i smatrate da su Vam upućeni irelevantni komentari, molimo Vas da [[Special:CreateAccount|otvorite suradnički račun]] ili [[Special:UserLogin|se prijavite]] te tako u budućnosti izbjegnete zamjenu s drugim neprijavljenim suradnicima.''",
        "prefs-watchlist-edits-max": "Maksimalni broj: 1000",
        "prefs-watchlist-token": "Token popisa praćenja:",
        "prefs-misc": "Razno",
-       "prefs-resetpass": "Promijeni lozinku",
+       "prefs-resetpass": "Promijeni zaporku",
        "prefs-changeemail": "promijeni adresu e-pošte",
        "prefs-setemail": "Postavite E-mail adresu",
        "prefs-email": "Mogućnosti e-maila",
        "activeusers-intro": "Ovo je popis suradnika koji su napravili neku aktivnost u {{PLURAL:$1|posljednji $1 dan|posljednja $1 dana|posljednjih $1 dana}}.",
        "activeusers-count": "{{PLURAL:$1|nedavna $1 izmjena|nedavne $1 izmjene|nedavnih $1 izmjena}} u {{PLURAL:$3|posljednji $3 dan|posljednja $3 dana|posljednjih $3 dana}}",
        "activeusers-from": "Prikaži suradnike počevši od:",
-       "activeusers-hidebots": "Sakrij botove",
-       "activeusers-hidesysops": "Sakrij administratore",
        "activeusers-noresult": "Niti jedan suradnik nije nađen.",
        "activeusers-submit": "Prikaz aktivnih suradnika",
        "listgrouprights": "Prava suradničkih skupina",
        "contribsub2": "Za {{GENDER:$3|$1}} ($2)",
        "contributions-userdoesnotexist": "Suradnički račun \"$1\" nije registriran.",
        "nocontribs": "Nema promjena koje udovoljavaju ovim kriterijima.",
-       "uctop": "(trenutno)",
+       "uctop": "(vrh)",
        "month": "Od mjeseca (i ranije):",
        "year": "Od godine (i ranije):",
        "sp-contributions-newbies": "Prikaži samo doprinose novih suradnika",
index cf4a2d1..0b91499 100644 (file)
        "newsectionsummary": "/* $1 */ (új szakasz)",
        "rc-enhanced-expand": "Részletek megjelenítése",
        "rc-enhanced-hide": "Részletek elrejtése",
-       "rc-old-title": "eredetileg létrehozott \" $1 \"",
+       "rc-old-title": "eredetileg „$1” címen létrehozva",
        "recentchangeslinked": "Kapcsolódó változtatások",
        "recentchangeslinked-feed": "Kapcsolódó változtatások",
        "recentchangeslinked-toolbox": "Kapcsolódó változtatások",
        "listusers-blocked": "(blokkolva)",
        "activeusers": "Aktív szerkesztők listája",
        "activeusers-intro": "Ez a lap azon felhasználók listáját tartalmazza, akik végeztek valamilyen tevékenységet az elmúlt {{PLURAL:$1|egy|$1}} napban.",
-       "activeusers-count": "$1 szerkesztés az utolsó $3 napban",
+       "activeusers-count": "$1 művelet az elmúlt $3 napban",
        "activeusers-from": "Szerkesztők listázása a következő névtől kezdve:",
-       "activeusers-hidebots": "Botok elrejtése",
-       "activeusers-hidesysops": "Adminisztrátorok elrejtése",
        "activeusers-noresult": "Nem található ilyen szerkesztő.",
        "activeusers-submit": "Aktív szerkesztők megjelenítése",
        "listgrouprights": "Szerkesztői csoportok jogai",
index 5920b06..4408039 100644 (file)
@@ -26,7 +26,8 @@
                        "Vahe Gharakhanyan",
                        "Aram1985",
                        "KeepingCalm",
-                       "Macofe"
+                       "Macofe",
+                       "Kareyac"
                ]
        },
        "tog-underline": "ընդգծել հղումները՝",
        "talk": "Քննարկում",
        "views": "Դիտումները",
        "toolbox": "Գործիքներ",
+       "tool-link-userrights": "Փոփոխել {{GENDER:$1|մասնակից}} խմբեր",
+       "tool-link-emailuser": "Ուղարկել էլ այս նամակ {{GENDER:$1|մասնակցին}}",
        "userpage": "Դիտել մասնակցի էջը",
        "projectpage": "Դիտել նախագծի էջը",
        "imagepage": "Դիտել նիշքի էջը",
        "jumptosearch": "որոնում",
        "view-pool-error": "Ներեցեք, սերվերները գերբեռնված են այս պահին։\nՇատ օգտվողներ փորձում են դիտել այս էջը։\nԽնդրում ենք սպասել որոշ ժամանակ էջը կրկին դիտելու համար։\n\n$1",
        "generic-pool-error": "Ներեցեք, սերվերները գերբեռնված են այս պահին։\nՇատ օգտվողներ փորձում են դիտել այս էջը։\nԽնդրում ենք սպասել որոշ ժամանակ էջը կրկին դիտելու համար։",
+       "pool-timeout": "Արգելափակման ժամկետը սպառվաց է",
        "pool-errorunknown": "Անհայտ սխալ",
        "poolcounter-usage-error": "Օգտագործման սխալ՝ $1",
        "aboutsite": "{{grammar:genitive|{{SITENAME}}}} մասին",
        "listusers-noresult": "Այդպիսի մասնակիցներ չգտնվեցին։",
        "listusers-blocked": "(արգելափակված)",
        "activeusers": "Ակտիվ մասնակիցների ցանկ",
-       "activeusers-hidebots": "Թաքցնել բոտերին",
        "activeusers-noresult": "Այդպիսի մասնակիցներ չեն գտնվել։",
        "activeusers-submit": "Ցույց տալ ակտիվ մասնակիցներին",
        "listgrouprights-members": "(անդամների ցանկ)",
        "ipbexpiry": "Մարման ժամկետ.",
        "ipbreason": "Պատճառ.",
        "ipbreason-dropdown": "*Արգելափակման սովորական պատճառներ\n** Կեղծ տեղեկությունների ներմուծում\n** Էջերից նյութերի հեռացում\n** Արտաքին կայքերին հղումների սպամ\n** Անիմաստ/անկապ տեքստի ներմուծում էջերում\n** Վարկաբեկող/ահաբեկող պահվածք\n** Բազմաթիվ մասնակցային հաշիվների չարաշահում\n** Անպատշաճ մասնակցի անուն",
+       "ipb-hardblock": "Արգելել գրանցված մասնակիցներին խմբագրել այս IP-հասցեից",
        "ipbcreateaccount": "Կանխարգելել մասնակցային հաշվի ստեղծումը",
        "ipbemailban": "Կանխարգելել մասնակցի կողմից էլ-նամակների ուղարկումը",
-       "ipbenableautoblock": "Ավտոմատիկ արգելափակել այս մասնակցի վերջին IP-հասցեն և բոլոր հետագա IP-հասցեները, որոնցից նա կփորձի խմբագրումներ կատարել",
+       "ipbenableautoblock": "Ավտոմատ արգելափակել այս մասնակցի վերջին IP-հասցեն և բոլոր հետագա IP-հասցեները, որոնցից նա կփորձի խմբագրումներ կատարել",
        "ipbsubmit": "Արգելափակել այս մասնակցին",
        "ipbother": "Այլ ժամկետ.",
        "ipboptions": "2 ժամ:2 hours,1 օր:1 day,3 օր:3 days,1 շաբաթ:1 week,2 շաբաթ:2 weeks,1 ամիս:1 month,3 ամիս:3 months,6 ամիս:6 months,1 տարի:1 year,անժամկետ:infinite",
        "ipbhidename": "Թաքցնել մասնակցի անունը արգելափակման տեղեկամատյանից, գործող արգելափակումների ցանկից և մասնակիցների ցանկից։",
+       "ipbwatchuser": "Մասնակցի էջն ու քննարկման էջն ավելացնել հսկացանկում",
+       "ipb-disableusertalk": "Արգելել մասնակցին խմբագրել իր քննարկման էջն արգելափակման ընթացքում",
        "badipaddress": "Սխալ IP-հասցե",
        "blockipsuccesssub": "Արգելափակումը կատարված է",
        "blockipsuccesstext": "[[Special:Contributions/$1|«$1»]] արգելափակված է։\n<br />Տես [[Special:BlockList|արգելափակված IP-հասցեների ցանկը]]։",
        "blocklist": "Արգելափակված մասնակիցներ։",
        "ipblocklist": "Արգելափակված IP-հասցեները և մասնակիցները",
        "ipblocklist-legend": "Արգելափակված մասնակցի որոնում",
+       "blocklist-expiry": "Լրանում է",
        "ipblocklist-submit": "Որոնել",
        "infiniteblock": "ընդմիշտ",
        "expiringblock": "կմարվի $1 $2",
index 9814fea..69ad3b6 100644 (file)
@@ -48,7 +48,8 @@
                        "Nemo bis",
                        "Mbrt",
                        "Beeyan",
-                       "Bonaditya"
+                       "Bonaditya",
+                       "Irus"
                ]
        },
        "tog-underline": "Garis bawahi pranala:",
        "category-file-count-limited": "Kategori ini memiliki {{PLURAL:$1|$1 berkas}} berikut.",
        "listingcontinuesabbrev": "samb.",
        "index-category": "Halaman yang diindeks",
-       "noindex-category": "Halaman yang tidak diindeks",
+       "noindex-category": "Halaman yang diindeks",
        "broken-file-category": "Halaman dengan gambar rusak",
        "categoryviewer-pagedlinks": "($1) ($2)",
        "about": "Tentang",
        "talk": "Pembicaraan",
        "views": "Tampilan",
        "toolbox": "Perkakas",
+       "tool-link-userrights": "Simpan kelompok {{GENDER:$1|pengguna}}",
+       "tool-link-emailuser": "Kirim surel ke {{GENDER:$1|pengguna}} ini",
        "userpage": "Lihat halaman pengguna",
        "projectpage": "Lihat halaman proyek",
        "imagepage": "Lihat halaman berkas",
        "createacct-yourpasswordagain-ph": "Masukkan lagi kata sandi",
        "userlogin-remembermypassword": "Biarkan saya tetap masuk",
        "userlogin-signwithsecure": "Gunakan server aman",
+       "cannotlogin-title": "Tidak dapat masuk",
+       "cannotlogin-text": "Login ini tidak mungkin.",
        "cannotloginnow-title": "Tidak dapat masuk log saat ini",
        "cannotloginnow-text": "Masuk log tidak memungkinkan ketika menggunakan $1.",
+       "cannotcreateaccount-title": "Akun tak dapat dibuat",
+       "cannotcreateaccount-text": "Menetapkan account langsung tidak diaktifkan pada wiki ini.",
        "yourdomainname": "Domain Anda:",
        "password-change-forbidden": "Anda tidak dapat mengubah kata sandi pada wiki ini.",
        "externaldberror": "Telah terjadi kesalahan otentikasi basis data eksternal atau Anda tidak diizinkan melakukan kemaskini terhadap akun eksternal Anda.",
        "searchprofile-advanced-tooltip": "Pencarian di ruang nama tertentu",
        "search-result-size": "$1 ({{PLURAL:$2|$2 kata}})",
        "search-result-category-size": "{{PLURAL:$1|1 anggota|$1 anggota}} ({{PLURAL:$2|1 subkategori|$2 subkategori}}, {{PLURAL:$3|1 berkas|$3 berkas}})",
-       "search-redirect": "(pengalihan $1)",
+       "search-redirect": "(Dialihkan dari $1)",
        "search-section": "(bagian $1)",
        "search-category": "(kategori $1)",
        "search-file-match": "(cocok dengan isi berkas)",
        "rightslogtext": "Di bawah ini adalah log perubahan terhadap hak-hak pengguna.",
        "action-read": "membaca halaman ini",
        "action-edit": "menyunting halaman ini",
-       "action-createpage": "membuat halaman baru",
-       "action-createtalk": "membuat halaman pembicaraan baru",
+       "action-createpage": "Membuat halaman ini",
+       "action-createtalk": "Membuat halaman diskusi ini",
        "action-createaccount": "membuat akun pengguna ini",
        "action-autocreateaccount": "buat otomatis akun pengguna luar",
        "action-history": "lihat riwayat halaman ini",
        "upload-http-error": "Kesalahan HTTP terjadi: $1",
        "upload-copy-upload-invalid-domain": "Unggahan salinan tidak tersedia dari domain ini.",
        "upload-foreign-cant-upload": "Wiki ini tidak diatur untuk mengunggah berkas ke gudang penyimpangan asing.",
+       "upload-dialog-disabled": "Upload file menggunakan dialog ini dinonaktifkan pada wiki ini.",
        "upload-dialog-title": "Unggah berkas",
        "upload-dialog-button-cancel": "Batalkan",
        "upload-dialog-button-done": "Selesai",
        "activeusers-intro": "Berikut adalah daftar pengguna yang memiliki suatu bentuk aktivitas selama paling tidak $1 {{PLURAL:$1|hari|hari}} terakhir.",
        "activeusers-count": "$1 {{PLURAL:$1|aktivitas|aktivitas}} dalam {{PLURAL:$3|1 hari|$3 hari}} terakhir",
        "activeusers-from": "Tampilkan pengguna mulai dari:",
-       "activeusers-hidebots": "Sembunyikan bot",
-       "activeusers-hidesysops": "Sembunyikan pengurus",
        "activeusers-noresult": "Pengguna tidak ditemukan.",
        "activeusers-submit": "Tampilkan pengguna aktif",
        "listgrouprights": "Daftar hak kelompok",
index 72b105d..8831843 100644 (file)
        "botpasswords-label-delete": "Cancella",
        "botpasswords-label-resetpassword": "Reimposta la password",
        "botpasswords-label-grants": "Assegnazioni applicabili:",
-       "botpasswords-help-grants": "Ogni assegnazione dà accesso ai diritti utente elencati che un'utenza ha già. Vedi la [[Special:ListGrants|tabella delle assegnazioni]] per ulteriori informazioni.",
+       "botpasswords-help-grants": "Le assegnazioni consentono l'accesso a diritti che la tua utenza possiede già. Attivare un'assegnazione qui non fornisce l'accesso ad alcun diritto che la tua utenza altrimenti non avrebbe. Vedi la [[Special:ListGrants|tabella delle assegnazioni]] per ulteriori informazioni.",
        "botpasswords-label-grants-column": "Assegnazioni",
        "botpasswords-bad-appid": "Il nome bot \"$1\" non è valido.",
        "botpasswords-insert-failed": "Impossibile aggiungere il nome bot \"$1\". È stato già aggiunto?",
        "grant-basic": "Diritti di base",
        "grant-viewdeleted": "Vede i file e le pagine cancellati",
        "grant-viewmywatchlist": "Vede i tuoi osservati speciali",
+       "grant-viewrestrictedlogs": "Vedi valori privati del registro",
        "newuserlogpage": "Nuovi utenti",
        "newuserlogpagetext": "Di seguito sono elencate le utenze di nuova creazione.",
        "rightslog": "Diritti degli utenti",
        "booksources-search": "Cerca",
        "booksources-text": "Di seguito sono elencati alcuni collegamenti verso siti esterni che vendono libri nuovi e usati, attraverso i quali è possibile ottenere maggiori informazioni sul testo cercato.",
        "booksources-invalid-isbn": "L'ISBN inserito sembra non essere valido; verificare che non siano stati commessi errori nel copiarlo dalla fonte originale.",
+       "magiclink-tracking-rfc": "Pagine che utilizzano collegamenti magici RFC",
+       "magiclink-tracking-rfc-desc": "Questa pagina utilizza collegamenti magici RFC. Vedi [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] su come eseguire la migrazione.",
+       "magiclink-tracking-pmid": "Pagine che utilizzano collegamenti magici PMID",
+       "magiclink-tracking-pmid-desc": "Questa pagina utilizza collegamenti magici PMID. Vedi [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] su come eseguire la migrazione.",
+       "magiclink-tracking-isbn": "Pagine che utilizzano collegamenti magici ISBN",
+       "magiclink-tracking-isbn-desc": "Questa pagina utilizza collegamenti magici ISBN. Vedi [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] su come eseguire la migrazione.",
        "specialloguserlabel": "Azione effettuata da:",
        "speciallogtitlelabel": "Azione effettuata su (titolo della pagina o {{ns:user}}:Nome utente):",
        "log": "Registri",
        "listusers-noresult": "Nessun utente risponde ai criteri impostati.",
        "listusers-blocked": "(bloccato)",
        "activeusers": "Elenco degli utenti attivi",
-       "activeusers-intro": "Questo è un elenco di utenti che hanno avuto qualche tipo di attività da $1 {{PLURAL:$1|giorno|giorni}} a questa parte.",
+       "activeusers-intro": "Questo è un elenco di utenti che hanno avuto qualche tipo di attività {{PLURAL:$1|nell'ultimo giorno|negli ultimi $1 giorni}}.",
        "activeusers-count": "$1 {{PLURAL:$1|azione|azioni}} {{PLURAL:$3|nell'ultimo giorno|negli ultimi $3 giorni}}",
        "activeusers-from": "Mostra gli utenti a partire da:",
-       "activeusers-hidebots": "Nascondi i bot",
-       "activeusers-hidesysops": "Nascondi gli amministratori",
+       "activeusers-groups": "Visualizza gli utenti appartenenti ai gruppi:",
        "activeusers-noresult": "Nessun utente risponde ai criteri impostati.",
        "activeusers-submit": "Mostra utenti attivi",
        "listgrouprights": "Diritti del gruppo utente",
        "modifiedarticleprotection": "ha modificato il livello di protezione di \"[[$1]]\"",
        "unprotectedarticle": "ha sprotetto \"[[$1]]\"",
        "movedarticleprotection": "ha spostato la protezione da \"[[$2]]\" a \"[[$1]]\"",
+       "protectedarticle-comment": "{{GENDER:$2|Protetto}} \"[[$1]]\"",
+       "modifiedarticleprotection-comment": "{{GENDER:$2|Modificato il livello di protezione}} per \"[[$1]]\"",
+       "unprotectedarticle-comment": "{{GENDER:$2|Rimossa la protezione}} da \"[[$1]]\"",
        "protect-title": "Modifica del livello di protezione per \"$1\"",
        "protect-title-notallowed": "Visualizza il livello di protezione di \" $1 \"",
        "prot_1movedto2": "ha spostato [[$1]] a [[$2]]",
        "authmanager-authn-autocreate-failed": "Creazione automatica di un'utenza locale fallita: $1",
        "authmanager-change-not-supported": "Le credenziali fornite non possono essere modificate, dato che non verrebbero usate da nulla.",
        "authmanager-create-disabled": "La creazione di utenze è disabilitata.",
-       "authmanager-create-from-login": "Per creare la tua utenza, completa i campi qui sotto.",
+       "authmanager-create-from-login": "Per creare la tua utenza, completa i campi.",
        "authmanager-create-not-in-progress": "La creazione di un'utenza non è in corso o i dati della sessione sono andati persi. Si prega di ricominciare nuovamente dall'inizio.",
        "authmanager-create-no-primary": "Le credenziali fornite non possono essere utilizzate per la creazione dell'utenza.",
        "authmanager-link-no-primary": "Le credenziali fornite non possono essere utilizzate per il collegamento dell'utenza.",
index 2300869..27fe191 100644 (file)
@@ -72,7 +72,8 @@
                        "Shield-9",
                        "Waiesu",
                        "Matma Rex",
-                       "組曲師"
+                       "組曲師",
+                       "Foresttttttt"
                ]
        },
        "tog-underline": "リンクの下線:",
        "right-deletechangetags": "データベースから[[Special:Tags|タグ]]を削除します",
        "grant-group-email": "メールの送信",
        "grant-group-customization": "カスタマイズと個人設定",
+       "grant-group-private-information": "君の個人情報にアクセスする。",
        "grant-group-other": "その他の活動",
        "grant-blockusers": "利用者をブロックおよびブロック解除",
        "grant-createaccount": "アカウントを作成",
        "activeusers-intro": "これは過去 $1 {{PLURAL:$1|日|日間}}に何らかの活動をした利用者の一覧です。",
        "activeusers-count": "過去 {{PLURAL:$3|1 日|$3 日間}}に $1 {{PLURAL:$1|回の操作}}",
        "activeusers-from": "最初に表示する利用者:",
-       "activeusers-hidebots": "ボットを隠す",
-       "activeusers-hidesysops": "管理者を隠す",
        "activeusers-noresult": "利用者が見つかりませんでした。",
        "activeusers-submit": "活動中の利用者を表示",
        "listgrouprights": "利用者グループの権限",
        "confirmdeletetext": "ページをすべての履歴とともに削除しようとしています。\n本当にこの操作を行いたいか、操作の結果を理解しているか、およびこの操作が[[{{MediaWiki:Policy-url}}|方針]]に従っているかどうか、確認してください。",
        "actioncomplete": "操作を完了しました",
        "actionfailed": "操作に失敗しました",
-       "deletedtext": "ã\80\8c$1ã\80\8dã\81¯å\89\8aé\99¤ã\81\95ã\82\8cã\81¾ã\81\97ã\81\9fã\80\82\næ\9c\80è¿\91ã\81®å\89\8aé\99¤ã\81«ã\81¤ã\81\84ã\81¦ã\81¯ã\80\81$2ã\82\92å\8f\82ç\85§ã\81\97ã\81¦ã\81\8fã\81 ã\81\95ã\81\84。",
+       "deletedtext": "ã\80\8c$1ã\80\8dã\81¯å\89\8aé\99¤ã\81\95ã\82\8cã\81¾ã\81\97ã\81\9fã\80\82\næ\9c\80è¿\91ã\81®å\89\8aé\99¤ã\81¯$2ã\81§å\8f\82ç\85§ã\81§ã\81\8dã\81¾ã\81\99。",
        "dellogpage": "削除記録",
        "dellogpagetext": "以下は最近の削除と復元の一覧です。",
        "deletionlog": "削除記録",
        "undeletedrevisions-files": "{{PLURAL:$1|$1版}}と{{PLURAL:$2|$2ファイル}}を復元しました",
        "undeletedfiles": "{{PLURAL:$1|$1ファイル}}を復元しました",
        "cannotundelete": "復元に一部またはすべて失敗しました:\n$1",
-       "undeletedpage": "<strong>$1を復元しました。</strong>\n\n最近の削除と復元の記録については[[Special:Log/delete|削除記録]]を参照してください。",
+       "undeletedpage": "<strong>$1 を復元しました。</strong>\n\n最近の削除と復元は[[Special:Log/delete|削除記録]]で参照できます。",
        "undelete-header": "最近削除されたページは[[Special:Log/delete|削除記録]]で確認できます。",
        "undelete-search-title": "削除されたページの検索",
        "undelete-search-box": "削除されたページの検索",
        "revertmove": "差し戻し",
        "delete_and_move_text": "移動先「[[:$1]]」は既に存在します。\n移動のためにこのページを削除しますか?",
        "delete_and_move_confirm": "はい、ページを削除します",
-       "delete_and_move_reason": "ã\80\8c[[$1]]ã\80\8dã\81\8bã\82\89ã\81®ç§»å\8b\95ã\81®ã\81\9fã\82\81ã\81«削除",
+       "delete_and_move_reason": "ã\80\8c[[$1]]ã\80\8dã\81\8bã\82\89ã\81®ç§»å\8b\95ã\81«ä¼´ã\81\86削除",
        "selfmove": "移動元と移動先のページ名が同じです。\n自分自身には移動できません。",
        "immobile-source-namespace": "「$1」名前空間のページは移動できません",
        "immobile-target-namespace": "「$1」名前空間にはページを移動できません",
        "pageinfo-article-id": "ページ ID",
        "pageinfo-language": "ページ本文の言語",
        "pageinfo-content-model": "ページのコンテンツ モデル",
+       "pageinfo-content-model-change": "設定変更",
        "pageinfo-robot-policy": "ロボットによるインデックス作成",
        "pageinfo-robot-index": "許可",
        "pageinfo-robot-noindex": "不許可",
        "htmlform-date-placeholder": "YYYY-MM-DD",
        "htmlform-time-placeholder": "HH:MM:SS",
        "htmlform-datetime-placeholder": "YYYY-MM-DD HH:MM:SS",
+       "htmlform-date-invalid": "君が入力した値は識別できない日付です。YYYY-MM-DD形式で試してください。",
        "htmlform-title-badnamespace": "[[:$1]]は、\"{{ns:$2}}\"名前空間にありません。",
        "htmlform-title-not-creatable": "\"$1\" は、作成可能なページ名では、ありません。",
        "htmlform-title-not-exists": "$1 は存在しません。",
        "usercssispublic": "注意: CSS のサブページは第三者が閲覧可能なため、機微な情報を含めないでください。",
        "restrictionsfield-badip": "無効な IP アドレス、またはその範囲: $1",
        "restrictionsfield-label": "許可する IP の範囲:",
-       "restrictionsfield-help": "一行につき、単一の IP アドレス、もしくは CIDR による範囲。全帯域からの接続を許可する場合は<br><code>0.0.0.0/0</code><br><code>::/0</code>"
+       "restrictionsfield-help": "一行につき、単一の IP アドレス、もしくは CIDR による範囲。全帯域からの接続を許可する場合は<br><code>0.0.0.0/0</code><br><code>::/0</code>",
+       "edit-error-short": "エラー: $1",
+       "edit-error-long": "エラー:\n\n\n\n$1"
 }
index 29bd82d..c464d50 100644 (file)
        "gotaccount": "Бұған дейін тіркеліп пе едіңіз? '''$1'''.",
        "gotaccountlink": "Кіріңіз",
        "userlogin-resetlink": "Қатысушы атын не құпия сөзді ұмыттыңыз ба?",
-       "userlogin-resetpassword-link": "Құпия сөздіңізді ұмыттыңыз ба?",
+       "userlogin-resetpassword-link": "Құпия сөзіңізді ұмыттыңыз ба?",
        "userlogin-helplink2": "Кіруге көмек",
        "userlogin-loggedin": "{{GENDER:$1|$1}} ретінде әлдеқашан кіргенсіз.\nТөмендегі пішінді басқа қатысушы кіруі ретінде қолданыңыз.",
        "userlogin-createanother": "Басқа тіркелгі жасау",
        "passwordtoopopular": "Көп жағдайда таңдалатын құпиясөзді қолдана алмайсыз. Басқа бірегей құпиясөз таңдаңыз.",
        "password-name-match": "Құпия сөзіңіз қатысушы атынан өзгеше болуы қажет.",
        "password-login-forbidden": "Бұл қатысушы аты мен құпия сөзін пайдалануға тыйым салынған.",
-       "mailmypassword": "Құпия сөзді қалпына кеттіру",
+       "mailmypassword": "Құпия сөзді қалпына келтіру",
        "passwordremindertitle": "{{SITENAME}} үшін жаңа уақытша құпия сөз",
        "passwordremindertext": "Біреу (IP мекенжайы: $1, бәлкім өзіңіз боларсыз) {{SITENAME}} жобасында жаңа құпия сөз жөнелету сұранымын жасаған ($4).\nҚатысушы «$2» үшін уақытша құпия сөз жасалды: «$3». Егер бұл сіздің сұранымыңыз болса қазір жүйеге кіріп жаңа құпия сөз таңдауыңыз керек. \nСіздің уақытша құпия сөзіңіз {{PLURAL:$5|бір күнге|$5 күнге}} дейін белсенді болады.\n\nЕгер бұл сұранымды басқа біреу жасаса, не құпия сөздіңізді еске түсіріп енді өзгерткіңіз келмесе ескі құпия сөзді қолдануды жалғастырып осы хатты елемеуіңізге да болады.",
        "noemail": "Осы арада жазылып алынған «$1» қатысушының е-пошта мекенжайы жоқ.",
        "botpasswords-label-update": "Жаңарту",
        "botpasswords-label-cancel": "Болдырмау",
        "botpasswords-label-delete": "Жою",
-       "botpasswords-label-resetpassword": "Құпия сөзді қалпына кеттіру",
+       "botpasswords-label-resetpassword": "Құпия сөзді қалпына келтіру",
        "botpasswords-label-grants": "Қолданылатын гранттар:",
        "botpasswords-bad-appid": "\"$1\" бот атауы жарамды емес.",
        "botpasswords-insert-failed": "\"$1\" бот атауын қосу орындалмады. Ол әлдеқашан қосылған ба еді?",
        "activeusers-intro": "Бұл соңғы $1 {{PLURAL:$1|күнде|күнде}} қандай да бір іс-әрекет жасаған қатысушылар тізімі.",
        "activeusers-count": "соңғы {{PLURAL:$3|күнде|$3 күнде}} $1 {{PLURAL:$1|әрекет|әрекет}}",
        "activeusers-from": "Мынадан басталатын қатысушыларды көрсет:",
-       "activeusers-hidebots": "Боттарды жасыру",
-       "activeusers-hidesysops": "Әкімшілерді жасыру",
        "activeusers-noresult": "Қатысушылар табылған жоқ.",
        "activeusers-submit": "Белсенді қатысушыларды көрсету",
        "listgrouprights": "Қатысушы тобы құқықтары",
index bc06966..02c14f6 100644 (file)
        "activeusers-intro": "다음은 최근 $1{{PLURAL:$1|일}} 동안 활동한 사용자의 목록입니다.",
        "activeusers-count": "마지막 {{PLURAL:$3|$3일}} 사이의 {{PLURAL:$1|활동}} $1회",
        "activeusers-from": "다음으로 시작하는 사용자를 보기:",
-       "activeusers-hidebots": "봇을 숨기기",
-       "activeusers-hidesysops": "관리자를 숨기기",
+       "activeusers-groups": "그룹에 속한 사용자 표시:",
        "activeusers-noresult": "사용자를 찾을 수 없습니다.",
        "activeusers-submit": "활동하고 있는 사용자 보이기",
        "listgrouprights": "사용자 권한 목록",
        "newimages-showbots": "봇이 올린 것 보기",
        "newimages-hidepatrolled": "점검한 업로드 숨기기",
        "noimages": "그림이 없습니다.",
+       "gallery-slideshow-toggle": "섬네일 토글",
        "ilsubmit": "검색",
        "bydate": "날짜",
        "sp-newimages-showfrom": "$1 $2부터 시작하는 새 파일 보기",
        "dberr-again": "잠시 기다리고 나서 다시 불러오세요.",
        "dberr-info": "(데이터베이스 서버에 연결할 수 없습니다: $1)",
        "dberr-info-hidden": "(데이터베이스 서버에 연결할 수 없습니다)",
-       "dberr-usegoogle": "그동안 Google을 통해 검색할 수도 있습니다.",
+       "dberr-usegoogle": "잠시 동안 Google을 통해 검색해볼 수 있습니다.",
        "dberr-outofdate": "수집된 내용은 오래된 것일 수도 있음을 참고하세요.",
        "dberr-cachederror": "다음은 요청한 문서의 캐시된 복사본이며, 최신이 아닐 수도 있습니다.",
        "htmlform-invalid-input": "입력한 값에 문제가 있습니다.",
        "authmanager-authn-autocreate-failed": "로컬 계정 자동 생성 실패: $1",
        "authmanager-change-not-supported": "지정된 자격 증명을 사용하고 있는 곳이 없어서 변경할 수 없습니다.",
        "authmanager-create-disabled": "계정 만들기가 금지되어 있습니다.",
-       "authmanager-create-from-login": "ê³\84ì \95ì\9d\84 ë§\8cë\93\9c려면, ì\95\84ë\9e\98ì\9d\98 ì¹¸ë\93¤ì\9d\84 ì±\84ì\9b\8c ì£¼ì\8b­ì\8b\9cì\98¤.",
+       "authmanager-create-from-login": "계정을 만드려면, 칸들을 채워 주십시오.",
        "authmanager-create-not-in-progress": "계정 만들기가 진행 중이 아니거나 세션 데이터를 분실했습니다. 처음부터 다시 시작해 주십시오.",
        "authmanager-create-no-primary": "제공된 자격 증명은 계정 생성에 쓰일 수 없습니다.",
        "authmanager-link-no-primary": "제공된 자격 증명은 계정을 연결하는 데 쓰일 수 없습니다.",
index 0d7d482..8b2d94f 100644 (file)
@@ -15,7 +15,8 @@
                        "아라",
                        "Askar Nazyrov",
                        "Macofe",
-                       "Janatkg"
+                       "Janatkg",
+                       "Irus"
                ]
        },
        "tog-underline": "Шилтемелердин алдын сызуу:",
        "privacypage": "Project:Купуялуулук саясаты",
        "badaccess": "Кирүү катасы",
        "badaccess-group0": "Сиз сураган аракетти аткара албайсыз.",
+       "badaccess-groups": "Аракети сиз запросили поциент нарын {{PLURAL:$2|топ|бир топтор}}: $1.",
        "versionrequired": "MediaWiki'нин $1 версиясы керек",
        "versionrequiredtext": "Бул барак менен иштөө үчүн MediaWiki $1 версиясы талап кылынат. Кара.[[Special:Version|version page]].",
        "ok": "OK",
        "nstab-template": "Калып",
        "nstab-help": "Жардам",
        "nstab-category": "Категория",
+       "mainpage-nstab": "Башбарак",
        "nosuchaction": "Мындай аракет жок",
        "nosuchspecialpage": "Мындай кызматтык барак жок",
        "error": "Ката",
        "yourpasswordagain": "Сырсөздү кайра терүү:",
        "createacct-yourpasswordagain": "Сырсөздү тастыктаңыз",
        "createacct-yourpasswordagain-ph": "Сырсөздү кайрадан териңиз",
-       "remembermypassword": "Бул браузерде колдонуучу атымды ($1 {{PLURAL:$1|күнгө}} чейин сактоо)",
        "userlogin-remembermypassword": "Мени системге кирген боюнча калтыр",
        "userlogin-signwithsecure": "Коопсуз байланышты колдонуу",
        "yourdomainname": "Сиздин домен:",
        "grouppage-suppress": "{{ns:project}}:Ревизорлор",
        "right-read": "барактарды карап чыгуу",
        "right-edit": "Барактарды оңдоо",
+       "right-createpage": "Түзүү барактан (талкуулоо жок талкуулоо)",
+       "right-createtalk": "Түзүү бет талкуулоо",
+       "right-createaccount": "Түзүүгө, жаңы эсепке алуу жазуулары пайдалануучулардын",
        "right-move": "барактардын атын өзгөртүү",
        "right-move-rootuserpages": "катышуучулардын түпкү барактарынын атын өзгөртүү",
        "right-movefile": "файлдардын атын өзгөртүү",
        "right-upload": "Файлдарды жүктөө",
        "right-reupload": "Бар болгон файлдардын үстүнөн жаздыруу",
+       "right-writeapi": "Пайдалануу API үчүн жазуу",
        "right-delete": "Барактарды өчүрүү",
        "right-browsearchive": "Өчүрүлгөн барактарды издөө",
        "right-suppressionlog": "Жеке журналдарды көрүү",
        "action-createtalk": "талкуулоо барагын түзүү",
        "action-createaccount": "бул эсеп жазуусун түзүү",
        "action-upload": "бул файлды жүктөө",
+       "action-writeapi": "пайдалануу API үчүн жазуу",
        "action-delete": "бул баракты өчүрүү",
        "action-suppressionlog": "бул жеке журналды көрүү",
        "action-userrights": "бүткүл колдонуучулардын укуктарын оңдоо",
        "listusers-noresult": "Колдонуучу табылган жок.",
        "listusers-blocked": "(бөгөттөлгөн)",
        "activeusers": "Активдүү колдонуучулардын тизмеси",
-       "activeusers-hidebots": "Ботторду жашыруу",
-       "activeusers-hidesysops": "Администраторлорду жашыруу",
        "activeusers-noresult": "Колдонуучулар табылган жок.",
        "listgrouprights-group": "Топ",
        "listgrouprights-rights": "Укуктар",
index 261c400..8857967 100644 (file)
        "changeemail-no-info": "Dir musst ageloggt sinn, fir direkt op dës Säit ze kommen.",
        "changeemail-oldemail": "Aktuell Mailadress:",
        "changeemail-newemail": "Nei Mailadress:",
+       "changeemail-newemail-help": "Dëst Feld soll eidel gelooss gi wann Dir Är E-Mailadress ewechhuele wëllt. Dir kënnt d'Passwuert net zrécksetze wann Dir et vergiess hutt an Dir kritt och keng E-Maile vun dëser Wiki esoubal d'E-Mailadress ewechgeholl gouf.",
        "changeemail-none": "(keng)",
        "changeemail-password": "Äert {{SITENAME}}-Passwuert:",
        "changeemail-submit": "Mailadress änneren",
        "permissionserrors": "Net genuch Rechter",
        "permissionserrorstext": "Dir hutt net genuch Rechter fir déi Aktioun auszeféieren. {{PLURAL:$1|Grond|Grënn}}:",
        "permissionserrorstext-withaction": "Dir sidd, aus {{PLURAL:$1|dësem Grond|dëse Grënn}}, net berechtegt $2 :",
+       "contentmodelediterror": "Dir kënnt dës Versioun net ännere well hiren Inhaltsmodell <code>$1</code> ass dee verschidde vum aktuellen Inhaltsmodell vun der Säit <code>$2</code> ass.",
        "recreate-moveddeleted-warn": "'''Opgepasst: Dir sidd am Gaang eng Säit unzeleeën déi schonn eng Kéier geläscht gouf.'''\n\nFrot Iech ob et wierklech sënnvoll ass dës Säit nees nei ze schafen.\nFir Iech z'informéieren fannt Dir hei d'Logbuch vum Läsche mam Grond:",
        "moveddeleted-notice": "Dës Säit gouf geläscht.\nHei ass den Extrait aus dem Logbuch vum Réckelen a Läsche fir déi Säit.",
        "moveddeleted-notice-recent": "Leider gouf dëse Säit rezent (bannent de leschte 24 Stonnen) geläscht. D'Logbuch vum Läschen a Réckele vun dëser Säit fannt Dir fir Ar Informatioun hei drënner.",
        "history-feed-description": "Versiounshistorique fir dës Säit op der Wiki",
        "history-feed-item-nocomment": "$1 ëm $2",
        "history-feed-empty": "Déi ugefrote Säit gëtt et net.\nVläicht gouf se geläscht oder geréckelt.\n[[Special:Search|Sicht]] op {{SITENAME}} no relevanten neie Säiten.",
+       "history-edit-tags": "Markéierungen (tags) vun den erausgesichte Versiounen änneren",
        "rev-deleted-comment": "(Resumé vun der Ännerung ewechgeholl)",
        "rev-deleted-user": "(Benotzernumm ewechgeholl)",
        "rev-deleted-event": "(Detailer aus dem Logbuch erausgeholl)",
        "upload-form-label-own-work": "Dëst ass mäin eegent Wierk",
        "upload-form-label-infoform-categories": "Kategorien",
        "upload-form-label-infoform-date": "Datum",
+       "upload-form-label-own-work-message-generic-local": "Ech confirméieren datt ech dëse Fichier ënner dëse Bedingungen a Lizenz-Richtlinnen op {{SITENAME}} eroplueden.",
+       "upload-form-label-not-own-work-message-generic-local": "Wann Dir dëse Fichier net ënner de Richtlinne vu(n) {{SITENAME}} eropluede kënnt da maacht w.e.g. dësen Dialog zou a probéiert eng aner Method.",
        "upload-form-label-not-own-work-local-generic-local": "Dir kënnt och [[Special:Upload|d'Standardsäit vum Eroplueden]] ausprobéieren.",
        "backend-fail-stream": "De Fichier $1 konnt net iwwerdroe ginn.",
        "backend-fail-backup": "De Fichier $1 konnt net geséchert ginn.",
        "apisandbox-submit": "Ufro maachen",
        "apisandbox-reset": "Eidel maachen",
        "apisandbox-retry": "Nach eng Kéier probéieren",
+       "apisandbox-loading": "Informatioune fir den API-Modul \"$1\" gi gelueden ...",
        "apisandbox-no-parameters": "Dësen API-Modul huet keng Parameteren.",
        "apisandbox-helpurls": "Hëllef-Linken",
        "apisandbox-examples": "Beispiller",
        "apisandbox-dynamic-error-exists": "Et gëtt schonn e Parameter mam Numm \"$1\".",
        "apisandbox-deprecated-parameters": "Vereelst Parameter",
        "apisandbox-submit-invalid-fields-title": "E puer Felder sinn net valabel.",
+       "apisandbox-submit-invalid-fields-message": "Verbessert w.e.g. déi markéiert Felder a probéiert nach eng Kéier.",
        "apisandbox-results": "Resultater",
        "apisandbox-sending-request": "Schécke vun der API-Ufro...",
        "apisandbox-loading-results": "Ofruffe vun den API-Resultater...",
        "booksources-search": "Sichen",
        "booksources-text": "Hei ass eng Lëscht mat Linken op Internetsäiten, déi nei a gebraucht Bicher verkafen. Do kann et sinn datt Dir méi Informatiounen iwwer déi Bicher fannt déi Dir sicht.",
        "booksources-invalid-isbn": "D'ISBN-Nummer déi Dir uginn hutt schéngt net gëlteg ze sinn. Kuckt w.e.g. no ob beim Kopéiere kee Feeler geschitt ass.",
+       "magiclink-tracking-rfc": "Säiten, déi magesch RFC-Linke benotzen.",
+       "magiclink-tracking-rfc-desc": "Dës Säit benotzt magesch RFC-Linken. Kuckt [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] fir d'Migratioun.",
+       "magiclink-tracking-pmid": "Säiten, déi magesch PMID-Linke benotzen.",
+       "magiclink-tracking-pmid-desc": "Dës Säit benotzt magesch PMID-Linken. Kuckt [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] fir d'Migratioun.",
+       "magiclink-tracking-isbn": "Säiten, déi magesch ISBN-Linke benotzen.",
+       "magiclink-tracking-isbn-desc": "Dës Säit benotzt magesch ISBN-Linken. Kuckt [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] fir d'Migratioun.",
        "specialloguserlabel": "Aktive Benotzer:",
        "speciallogtitlelabel": "Zil (Titel oder {{ns:user}}:Benotzernumm fir e Benotzer):",
        "log": "Logbicher",
        "activeusers-intro": "Dëst ass eng Lëscht vun de Benotzer déi op iergend eng Manéier an de leschten $1 {{PLURAL:$1|Dag|Deeg}} aktiv waren.",
        "activeusers-count": "$1 {{PLURAL:$1|Aktioun|Aktiounen}} {{PLURAL:$3|gëschter|an de leschten $3 Deeg}}",
        "activeusers-from": "Benotzer weisen, ugefaange bei:",
-       "activeusers-hidebots": "Botte verstoppen",
-       "activeusers-hidesysops": "Administrateure verstoppen",
+       "activeusers-groups": "Benotzer weisen déi zu de Gruppe gehéieren:",
        "activeusers-noresult": "Keng Benotzer fonnt.",
        "activeusers-submit": "Aktiv Benotzer weisen",
        "listgrouprights": "Rechter vun de Benotzergruppen",
        "modifiedarticleprotection": "huet d'Protektioun vun \"[[$1]]\" geännert",
        "unprotectedarticle": "huet d'Spär vu(n) \"[[$1]]\" opgehuewen",
        "movedarticleprotection": "huet de Säiteschutz vun \"[[$2]]\" op \"[[$1]]\" geännert",
+       "protectedarticle-comment": "huet \"[[$1]]\" {{GENDER:$2|gespaart}}",
        "protect-title": "Ännerung vun der Protektioun vu(n) „$1“",
        "protect-title-notallowed": "Den Niveau vun der Protektioun vu(n) \"$1\" weisen",
        "prot_1movedto2": "[[$1]] gouf op [[$2]] geréckelt",
        "block-log-flags-hiddenname": "Benotzernumm verstoppt",
        "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_old": "Oflafzäit ass an der Vergaangenheet.",
        "ipb_expiry_temp": "Verstoppt Späre vu Benotzernimm solle permanent sinn.",
        "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.",
        "movelogpagetext": "Dëst ass eng Lëscht vun alle geréckelte Säiten.",
        "movesubpage": "{{PLURAL:$1|Ënnersäit|Ënnersäiten}}",
        "movesubpagetext": "Dës Säit huet $1 {{PLURAL:$1|Ënnersäit|Ënnersäiten}} déi hei ënnendrënner stinn.",
+       "movesubpagetalktext": "D'Diskussiounssäit déi dozou gehéiert huet $1 {{PLURAL:$1|Ënnersäit|Ënnersäiten}} déi hei ënnendrënner stinn.",
        "movenosubpage": "Dës Säit huet keng Ënnersäiten.",
        "movereason": "Grond:",
        "revertmove": "zréck réckelen",
        "invalidateemail": "Annulléier d'E-Mailconfirmation",
        "notificationemail_subject_changed": "D'E-Mail-Adress déi op {{SITENAME}} enregistréiert war gouf geännert",
        "notificationemail_subject_removed": "D'E-Mail-Adress déi op {{SITENAME}} enregistréiert war gouf ewechgeholl",
+       "notificationemail_body_changed": "Een, wahrscheinlech Dir, vun der IP-Adress $1, huet d'E-Mailadress vum Benotzerkont \"$2\" opm\"$3\" op {{SITENAME}} geännert.",
        "scarytranscludedisabled": "[Interwiki-Abannung ass ausgeschalt]",
        "scarytranscludefailed": "[D'Siche no der Schabloun fir $1 huet net funktionéiert]",
        "scarytranscludefailed-httpstatus": "[D'Opruffe vun der Schabloun $1: HTTP $2 huet net funktionéiert]",
        "tags-delete-explanation-initial": "Dir sidd am Gaang d'Markéierung (tag) \"$1\" aus der Datebank ze läschen.",
        "tags-delete-explanation-warning": "Dës Aktioun ass <strong>irreversibel</strong> a <strong>kann net réckgängeg gemaach ginn</strong>, net emol vun den Administrateure vun der Datebank. Sidd Iech sécher datt et dës Markéierung ass déi Dir läsche wëllt.",
        "tags-delete-reason": "Grond:",
+       "tags-delete-submit": "Dës Markéierung definitiv läschen",
        "tags-delete-not-found": "D'Markéierung (tag) ''$1'' gëtt et net.",
        "tags-activate-title": "Markéierung (tag) aktivéieren",
        "tags-activate-question": "Dir sidd am Gaang d'Markéierung \"$1\" z'aktivéieren.",
        "authprovider-confirmlink-failed": "Verbanne vum Benotzerkont huet net richteg geklappt: $1",
        "authprovider-resetpass-skip-label": "Iwwersprangen",
        "authprovider-resetpass-skip-help": "D'Zrécksetze vum Passwuert iwwersprangen",
+       "authform-nosession-signup": "De Benotzerkont gouf ugeluecht, awer Äre Browser kann net \"verhalen\" datt dir ageloggt sidd.\n\n$1",
        "authform-notoken": "Toke feelt",
        "authform-wrongtoken": "Falschen Token",
        "specialpage-securitylevel-not-allowed-title": "Net erlaabt",
        "specialpage-securitylevel-not-allowed": "Leider däerft Dir dës Säit net benotze well Är Identitéit net konnt iwwerpréift ginn.",
-       "cannotauth-not-allowed-title": "Erlaabnes refuséiert",
+       "cannotauth-not-allowed-title": "Autorisatioun refuséiert",
        "cannotauth-not-allowed": "Dir däerft dës Säit net benotzen",
        "changecredentials-submit": "Idendifikatiounsinformatiounen änneren",
        "changecredentials-success": "Är Idendifikatiounsinformatioune goufe geännert.",
        "removecredentials-submit": "Idendifikatiounsinformatiounen ewechhuelen",
+       "removecredentials-success": "Är Idendifikatiounsinformatioune goufen ewechgeholl.",
        "credentialsform-account": "Numm vum Kont:",
        "cannotlink-no-provider-title": "Et gëtt keng Benotzerkonte fir ze verlinken",
+       "cannotlink-no-provider": "Et gëtt keng Benotzerkonte fir ze verlinken.",
        "linkaccounts": "Benotzerkonte verbannen",
+       "linkaccounts-success-text": "De Benotzerkont gouf verlinkt.",
        "linkaccounts-submit": "Benotzerkonte verbannen",
        "userjsispublic": "DEnkt drun: Op JavaScript-Ënnersäite solle keng vertraulech Informatioune stoe well se vun anere Benotzer kënne gesi ginn.",
        "restrictionsfield-badip": "Net valabel IP-Adress oder Beräich: $1",
index 720810d..dd2620b 100644 (file)
        "eauthentsent": "Un messaggio e-mail de conferma o l'è stæto inviòu a l'addresso indicòu.\nPe abilitâ l'invîo de messaggi e-mail pe quest'utensa, se deve seguî e instrussioin indicæ, pe confermâ che ti t'ê o legittimo propietâio de l'utensa.",
        "throttled-mailpassword": "Un'e-mail de reimpostassione da poula segretta a l'è zà stæta inviâ da meno de {{PLURAL:$1|1 oa|$1 oe}}.\nPe prevegnî di abuxi, a fonsion de reimpostassion da poula segretta a peu vese deuviâ solo che 'na votta ogni {{PLURAL:$1|oa|$1 oe}}.",
        "mailerror": "Errô inte l'invio do messaggio: $1",
-       "acct_creation_throttle_hit": "{{PLURAL:$1|1 registraçion a l'è zà stæta effettuâ|$1 registraçioin son zà stæte effettuæ}} da quarcun co-o to mæximo addresso IP inte l'urtimo giorno: o l'è o mascimo consentio inte questo periodo de tempo.\nPerçò, i utenti ch'adeuvian sto addresso IP pe-o momento no peuan registrase.",
+       "acct_creation_throttle_hit": "{{PLURAL:$1|1 registraçion a l'è zà stæta effettoâ|$1 registraçioin son zà stæte effettoæ}} da quarcun co-o to mæximo adresso IP inti urtimi $2, ch'o l'è o mascimo consentio inte questo periodo de tempo.\nPerçò, i utenti ch'adoeuvian st'adresso IP pe-o momento no poeuan ciu registrâse.",
        "emailauthenticated": "O teu adresso e-mail o l'è stæto aotenticòu o $2 a $3.",
        "emailnotauthenticated": "L'adresso de posta elettronica o no l'è stæto ancon confermòu.\nNo saian inviæ messaggi e-mail pe-e funçioin elencæ chì de sotta.",
        "noemailprefs": "Pe attivâ ste fonçioin ti g'hæ da mette n'adresso e-mail inte preferençe.",
        "passwordreset-emailsentemail": "Se questo addresso de posta elettronnica o l'è associou a-a teu utença, alloa saiâ inviou un'e-mail pe rempostâ a poula segretta.",
        "passwordreset-emailsentusername": "Se gh'è un adreçço de posta elettronica associou con questo nomme utente, alloa saiâ inviou una email pe rempostâ a password.",
        "passwordreset-emailsent-capture2": "{{PLURAL:$1|L'|E }}e-mail de rempostaçion da password {{PLURAL:$1|a l'è stæta inviâ|son stæte inviæ}}. {{PLURAL:$1|O nomme|L'elenco di nommi}} utente e password o l'è mostrou chì.",
-       "passwordreset-emailerror-capture2": "Invio de email {{GENDER:$2|a l'utente}} non ariescio: $1. {{PLURAL:$3|O nomme|L'elenco di nommi}} utente e password o l'è mostrou chì de sotta.",
+       "passwordreset-emailerror-capture2": "Invio d'e-mail {{GENDER:$2|a l'utente}} non ariescio: $1. {{PLURAL:$3|O nomme|L'elenco di nommi}} utente e password o l'è mostrou chì de sotta.",
        "passwordreset-nocaller": "Un chi ciamma ti g'hæ da dâlo",
        "passwordreset-nosuchcaller": "O ciamante o no l'existe: $1",
        "passwordreset-ignored": "A reimpostaçion da password a no l'è stæta gestia. Foscia n'è stæto configuou nisciun provider ?",
        "activeusers-intro": "Questo o l'è un elenco di utenti ch'han avuo quarche tipo d'attivitæ da $1 {{PLURAL:$1|giorno|giorni}} a questa parte.",
        "activeusers-count": "$1 {{PLURAL:$1|açione|açioin}} {{PLURAL:$3|inte l'urtimo giorno|inti urtimi $3 giorni}}",
        "activeusers-from": "Mostra i utenti a partî da:",
-       "activeusers-hidebots": "Ascondi i bot",
-       "activeusers-hidesysops": "Ascondi i amministratoî",
        "activeusers-noresult": "Nisciun utente o risponde a-i critei impostæ.",
        "activeusers-submit": "Mostra utenti attivi",
        "listgrouprights": "Driti do groppo utente",
index 5998caf..1bc403e 100644 (file)
        "password-login-forbidden": "Šito naudotojo vardo ir slaptažodžio naudojimas yra uždraustas.",
        "mailmypassword": "Atkurti slaptažodį",
        "passwordremindertitle": "Laikinasis {{SITENAME}} slaptažodis",
-       "passwordremindertext": "Kažkas (tikriausiai jūs, IP adresu $1)\npaprašė, kad atsiųstumėte naują slaptažodį projektui {{SITENAME}} ($4).\nLaikinasis naudotojo „$2“ slaptažodis buvo sukurtas ir nustatytas į „$3“.\nJei tai buvo jūs, jūs turėtumėte prisijungti ir pasirinkti naują slaptažodį.\nJūsų laikinasis slaptažodis baigs galioti po {{PLURAL:$5|$5 dienos|$5 dienų|$5 dienų}}.\n\nJei kažkas kitas atliko šį prašymą arba jūs prisiminėte savo slaptažodį ir\nnebenorite jo pakeisti, galite tiesiog nekreipti dėmesio į šį laišką ir toliau\nnaudotis savo senuoju slaptažodžiu.",
+       "passwordremindertext": "Kažkas (tikriausiai jūs, iš IP adreso $1) paprašė atsiųsti naują slaptažodį paskyrai projekte {{SITENAME}} ($4).\nBuvo sukurtas laikinasis naudotojo „$2“ slaptažodis, kuris yra „$3“.\nJei to prašėte jūs, turėtumėte prisijungti ir pasirinkti naują slaptažodį.\nJūsų laikinasis slaptažodis baigs galioti po {{PLURAL:$5|$5 dienos|$5 dienų}}.\n\nJei priminti slaptažodį paprašė kažkas kitas arba jūs prisiminėte savo slaptažodį ir\nnebenorite jo pakeisti, galite tiesiog nekreipti dėmesio į šį laišką ir toliau\nnaudotis savo senuoju slaptažodžiu.",
        "noemail": "Nėra jokio el. pašto adreso įvesto naudotojui „$1“.",
        "noemailcreate": "Jūs turite nurodyti veikiantį el. pašto adresą",
        "passwordsent": "Naujas slaptažodis buvo nusiųstas į el. pašto adresą,\nužregistruotą naudotojo „$1“.\nPrašome prisijungti vėl, kai jūs jį gausite.",
        "passwordreset-capture-help": "Jei jūs čia pažymėsite, tai e-mail laiškas (su laikinuoju slaptažodžiu) bus parodytas jums prieš išsiunčiant jį naudotojui.",
        "passwordreset-email": "E-pašto adresas:",
        "passwordreset-emailtitle": "Paskyros informacija apie {{sitename}}",
-       "passwordreset-emailtext-ip": "Kažkas (tikriausiai jūs, IP adresu $1) paprašė priminti jūsų slaptažodį svetainėje {{SITENAME}} ($4). Šio naudotojo {PLURAL:$3|paskyra|paskyros}} yra susietos su šiuo elektroninio pašto adresu:\n\n$2\n\n{{PLURAL:$3|Šis laikinas slaptažodis |Šie laikini slaptažodžiai}} baigs galiot po {{PLURAL:$5|vienos dienos|$5 dienų}}. \n\nJūs turėtumėte prisijungti ir pasirinkti naują slaptažodį. Jei kažkas kitas padarė šį prašymą arba jūs prisiminėte savo pirminį slaptažodį, ir jums nebereikia jo pakeisti, galite ignoruoti šį pranešimą ir toliau naudotis savo senuoju slaptažodžiu.",
+       "passwordreset-emailtext-ip": "Kažkas (tikriausiai jūs, iš IP adreso $1) paprašė priminti jūsų slaptažodį svetainėje {{SITENAME}} ($4). Šio naudotojo {{PLURAL:$3|paskyra|paskyros}} yra susietos su šiuo elektroninio pašto adresu:\n\n$2\n\n{{PLURAL:$3|Šis laikinas slaptažodis|Šie laikini slaptažodžiai}} baigs galiot po {{PLURAL:$5|vienos dienos|$5 dienų}}. \n\nJūs turėtumėte prisijungti ir pasirinkti naują slaptažodį. Jei priminti slaptažodį paprašė kažkas kitas arba jūs prisiminėte savo pirminį slaptažodį ir jums nebereikia jo pakeisti, galite ignoruoti šį pranešimą ir toliau naudotis savo senuoju slaptažodžiu.",
        "passwordreset-emailtext-user": "Naudotojas $1 svetainėje {{SITENAME}} sukūrė užklausą slaptažodžio priminimui svetainėje {{SITENAME}}\n($4). Šio naudotojo {{PLURAL:$3|paskyra|paskyros}} susieto su šiuo elektroniniu paštu $2. \n\n{{PLURAL:$3|Šis laikinas slaptažodis|Šie laikini slaptažodžiai}} baigs galioti po {{PLURAL:$5|vienos dienos|$5 dienų}}. Jūs turėtumėte prisijungti ir pasirinkti naują slaptažodį. Jei kažkas padarė tai be jūsų žinios arba jūs prisiminėte savo pirminį slaptažodį, ir jūs nebenorite jo pakeisti, galite ignoruoti šį pranešimą ir toliau naudotis savo senuoju slaptažodžiu.",
        "passwordreset-emailelement": "Naudotojo vardas: \n$1\n\nLaikinas slaptažodis: \n$2",
        "passwordreset-emailsentemail": "Jeigu šis el. pašto adresas yra susietas su jūsų paskyra, tada slaptažodžio atkūrimo laiškas bus išsiųstas.",
        "grant-group-high-volume": "Atlikti didelės apimties veiklą",
        "grant-group-customization": "Pritaikymas ir parinktys",
        "grant-group-administration": "Atlikti administravimo veiksmų",
+       "grant-group-private-information": "Prieiti prie privačių duomenų apie jus",
        "grant-group-other": "Įvairios veiklos",
        "grant-blockusers": "Užblokuoti ir atblokuoti naudotojus",
        "grant-createaccount": "Kurti paskyras",
        "grant-highvolume": "Didelės apimties redagavimas",
        "grant-oversight": "Paslėpti naudotojus ir numalšinti versijas",
        "grant-patrol": "Patrulių pakeitimai puslapiuose",
+       "grant-privateinfo": "Prieiti prie privačių duomenų",
        "grant-protect": "Apsaugoti ir neapsaugoti puslapiai",
        "grant-rollback": "Atšaukti pakeitimus puslapiuose",
        "grant-sendemail": "Siųsti el. laišką kitiems naudotojams",
        "grant-basic": "Pagrindinės teisės",
        "grant-viewdeleted": "Peržiūrėti ištrintus failus ir puslapius",
        "grant-viewmywatchlist": "Peržiūrėti savo stebėjimų sąrašą",
+       "grant-viewrestrictedlogs": "Žiūrėti apribotus žurnalo įrašus",
        "newuserlogpage": "Prisiregistravę naudotojai",
        "newuserlogpagetext": "Tai naudotojų kūrimo sąrašas.",
        "rightslog": "Naudotojų teisių pakeitimai",
        "apisandbox-submit": "Pateikti prašymą",
        "apisandbox-reset": "Išvalyti",
        "apisandbox-retry": "Bandykite dar kartą",
+       "apisandbox-loading": "API modulio „$1“ informacija įkeliama...",
+       "apisandbox-load-error": "Įvyko klaida įkeliant API modulio „$1“ informaciją: $2",
        "apisandbox-no-parameters": "Šis API modulis neturi parametrų.",
        "apisandbox-helpurls": "Pagalbinės nuorodos",
        "apisandbox-examples": "Pavyzdžiai",
        "booksources-search": "Ieškoti",
        "booksources-text": "Žemiau yra nuorodų sąrašas į kitas svetaines, kurios parduoda naujas ar naudotas knygas, bei galbūt turinčias daugiau informacijos apie knygas, kurių ieškote:",
        "booksources-invalid-isbn": "Duotas ISBN atrodo neteisingas; patikrinkite, ar nepadarėte kopijavimo klaidų.",
+       "magiclink-tracking-rfc": "Puslapiai, naudojantys RFC magiškas nuorodas",
+       "magiclink-tracking-rfc-desc": "Šis puslapis naudoja RFC magiškas nuorodas. Informacija apie perkėlimą [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org].",
+       "magiclink-tracking-pmid": "Puslapiai, naudojantys PMID magiškas nuorodas",
+       "magiclink-tracking-pmid-desc": "Šis puslapis naudoja PMID magiškas nuorodas. Informacija apie perkėlimą [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org].",
+       "magiclink-tracking-isbn": "Puslapiai, naudojantys ISBN magiškas nuorodas",
+       "magiclink-tracking-isbn-desc": "Šis puslapis naudoja ISBN magiškas nuorodas. Informacija apie perkėlimą [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org].",
        "specialloguserlabel": "Naudotojas:",
        "speciallogtitlelabel": "Tikslas (pavadinimas arba {{ns:user}}:naudotojo vardas naudotojui):",
        "log": "Specialiųjų veiksmų sąrašas",
        "activeusers-intro": "Tai naudotojų sąrašas, kurie ką nors padarė per $1 {{PLURAL:$1|paskutinę dieną|paskutines dienas|paskutinių dienų}}.",
        "activeusers-count": "$1 {{PLURAL:$1|keitimas|keitimai|keitimų}} per {{PLURAL:$3|paskutinę dieną|$3 paskutines dienas|$3 paskutinių dienų}}",
        "activeusers-from": "Rodyti naudotojus, pradedant:",
-       "activeusers-hidebots": "Slėpti robotus",
-       "activeusers-hidesysops": "Slėpti administratorius",
+       "activeusers-groups": "Rodyti vartotojus, priklausančius grupėms:",
        "activeusers-noresult": "Nerasta jokių naudotojų.",
        "activeusers-submit": "Rodyti aktyvius vartotojus",
        "listgrouprights": "Naudotojų grupių teisės",
        "modifiedarticleprotection": "pakeistas „[[$1]]“ apsaugos lygis",
        "unprotectedarticle": "atrakino „[[$1]]“",
        "movedarticleprotection": "perkelti apsaugos nustatymai iš „[[$2]]“ į „[[$1]]“",
+       "protectedarticle-comment": "{{GENDER:$2|Apsaugojo}} „[[$1]]“",
+       "modifiedarticleprotection-comment": "{{GENDER:$2|Pakeitė „[[$1]]“ apsaugos lygį}}",
+       "unprotectedarticle-comment": "{{GENDER:$2|Pašalino apsaugą}} iš „[[$1]]“",
        "protect-title": "Nustatomas apsaugos lygis puslapiui „$1“",
        "protect-title-notallowed": "Peržiūrėti \"$1\" apsaugos lygį",
        "prot_1movedto2": "[[$1]] pervadintas į [[$2]]",
        "pageinfo-category-pages": "Puslapių skaičius",
        "pageinfo-category-subcats": "Dukterinių kategorijų skaičius",
        "pageinfo-category-files": "Failų skaičius",
+       "pageinfo-user-id": "Vartotojo ID",
        "markaspatrolleddiff": "Žymėti, kad patikrinta",
        "markaspatrolledtext": "Pažymėti, kad puslapis patikrintas",
        "markaspatrolledtext-file": "Pažymėti šią failo versiją kaip patruliuojamą",
        "confirmemail_success": "Jūsų el. pašto adresas patvirtintas. Dabar galite prisijungti ir mėgautis projektu.",
        "confirmemail_loggedin": "Jūsų el. pašto adresas patvirtintas.",
        "confirmemail_subject": "{{SITENAME}} el. pašto adreso patvirtinimas",
-       "confirmemail_body": "Kažkas, tikriausiai jūs IP adresu $1, užregistravo\npaskyrą „$2“ susietą su šiuo el. pašto adresu projekte {{SITENAME}}.\n\nKad patvirtintumėte, kad ši dėžutė tikrai priklauso jums, ir aktyvuotumėte\nel. pašto paslaugas projekte {{SITENAME}}, atverkite šią nuorodą savo naršyklėje:\n\n$3\n\nJei paskyrą registravote *ne* jūs, eikite šia nuoroda,\nkad atšauktumėte el. pašto adreso patvirtinimą:\n\n$5\n\nPatvirtinimo kodas baigs galioti $4.",
-       "confirmemail_body_changed": "Kažkas, tikriausiai jūs IP adresu $1, projekte {{SITENAME}}\npakeitė paskyros „$2“ el. pašto adresą.\n\nKad patvirtintumėte, kad ši dėžutė tikrai priklauso jums, ir vėl aktyvuotumėte\nel. pašto paslaugas projekte {{SITENAME}}, atverkite šią nuorodą savo naršyklėje:\n\n$3\n\nJei paskyra jums *nepriklauso*, eikite šia nuoroda,\nkad atšauktumėte el. pašto adreso patvirtinimą:\n\n$5\n\nPatvirtinimo kodas baigs galioti $4.",
+       "confirmemail_body": "Kažkas, tikriausiai jūs iš IP adreso $1, užregistravo\npaskyrą „$2“, susietą su šiuo el. pašto adresu projekte {{SITENAME}}.\n\nKad patvirtintumėte, kad ši paskyra tikrai priklauso jums, ir aktyvuotumėte\nel. pašto paslaugas projekte {{SITENAME}}, atverkite šią nuorodą savo naršyklėje:\n\n$3\n\nJei paskyrą registravote *ne* jūs, spustelkite šią nuoroda,\nkad atšauktumėte el. pašto adreso patvirtinimą:\n\n$5\n\nPatvirtinimo kodas baigs galioti $4.",
+       "confirmemail_body_changed": "Kažkas, tikriausiai jūs iš IP adreso $1, projekte {{SITENAME}}\npakeitė paskyros „$2“ el. pašto adresą.\n\nKad patvirtintumėte, kad ši paskyra tikrai priklauso jums, ir vėl aktyvuotumėte\nel. pašto paslaugas projekte {{SITENAME}}, atverkite šią nuorodą savo naršyklėje:\n\n$3\n\nJei paskyra jums *nepriklauso*, spustelkite šią nuorodą,\nkad atšauktumėte el. pašto adreso patvirtinimą:\n\n$5\n\nPatvirtinimo kodas baigs galioti $4.",
        "confirmemail_body_set": "Kažkas (tikriausiai jūs) iš IP adreso $1,\nnustatė svetainės {{SITENAME}} paskyros „$2“ elektroninio pašto adresą į jūsiškį.\n\nKad patvirtintumėte, kad ši paskyra tikrai priklauso jums ir tokiu būdu aktyvuotumėte\nelektroninio pašto galimybes svetainėje {{SITENAME}}, atverkite šią nuorodą savo naršyklėje:\n\n$3\n\nJei paskyra jums *nepriklauso*, spauskite šią nuorodą,\nkad atšauktumėte elektroninio pašto adreso patvirtinimą:\n\n$5\n\nŠis patvirtinimo kodas baigs galioti $4.",
        "confirmemail_invalidated": "El. pašto adreso patvirtinimas atšauktas",
        "invalidateemail": "El. pašto patvirtinimo atšaukimas",
        "tags-edit-reason": "Priežastis:",
        "tags-edit-revision-submit": "Taikyti pakeitimus {{PLURAL:$1|šiai versijai|$1 versijoms}}",
        "tags-edit-logentry-submit": "Taikyti pakeitimus {{PLURAL:$1|šiam žurnalo įrašui|$1 žurnalo įrašams}}",
-       "tags-edit-success": "Pakeitimai sėkmingai pritaikyti.",
+       "tags-edit-success": "Pakeitimai buvo pritaikyti.",
        "tags-edit-failure": "Pokyčiai negali būti taikomi:\n$1",
        "tags-edit-nooldid-title": "Negalima pasirinkta versija",
        "tags-edit-nooldid-text": "Jūs nenurodėte jokio peržiūros, kuriai vykdyti šią funkciją, arba nurodytos peržiūros nėra.",
        "htmlform-cloner-create": "Pridėti dar",
        "htmlform-cloner-delete": "Pašalinti",
        "htmlform-cloner-required": "Bent viena reikšmė būtina.",
+       "htmlform-date-placeholder": "MMMM-MM-DD",
+       "htmlform-time-placeholder": "VV:MM:SS",
+       "htmlform-datetime-placeholder": "MMMM-MM-DD VV:MM:SS",
        "htmlform-title-badnamespace": "[[:$1]] nėra \"{{ns:$2}}\" vardų srityje.",
        "htmlform-title-not-creatable": "\"$1\" nėra tinkamas sukūrimui puslapio pavadinimas",
        "htmlform-title-not-exists": "$1 neegzistuoja.",
        "logentry-protect-protect-cascade": "$1 {{GENDER:$2|užrakino}} $3 $4 [pakopinė]",
        "logentry-protect-modify": "$1 {{GENDER:$2|pakeitė}} apsaugos lygį $3 $4",
        "logentry-protect-modify-cascade": "$1 {{GENDER:$2|pakeitė}} apsaugos lygį $3 $4 [pakopinė]",
-       "logentry-rights-rights": "$1 {{GENDER:$2|pakeitė}} grupės narystę $3 iš $4 į $5",
+       "logentry-rights-rights": "$1 {{GENDER:$2|pakeitė}} naudotojo $3 grupės narystę iš $4 į $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|pakeista}} narystė grupėje $3",
        "logentry-rights-autopromote": "$1 buvo automatiškai {{GENDER:$2|pervestas}} iš $4 į $5",
        "logentry-upload-upload": "$1 {{GENDER:$2|įkėlė}} $3",
        "linkaccounts-success-text": "Paskyra buvo susieta.",
        "linkaccounts-submit": "Susieti paskyras",
        "unlinkaccounts": "Atsieti paskyras",
-       "unlinkaccounts-success": "Paskyra buvo atsieta."
+       "unlinkaccounts-success": "Paskyra buvo atsieta.",
+       "edit-error-short": "Klaida: $1",
+       "edit-error-long": "Klaidos:\n\n$1"
 }
index 7c50f35..fe7a8e3 100644 (file)
        "talk": "Diskusija",
        "views": "Apskates",
        "toolbox": "Rīki",
+       "tool-link-userrights": "Mainīt {{GENDER:$1|dalībnieka|dalībnieces}} grupas",
        "tool-link-emailuser": "Nosūtīt e-pastu {{GENDER:$1|šim dalībniekam|šai dalībniecei}}",
        "userpage": "Skatīt dalībnieka lapu",
        "projectpage": "Skatīt projekta lapu",
        "view-pool-error": "Atvainojiet, šobrīd serveri ir pārslogoti.\nPārāk daudz dalībnieku mēģina apskatīt šo lapu.\nLūdzu, brīdi uzgaidiet un mēģiniet šo lapu apskatīt vēlreiz.\n\n$1",
        "generic-pool-error": "Atvainojiet, šobrīd serveri ir pārslogoti.\nPārāk daudz lietotāju mēģina apskatīt šo lapu.\nLūdzu, brīdi uzgaidiet un mēģiniet šo lapu apskatīt vēlreiz.",
        "pool-timeout": "Noildze, gaidot bloķēšanu",
+       "pool-queuefull": "Kopas rinda ir pilna",
        "pool-errorunknown": "Nezināma kļūda",
+       "pool-servererror": "Kopas skaitītāja pakalpojums nav pieejams ($1).",
        "poolcounter-usage-error": "Izmantošanas kļūda: $1",
        "aboutsite": "Par {{grammar:akuzatīvs|{{SITENAME}}}}",
        "aboutpage": "Project:Par",
        "createacct-yourpasswordagain-ph": "Vēlreiz ievadiet paroli",
        "userlogin-remembermypassword": "Atcerēties mani",
        "userlogin-signwithsecure": "Izmantot drošu savienojumu",
+       "cannotcreateaccount-title": "Nevar izveidot kontus",
        "yourdomainname": "Tavs domēns",
        "password-change-forbidden": "Šajā wiki paroles nevar mainīt.",
        "externaldberror": "Notikusi vai nu ārējās autentifikācijas datubāzes kļūda, vai arī tev nav atļauts izmainīt savu ārējo kontu.",
        "loginlanguagelabel": "Valoda: $1",
        "pt-login": "Pieslēgties",
        "pt-login-button": "Pieslēgties",
+       "pt-login-continue-button": "Turpināt pieslēgšanos",
        "pt-createaccount": "Reģistrēties",
        "pt-userlogout": "Iziet",
        "php-mail-error-unknown": "Nezināma kļūda PHP mail() funkcijā",
        "activeusers-intro": "Šis ir to dalībnieku saraksts, kuri veikuši kādu darbību {{PLURAL:daudzskaitlī:$1|pēdējā|pēdējās}} $1 {{PLURAL:daudzskaitlī:$1|dienā|dienās}}.",
        "activeusers-count": "$1 {{PLURAL:$1|darbību|darbība|darbības}} {{PLURAL:$3|pēdējās $3 dienās|pēdējā $3 dienā|pēdējās $3 dienās}}",
        "activeusers-from": "Parādīt dalībniekus, sākot ar:",
-       "activeusers-hidebots": "Paslēpt botus",
-       "activeusers-hidesysops": "Paslēpt administratorus",
        "activeusers-noresult": "Neviens dalībnieks nav atrasts.",
        "activeusers-submit": "Parādīt aktīvos dalībniekus",
        "listgrouprights": "Dalībnieku grupu tiesības",
index d4eeb0c..8839a78 100644 (file)
@@ -10,7 +10,8 @@
                        "Сай",
                        "Санюн Вадик",
                        "아라",
-                       "Sergey Ivanov"
+                       "Sergey Ivanov",
+                       "Irus"
                ]
        },
        "tog-underline": "Кузе кылвер-влакым ӱлычын удыралаш?",
        "listusers-blocked": "(йӧн петырыме)",
        "activeusers": "Чӱчкыдын пайдаланыше-влак",
        "activeusers-count": "Пытартыш $3 {{PLURAL:$3|1=кечыште|кечылаште}} $1 {{PLURAL:$1|1=тӧрлатымаш|тӧрлатымаш-влак}}",
-       "activeusers-hidebots": "Бот-влакым шылташ",
-       "activeusers-hidesysops": "Сайтвиктарыше-влакым шылташ",
        "activeusers-submit": "ончыкташ",
        "listgrouprights-members": "(тӱшкаште улшо-влак)",
        "emailuser": "Пайдаланыше дек серыш",
        "specialpages-group-pagetools": "Лаштык ӱзгар-влак",
        "specialpages-group-redirects": "Вес вере колтышо спецлаштык-влак",
        "external_image_whitelist": " #Оставьте эту строчку такой, как она есть<pre>\n#Разместите здесь фрагменты регулярных выражений (ту часть, что находится между //)\n#они будут соотнесены с URL внешних изображений.\n#Подходящие будут показаны как изображения, остальные будут показаны как ссылки на изображения.\n#Строки, начинающиеся с # считаются комментариями.\n#Строки не чувствительны к регистру\n\n#Размещайте фрагменты регулярных выражений над этой строчкой. Оставьте эту строчку такой, как она есть.</pre>",
+       "logentry-delete-delete": "$1 {{GENDER:$2|лыктын|лыктын}} странице $3",
        "revdelete-summary": "тӧрлатымаш-влакым возен ончыктымаш",
        "searchsuggest-search": "Кычалаш",
        "expand_templates_ok": "Йӧра",
index 1ba8afd..2121915 100644 (file)
        "grant-basic": "Основни права",
        "grant-viewdeleted": "Преглед на избришани податотеки и страници",
        "grant-viewmywatchlist": "Преглед на вашите набљудувања",
+       "grant-viewrestrictedlogs": "Погл. ограничени дневнички ставки",
        "newuserlogpage": "Дневник на регистрирања на корисници",
        "newuserlogpagetext": "Ова е дневник на регистрирани корисници.",
        "rightslog": "Дневник на корисничките права",
        "booksources-search": "Пребарај",
        "booksources-text": "Ова е список на врски кон други мрежни места кои продаваат нови и користени книги, и тие може\nда имаат повеќе информации за книгите што ги баравте:",
        "booksources-invalid-isbn": "Наведениот ISBN се чини неправилен. Проверете да не настанала некоја грешка при копирањето од изворот.",
+       "magiclink-tracking-rfc": "Страници со волшебни врски за барања за коментирање",
+       "magiclink-tracking-rfc-desc": "Страницава користи волшебни врски за барања за коментирање (RFC). Погл. [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] за да дознаете како да ги преселите.",
+       "magiclink-tracking-pmid": "Страници со со волшебни врски за PMID",
+       "magiclink-tracking-pmid-desc": "Страницава користи волшебни врски за PMID. Погл. [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] за да дознаете како да ги преселите.",
+       "magiclink-tracking-isbn": "Страници со волшебни врски за ISBN",
+       "magiclink-tracking-isbn-desc": "Страницава користи волшебни врски за ISBN. Погл. [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] за да дознаете како да ги преселите.",
        "specialloguserlabel": "Изведувач:",
        "speciallogtitlelabel": "Цел (наслов или {{ns:user}}:корисничко име на корисникот):",
        "log": "Дневници",
        "activeusers-intro": "Ова е список на корисници кои биле на некој начин активни во последните {{PLURAL:$1|еден ден|$1 дена}}.",
        "activeusers-count": "$1 {{PLURAL:$1|дејство|дејства}} {{PLURAL:$3|денес|во последните $3 дена}}",
        "activeusers-from": "Прикажи корисници почнувајќи од:",
-       "activeusers-hidebots": "Скриј ботови",
-       "activeusers-hidesysops": "Скриј администратори",
+       "activeusers-groups": "Прикажи ги корисниците кои членуваат во групите:",
        "activeusers-noresult": "Не пронајдов ниеден корисник.",
        "activeusers-submit": "Прикажи активни корисници",
        "listgrouprights": "Права на кориснички групи",
        "modifiedarticleprotection": "изменет степен на заштита за „[[$1]]“",
        "unprotectedarticle": "отстранета заштитата на „[[$1]]“",
        "movedarticleprotection": "преместени нагодувања за заштита од „[[$2]]“ во „[[$1]]“",
+       "protectedarticle-comment": "{{GENDER:$2|Заштитена}} „[[$1]]“",
+       "modifiedarticleprotection-comment": "{{GENDER:$2|Изменет степенот на заштита}} на „[[$1]]“",
+       "unprotectedarticle-comment": "{{GENDER:$2|Отстранета заштитата}} на „[[$1]]“",
        "protect-title": "Измена на степенот на заштита на „$1“",
        "protect-title-notallowed": "Преглед на степенот на заштита на „$1“",
        "prot_1movedto2": "[[$1]] преместена како [[$2]]",
index b7fd888..bacd0d3 100644 (file)
@@ -14,7 +14,8 @@
                        "아라",
                        "Sembuk",
                        "Munkhzaya.E",
-                       "Macofe"
+                       "Macofe",
+                       "Irus"
                ]
        },
        "tog-underline": "Линкүүдийн доогуур зураас зур:",
        "yourpasswordagain": "Нууц үгээ дахин оруулах:",
        "createacct-yourpasswordagain": "Нууц үгээ баталгаажуулна уу",
        "createacct-yourpasswordagain-ph": "Нууц үгээ дахиж оруулна уу",
-       "remembermypassword": "Энэ компьютер дээрх миний нэвтрэлтийг сана (хамгийн дээд талдаа $1 {{PLURAL:$1|өдрийн|өдрийн}} туршид)",
        "userlogin-remembermypassword": "Намайг сана",
        "userlogin-signwithsecure": "Хамгаалалттай сүлжээ хэрэглэнэ үү",
        "yourdomainname": "Таны домэйн:",
        "passwordreset-emailtext-user": "{{SITENAME}} дээрх $1 хэрэглэгч {{SITENAME}} ($4) дээр өөрийн тань бүртгэл дээр сануулга хүссэн байна. \nДараах {{PLURAL:$3|бүртгэл|бүртгэлүүд}} уг е-шуудантай холбоотой байна:\n\n$2\n\nЭнэ {{PLURAL:$3|түр нууц үг|түр нууц үгс}} {{PLURAL:$5|нэг өдрийн дараа|$5 өдрийн дараа}} устах болно.\nТүүгээр нэвтэрч ороод нууц үгээ шинэчилнэ үү. Энэ сануулгыг өөр хэн нэгэн хийсэн, эсвэл та\nнууц үгээ санаж байгаа бол энэ захиаг анхааралгүйгээр хуучнаараа ороход болно.",
        "passwordreset-emailelement": "Хэрэглэгчийн нэр: \n$1\n\nТүр зуурын нууц үг: \n$2",
        "passwordreset-emailsentemail": "Нууц үг солин емайл илгээсэн.",
-       "passwordreset-emailsent-capture": "Доор харагдаж байгаа нь танируу илгээсэн нууц үг ресет хийх емайл.",
-       "passwordreset-emailerror-capture": "Доор харагдаж байгаа нууц үг ресет хийх емайл үүссэх боловч {{GENDER:$2|хэрэглэгчид}} илгээхэд алдаа гарлаа : $1",
        "changeemail": "Цахим шуудангийн хаяг солих",
        "changeemail-header": "Цахим шуудангийн бүртгэлийн хаяг солих",
        "changeemail-no-info": "Энэ хуудсыг үзэхэд хэрэглэгчийн нэрээр орсон байх шаардлагатай.",
        "undo-nochange": "Энэ өөрчлөлтийг буцаасан байна.",
        "undo-summary": "[[Special:Contributions/$2|$2]] ([[User talk:$2|Яриа]]) хэрэглэгчийн $1 засварыг цуцлах",
        "undo-summary-username-hidden": "$1 залруулгыг далд хэрэглэгчээр буцаах",
-       "cantcreateaccounttitle": "Хэрэглэгчийн бүртгэлийг үүсгэж чадсангүй.",
        "cantcreateaccount-text": "[[User:$3|$3]] нь энэ IP хаягаас ('''$1''') бүртгэл үүсгэх эрхийг түгжсэн байна.\n\n$3-н тодорхойлсон шалтгаан нь ''$2''",
        "viewpagelogs": "Энэ хуудасны логийг үзэх",
        "nohistory": "Хуудсанд засвар хийсэн түүх байхгүй байна.",
        "activeusers-intro": "Энэ нь сүүлийн $1 {{PLURAL:$1|өдөрт|өдөрт}} ямар нэг байдлаар үйлдэл хийсэн хэрэглэгчдийн жагсаалт юм.",
        "activeusers-count": "Сүүлийн {{PLURAL:$3|нэг өдөрт|$3 өдөрт}} $1 {{PLURAL:$1|засвар|засвар}}",
        "activeusers-from": "Хамгийн эхэлж харуулах хэрэглэгч:",
-       "activeusers-hidebots": "роботуудыг нуух",
-       "activeusers-hidesysops": "Администраторуудыг нуух",
        "activeusers-noresult": "Хэрэглэгч олдсонгүй.",
        "listgrouprights": "Хэрэглэгчийн бүлгийн эрхүүд",
        "listgrouprights-summary": "Дараах нь энэ вики дээрх хэрэглэгчийн бүлгүүд болон тэдгээрийн эрх, зөвшөөрлүүдийн жагсаалт юм.\nЭрх бүрийн талаар [[{{MediaWiki:Listgrouprights-helppage}}|нэмэлт мэдээлэл]] байж магадгүй.",
        "htmlform-submit": "Явуулах",
        "htmlform-reset": "Өөрчлөлтүүдийг цуцлах",
        "htmlform-selectorother-other": "Бусад",
-       "sqlite-has-fts": "$1 (бүх текстээрх хайлтыг дэмждэг)",
-       "sqlite-no-fts": "$1 (бүх текстээрх хайлтыг дэмждэггүй)",
        "logentry-delete-delete": "$3 хуудсыг $1 устгасан",
        "logentry-delete-restore": "$3 хуудсыг $1 сэргээв",
        "revdelete-restricted": "системийн операторуудад тавигдсан хязгаарлалтууд",
        "revdelete-unrestricted": "системийн операторуудаас авч хаясан хязгаарлалтууд",
+       "logentry-newusers-create": "$1 хэрэглэгч шинээр {{GENDER:$2|элслээ}}",
        "logentry-rights-rights": "$1 $3 дахь грүпийн гишүүнчлэлээ $4 ээс $5 руу шилжүүллээ",
        "logentry-rights-rights-legacy": "$1 $3 дэхь грүпийн гишүүнчлэлээ сольсон",
        "logentry-rights-autopromote": "$1 $4 аас $5 руу автоматаар дэвшигдлээ",
index 9df4ea2..db52b06 100644 (file)
@@ -12,7 +12,8 @@
                        "Leli Forte",
                        "Macofe",
                        "Matma Rex",
-                       "MTSap"
+                       "MTSap",
+                       "Nemo bis"
                ]
        },
        "tog-underline": "Ħoloq sottolinjati:",
        "yourpasswordagain": "Erġa' ikteb il-password:",
        "createacct-yourpasswordagain": "Ikkonferma l-password",
        "createacct-yourpasswordagain-ph": "Erġa' daħħal il-password",
-       "remembermypassword": "Ftakar il-login tiegħi fuq dan il-kompjuter (għal massimu ta' {{PLURAL:$1|ġurnata|$1 ġurnata}})",
        "userlogin-remembermypassword": "Żommni fil-kont",
        "userlogin-signwithsecure": "Uża konnessjoni sigura",
        "yourdomainname": "Id-dominju tiegħek:",
        "passwordreset-emailtext-user": "{{PLURAL:$3|Din il-password temporanja se tiskadi|Dawn il-passwords temporanji se jiskadu}} fi żmien {{PLURAL:$5|ġurnata|$5 jum}}. Inti għadek tidħol fil-kont tiegħek u tagħżel password ġdida issa. Jekk xi ħadd ieħor għamel din ir-rikjesta, jew jekk ftakart il-password oriġinali, u m'għadikx trid tbiddilha, inti tista' tinjora dan il-messaġġ u tibqa' tuża' l-password il-qadima.",
        "passwordreset-emailelement": "Isem tal-utent: \n$1\n\nPassword temporanja: \n$2",
        "passwordreset-emailsentemail": "Intbagħtet ittra-e għall-issettjar mill-ġdid tal-password.",
-       "passwordreset-emailsent-capture": "Intbagħtet ittra-e għall-ssettjar mill-ġdid tal-password u l-kontenut jidher hawn taħt.",
-       "passwordreset-emailerror-capture": "Ġiet ġenerata ittra-e ta' tfakkira, li l-kontenut tagħha jidher hawn taħt. Madanakollu, il-posta ma ntbagħtitx lill-utent: $1",
        "changeemail": "Biddel l-indirizz elettroniku",
        "changeemail-header": "Biddel l-indirizz elettroniku tal-kont",
        "changeemail-no-info": "Trid tkun dħalt fil-kont tiegħek sabiex taċċessa direttament din il-paġna.",
        "continue-editing": "Mur fil-kaxxa tal-editjar",
        "previewconflict": "Din il-previżjoni turi l-kliem li jinsab fiż-żona ta' modifika superjuri u turi kif tidher kieku l-paġna kella tiġi modifikata.",
        "session_fail_preview": "'''Jiddispjaċina imma l-modifika tiegħek ma setgħetx tiġi pproċessata minħabba li ntilfet l-informazzjoni tas-sessjoni.\nJekk jogħġbok, erġa' pprova. Jekk xorta tibqa' ma taħdimx, ipprova [[Special:UserLogout|oħroġ]] u erġa' idħol.'''",
-       "session_fail_preview_html": "'''Jiddispjaċina imma l-modifika tiegħek ma setgħetx tiġi pproċessata minħabba li ntilfet l-informazzjoni tas-sessjoni.'''\n\n''Peress li {{#ifeq: {{SITENAME}} | translatewiki.net | fuq {{SITENAME}} | fil-{{SITENAME}}}} huwa possibbli l-użu tal-HTML mingħajr limitazzjonijiet (''raw HTML''), id-dehra proviżorja tiġi moħbija bħala prekawzjoni kontra l-attakki tal-JavaScript.''\n\n'''Jekk dan huwa attentat leġittmu ta' modifika, jekk jogħġbok erġa' pprova. Jekk tibqa' ma taħdimx, ipprova [[Special:UserLogout|oħroġ]] u erġa' idħol.'''",
+       "session_fail_preview_html": "'''Jiddispjaċina imma l-modifika tiegħek ma setgħetx tiġi pproċessata minħabba li ntilfet l-informazzjoni tas-sessjoni.'''\n\n''Peress li fil-{{SITENAME}} huwa possibbli l-użu tal-HTML mingħajr limitazzjonijiet (''raw HTML''), id-dehra proviżorja tiġi moħbija bħala prekawzjoni kontra l-attakki tal-JavaScript.''\n\n'''Jekk dan huwa attentat leġittmu ta' modifika, jekk jogħġbok erġa' pprova. Jekk tibqa' ma taħdimx, ipprova [[Special:UserLogout|oħroġ]] u erġa' idħol.'''",
        "token_suffix_mismatch": "'''Il-modifika tiegħek ma ġietx aċċettata minħabba li klijent tiegħek tertaq l-karratri tal-ortografija fit-token tal-modifika.\nDin il-modifika ma ġietx aċċettata sabiex ma jkunx hemm żballji fit-test tal-paġna. Dan xi kultant jiġri minħabba li qiegħed tuża servizz difettuż anonimu li huwa bbażat fuq il-web ta' prokura.'''",
        "edit_form_incomplete": "'''Ċerti parti tal-formola tal-modifika ma laħqux is-server; iċċekkja jekk il-modifiki tiegħek humiex intatti u erġa' pprova.'''",
        "editing": "Modifika ta' $1",
        "undo-failure": "Huwa impossibbli li tiġi annullata l-modifika, minħabba kunflitt ta' modifiki intermedji.",
        "undo-norev": "Il-modifika ma tistax tiġi annullata peress li ma teżistix jew inkella għax ġiet diġà imħassra.",
        "undo-summary": "Neħħi r-reviżjoni $1 ta' [[Special:Contributions/$2|$2]] ([[User talk:$2|Diskussjoni]])",
-       "cantcreateaccounttitle": "Il-kont ma jistax jinħoloq",
        "cantcreateaccount-text": "Ħolqien tal-kont minn dan l-indirizz IP ('''$1''') ġie imblukkat minn [[User:$3|$3]].\n\nIr-raġuni li ngħatat minħabba l-blokk mingħand $3 kienet ''$2''",
        "viewpagelogs": "Ara r-reġistri ta' din il-paġna",
        "nohistory": "M'hemm l-ebda kronoloġija ta' modifika f'din il-paġna.",
        "activeusers-intro": "Din hija lista ta' utenti li kellhom xi tip ta' attività f'dawn l-aħħar $1 {{PLURAL:$1|ġurnata|ġurnata}}.",
        "activeusers-count": "$1 {{PLURAL:$1|modifika|modifika}} fl-aħħar {{PLURAL:$3|jum|$3 jum}}",
        "activeusers-from": "Uri utenti li jibdew minn:",
-       "activeusers-hidebots": "Aħbi l-bots",
-       "activeusers-hidesysops": "Aħbi amministraturi",
        "activeusers-noresult": "L-ebda utent ma nstab.",
        "listgrouprights": "Drittijiet tal-grupp tal-utenti",
        "listgrouprights-summary": "Hawn taħt hawn elenkati l-gruppi tal-utenti għal din il-wiki, bid-drittijiet ta' aċċess rispettiv.\nJista' jkun hemm [[{{MediaWiki:Listgrouprights-helppage}}|aktar informazzjoni]] fuq id-drittjiet individwali.",
        "htmlform-cloner-create": "Żid aktar",
        "htmlform-cloner-delete": "Neħħi",
        "htmlform-cloner-required": "Minn tal-anqas valur wieħed huwa bżonnjuż.",
-       "sqlite-has-fts": "$1 bil-possibilità ta' tfittxija kompluta fit-test",
-       "sqlite-no-fts": "$1 mingħajr il-possibilità ta' tfittxija kompluta fit-test",
        "logentry-delete-delete": "$1 {{GENDER:$2|ħassar|ħassret}} il-paġna $3",
        "logentry-delete-restore": "$1 reġġa' lura l-paġna $3",
        "logentry-delete-event": "$1 biddel il-viżibilità ta' {{PLURAL:$5|azzjoni tar-reġistru|$5 azzjonijiet tar-reġistru}} ta' $3: $4",
        "feedback-external-bug-report-button": "Irrapporta problema teknika",
        "feedback-dialog-title": "Ibgħat ir-rispons",
        "feedback-dialog-intro": "Tista' tuża din il-formola sabiex tibgħat ir-rispons tiegħek. Il-kumment tiegħek jiġi miżjuda mal-paġna \"$1\", flimkien mal-isem tal-utent.",
-       "feedback-error-title": "Żball",
        "feedback-error1": "Żball: Riżultat mhux rikonoxxut mill-API",
        "feedback-error2": "Żball: Modifika mhux esegwita",
        "feedback-error3": "Żball: L-ebda risposta mill-API",
        "special-characters-group-lao": "Lao",
        "special-characters-group-khmer": "Khmer",
        "mw-widgets-dateinput-placeholder-day": "SSSS-XX-ĠĠ",
-       "mw-widgets-dateinput-placeholder-month": "SSSS-XX",
-       "api-error-blacklisted": "Jekk jogħġbok agħżel titlu differenti u deskrittiv."
+       "mw-widgets-dateinput-placeholder-month": "SSSS-XX"
 }
index ddf7c41..e61e6d7 100644 (file)
        "thu": "Mācuililhui",
        "fri": "6 ilhui",
        "sat": "7 ilhui",
-       "january": "Ic cē mētztli",
-       "february": "Ic ōmemētztli",
-       "march": "Ic ēyi mētztli",
+       "january": "Icce metztli",
+       "february": "Icome metztli",
+       "march": "3 Metz",
        "april": "Ic nāuhtetl mētztli",
        "may_long": "Ic mācuīlli mētztli",
        "june": "Ic chicuacē mētztli",
-       "july": "Ic chicōme mētztli",
-       "august": "Ic chicuēyi mētztli",
-       "september": "Ic chiucnāhui mētztli",
-       "october": "Ic mahtlāctli mētztli",
-       "november": "Ic mahtlāctli oncē mētztli",
-       "december": "Ic mahtlāctli omōme mētztli",
+       "july": "7 Metz",
+       "august": "8 Metz",
+       "september": "9 Metz",
+       "october": "10 Metz",
+       "november": "11 Metz",
+       "december": "12 Metz",
        "january-gen": "Ic cē mētztli",
        "february-gen": "Īcōmemētztli",
        "march-gen": "Īcyēyimētztli",
@@ -90,7 +90,7 @@
        "november-gen": "Īcmahtlāctetloncēmētztli",
        "december-gen": "Īcmahtlāctetlomōmemētztli",
        "jan": "Ic cē",
-       "feb": "Ic ōme",
+       "feb": "2 Metz",
        "mar": "Ic ēyi",
        "apr": "Nāhui",
        "may": "Mācuilli",
        "october-date": "Īcmahtlactlimētztli $1",
        "november-date": "Īcmahtlactlioncēmētztli $1",
        "december-date": "Īcmahtlactliomōmemētztli $1",
-       "pagecategories": "{{PLURAL:$1|Tlaìxmatkàyòtlàlilòtl|Tlaìxmatkàyòtlàlilòme}}",
+       "pagecategories": "{{PLURAL:$1|Neneuhcayotl|Neneuhcayomeh}}",
        "category_header": "Tlâkuilòlpiltin ìpan tlaìxmatkàtlàlilòtl \"$1\"",
        "subcategories": "Tlaìxmatkàtlàlilòpilòmë",
        "category-media-header": "Media \"$1\" neneuhcāyōc",
        "about": "Ītechcopa",
        "article": "Tlâkuilòpilli",
        "newwindow": "(Motlapoāz cē yancuīc tlanexillōtl)",
-       "cancel": "Xiccāhua",
+       "cancel": "Moxitiniz",
        "moredotdotdot": "Huehca ōmpa...",
        "mypage": "Noāmauh",
        "mytalk": "Teixnamiquiliztli",
        "anontalk": "Tēixnāmiquiliztli",
        "navigation": "Nēnemōhualiztli",
-       "and": "&#32;īhuān",
+       "and": "&#32;ihuan",
        "qbfind": "Xicahci",
        "qbbrowse": "Xitlatepotztoca",
        "qbedit": "Xicpatla",
        "faq": "Zan īc tētlatlanīliztli",
        "faqpage": "Project:FAQ",
        "actions": "Āyiliztli",
-       "namespaces": "Tōcātlacāuhtli",
+       "namespaces": "Tocatlacauhtli",
        "variants": "Nepāpan",
-       "navigation-heading": "Nemiliztlahtōlpōhualāmatl",
+       "navigation-heading": "Nemiliztlahtolpohualamatl",
        "errorpagetitle": "Aiuhcāyōtl",
        "returnto": "Ximocuepa īhuīc $1.",
-       "tagline": "Īhuīcpa {{SITENAME}}",
-       "help": "Tēpalēhuiliztli",
-       "search": "Nican tictemoz",
-       "searchbutton": "Tictēmōz",
+       "tagline": "Itechcopa {{SITENAME}}",
+       "help": "Tepalehuiliztli",
+       "search": "Tlatemoliztli",
+       "searchbutton": "Tlatemoliztli",
        "go": "Xiyauh",
        "searcharticle": "Xiyauh",
        "history": "Tlaīxtli ītlahtōllo",
-       "history_short": "Tlahtōllōtl",
+       "history_short": "Tlahtollotl",
        "updatedmarker": "ōmoyancuīx īhuīcpa xōcoyōc notlahpololiz",
-       "printableversion": "Tepoztlahcuilōlli",
+       "printableversion": "Tepoztlahcuilolli",
        "permalink": "Mochipa tzonhuiliztli",
        "print": "Xictepoztlahcuilo",
        "view": "Xiquitta",
        "specialpage": "Nònkuâkìskàtlaìxtlapalli",
        "personaltools": "In tlein nitēquitiltilia",
        "articlepage": "Xiquitta in tlamantlaīxtli",
-       "talk": "Zānīlli",
+       "talk": "Teixnamiquiliztli",
        "views": "Tlachiyaliztli",
-       "toolbox": "Tequitīhuani",
+       "toolbox": "Tequitihualoni",
        "userpage": "Xiquitta tlatequitiltilīlli zāzanilli",
        "projectpage": "Xiquitta tlachīhualiztli zāzanilli",
        "imagepage": "Xiquitta in zāzanilli īāma",
        "otherlanguages": "Occequīntīn tlahtōlcopa",
        "redirectedfrom": "(Ōmotlacuep īhuīcpa $1)",
        "redirectpagesub": "Ōmotlacuep zāzanilli",
-       "lastmodifiedat": "Inīn zāzanilli ōtlapatlac catca īpan $2, $1.",
+       "lastmodifiedat": "Inin tlahcuilolli omopatlac immanin $1, ipan $2.",
        "viewcount": "Inīn zāzanilli quintlapōhua {{PLURAL:$1|cē tlahpololiztli|$1 tlahpololiztli}}.",
        "protectedpage": "Ōmoquīxtix zāzanilli",
        "jumpto": "Īhuīcpa ticholōz:",
        "jumptonavigation": "nēnemōhualiztli",
-       "jumptosearch": "tlatēmoliztli",
-       "aboutsite": "Ītechcopa {{SITENAME}}",
-       "aboutpage": "Project:Ītechcopa",
+       "jumptosearch": "Tlatemoliztli",
+       "aboutsite": "Itechcopa {{SITENAME}}",
+       "aboutpage": "Project:Itechcopa",
        "copyright": "In tlahcuilōlli cah tlacēcencāhuani īpan $1 tel ahmo intlā īcuepca motēnēhua.",
        "copyrightpage": "{{ns:project}}:Tlachīhualōni ītlapiyaliz",
-       "currentevents": "Āxcāncāyōtl",
+       "currentevents": "Axcancayotl",
        "currentevents-url": "Project:Āxcāncāyōtl",
-       "disclaimers": "Nahuatīllahtōl",
+       "disclaimers": "tlamamalquixtiliztli",
        "edithelp": "Tlapatlaliztechcopa tēpalēhuiliztli",
        "helppage-top-gethelp": "Tēpalēhuiliztli",
        "mainpage": "Yacatlahcuilolli",
-       "mainpage-description": "Huēyitlaīxtli",
+       "mainpage-description": "Yacatlahcuilolli",
        "policy-url": "Project:Nahuatīltōn",
-       "portal": "Calīxcuātl tocalpōl",
-       "portal-url": "Project:Calīxcuātl tocalpōl",
-       "privacy": "Tlahcuilōlli piyaliznahuatīlli",
+       "portal": "Yacatlahcuilolli tocalpol",
+       "portal-url": "Project:Yacatlahcuilolli tocalpol",
+       "privacy": "Tlahcuilolli piyaliznahuatilli",
        "privacypage": "Project:Tlahcuilōlpiyaliztechcopa nahuatīltōn",
        "badaccess": "Tlahuelītiliztechcopa ahcuallōtl",
        "badaccess-group0": "Tehhuātl ahmo tiquichīhua inōn tiquiēlēhuia.",
        "retrievedfrom": "Ōquīzqui ītech  \"$1\"",
        "youhavenewmessages": "Tiquimpiya $1 ($2).",
        "youhavenewmessagesmulti": "Tiquimpiya yancuīc tlahcuilōlli īpan $1",
-       "editsection": "xicpatla",
+       "editsection": "Ticpatlaz",
        "editold": "xicpatla",
        "viewsourceold": "xiquitta mēyalli",
-       "editlink": "xicpatla",
-       "viewsourcelink": "xiquitta mēyalli",
-       "editsectionhint": "Xicpatla in: $1",
+       "editlink": "ticpatlaz",
+       "viewsourcelink": "Tiquittaz itzintiliz",
+       "editsectionhint": "Ticpatlaz in: $1",
        "toc": "In tlein quipiya inin tlahcuilolli",
        "showtoc": "xicnēxti",
        "hidetoc": "xictlāti",
        "page-rss-feed": "\"$1\" RSS huelītiliztli",
        "page-atom-feed": "\"$1\" RSS huelītiliztli",
        "red-link-title": "$1 (ahmo oncah tlahcuilolli)",
-       "nstab-main": "Tlaīxtli",
+       "nstab-main": "Tlahcuilolli-amatl",
        "nstab-user": "Tlatequitiltilīlli",
        "nstab-media": "Mēdiatl",
        "nstab-special": "Noncuahquizqui tlahcuilolli",
        "nstab-mediawiki": "Tlahcuilōltzintli",
        "nstab-template": "Nemachiòtl",
        "nstab-help": "Tèpalèwilistli",
-       "nstab-category": "Tlaìxmatkàyòtlàlilòtl",
+       "nstab-category": "Neneuhcayotl",
        "mainpage-nstab": "Yacatlahcuilolli",
        "nosuchaction": "Ahmo ia tlachīhualiztli",
        "nosuchspecialpage": "Âmò ka inòn nònkuâkìskàtlaìxtlapalli",
        "loginlanguagelabel": "Tlahtōlli: $1",
        "pt-login": "Xicalaqui",
        "pt-login-button": "Xicalaqui",
-       "pt-createaccount": "Xicchīhua motlapōhual",
+       "pt-createaccount": "Xicchihua motlapohual",
        "pt-userlogout": "Tiquizaz",
        "changepassword": "Xicpatla motlahtōlichtacāyo",
        "resetpass_header": "Xicpatla motlahtōlichtacāyo",
        "subject": "Ītechpa:",
        "minoredit": "Ca tepitōn inīn tlapatlaliztli",
        "watchthis": "Xicpiya inīn tlaīxtli",
-       "savearticle": "Xicpiya tlaīxtli",
+       "savearticle": "Xicpiya tlahcuilolli",
        "preview": "Xiquitta achtochīhualiztli",
        "showpreview": "Xiquitta achtochīhualiztli",
        "showdiff": "Xicnēxti tlapatlaliztli",
        "history-title": "«$1» ītlaceppahuiliztlahtōllo",
        "lineno": "Pāntli $1:",
        "editundo": "Ticxitiniz",
-       "searchresults": "Tlatēmoliztli",
-       "searchresults-title": "«$1» tlatēmōliztli īmochīhualiz",
+       "searchresults": "motlatemoliz itlananquilizhuan",
+       "searchresults-title": "«$1» tlatemoliztli imochihualiz",
        "prevn": "{{PLURAL:$1|$1}} achtopa",
        "nextn": "niman {{PLURAL:$1|$1}}",
        "shown-title": "Quinēxiltīz $1 {{PLURAL:$1|mochīhualiztli}} cece āmac",
        "action-block": "tiquitzacuilīz inīn tlatequitiltilīlli",
        "action-userrights": "tiquimpatlāz mochi tlatequitiltilīlli huelītiliztli",
        "nchanges": "$1 {{PLURAL:$1|tlapatlaliztli}}",
-       "enhancedrc-history": "tlahtōllōtl",
+       "enhancedrc-history": "Tlahtollotl",
        "recentchanges": "Yancuic tlapatlaliztli",
        "recentchanges-legend": "Yancuīc tlapatlaliztechcopa tlanequiliztli",
        "recentchanges-summary": "Xiquinttāz in achi yancuīc ahmo occequīntīn tlapatlaliztli huiquipan inīn zāzanilpan.",
        "newsectionsummary": "Yancuīc tlahtōltzintli: /* $1 */",
        "recentchangeslinked": "Tlapatlaliztli tzonhuilizpan",
        "recentchangeslinked-feed": "Tlapatlaliztli tzonhuilizpan",
-       "recentchangeslinked-toolbox": "Tlapatlaliztli tzonhuilizpan",
+       "recentchangeslinked-toolbox": "Itloc itlapatlalizhuan",
        "recentchangeslinked-title": "Tlapatlaliztli \"$1\" ītechcopa",
        "recentchangeslinked-page": "Tlaīxtli ītōcā:",
-       "upload": "Tlahcuilōlquetza",
+       "upload": "Tlahcuilolquetzaliztli",
        "uploadbtn": "Tlahcuilōlquetza",
        "uploadnologin": "Ahmo ōtimocalac",
        "uploaderror": "Tlaquetzaliztli ahcuallōtl",
        "filehist-thumb": "Īxiptlahtōn",
        "filehist-user": "Tequihuihqui",
        "filehist-dimensions": "Octacayōtl",
-       "filehist-comment": "TlahtōIcaquiliztīlōni",
+       "filehist-comment": "TlahtoIcaquiliztiloni",
        "imagelinks": "In canin oquitlalihqueh",
        "linkstoimage": "Inīn {{PLURAL:$1|zāzanilli motzonhuilia|$1 zāzanilli motzonhuiliah}} inīn tlahcuilōlhuīc:",
        "nolinkstoimage": "Ahmo cateh zāzaniltin tlein tzonhuiliah inīn tlahcuilōlhuīc.",
        "sp-contributions-search": "Tiquintlatēmōz tlapatlaliztli",
        "sp-contributions-username": "IP nozo tlatequitiltilīlli ītōcā:",
        "sp-contributions-submit": "Tlatēmōz",
-       "whatlinkshere": "In tlein quitzonhuilia nicān",
+       "whatlinkshere": "In tlein quitzonhuilia nican",
        "whatlinkshere-title": "Zāzaniltin quitzonhuiliah $1",
        "whatlinkshere-page": "Zāzanilli:",
        "linkshere": "Inīn zāzaniltin quitzonhuiliah '''[[:$1]]''' īhuīc:",
        "infiniteblock": "ahtlamic",
        "expiringblock": "tlami īpan $1 īpan $2",
        "anononlyblock": "zan ahtōcā",
-       "blocklink": "ticzacuilīz",
+       "blocklink": "tictzacuiliz",
        "unblocklink": "ahtiquitzacuilīz",
        "change-blocklink": "Ticpatlaz tlatzacualli",
        "contribslink": "tlapatlaliztli",
        "tooltip-pt-mycontris": "{{GENDER:|Motlahcuilōl}}",
        "tooltip-pt-login": "Tihuelīti timocalaqui, tēl ahmo tihuīquilia.",
        "tooltip-pt-logout": "Tiquīzāz",
-       "tooltip-ca-talk": "Inīn tlahcuilōlli zānīllī ītechcopa",
-       "tooltip-ca-edit": "Xicpatla inīn tlaīxtli",
+       "tooltip-ca-talk": "Iteixnamiquiliz itechpa inin tlahcuilolli",
+       "tooltip-ca-edit": "Ticpatlaz inin tlahcuilolli",
        "tooltip-ca-addsection": "Tictzintīz yancuic xeliuhcāyōtl.",
        "tooltip-ca-viewsource": "Inīn zāzanilli ōmoquīxti. Tihuelīti tiquitta ītlahtōlcaquiliztilōni.",
        "tooltip-ca-history": "Achtopa āxcān zāzanilli īhuān in tlatequitiltilīlli ōquinchīuhqueh",
        "tooltip-ca-delete": "Ticpolōz inīn zāzanilli",
        "tooltip-ca-undelete": "Ahticpolōz inīn zāzanilli",
        "tooltip-ca-move": "Ticzacāz inīn zāzanilli",
-       "tooltip-ca-watch": "Ticcēntilīz inīn zāzanilli motlachiyalizhuīc",
+       "tooltip-ca-watch": "Ticcentiliz inin tlahtolli motecpanaliz",
        "tooltip-ca-unwatch": "Ahtictlachiyāz inīn zāzanilli",
-       "tooltip-search": "Tlatēmōz īpan {{SITENAME}}",
+       "tooltip-search": "Tlatemoliztli ipan {{SITENAME}}",
        "tooltip-search-go": "Tiyaz ihuicpa tlahcuilolli ica inin huel melahuac tocaitl intla oncah",
-       "tooltip-search-fulltext": "Tictemōz inīn tlahcuilōlli in āmac",
-       "tooltip-p-logo": "Xiquitta in tohuēyitlaīx",
+       "tooltip-search-fulltext": "Tictemoz inin tlahcuilolli ipan amatl",
+       "tooltip-p-logo": "Tiquittaz in yacatlahcuilolli",
        "tooltip-n-mainpage": "Tiquittaz in yacatlahcuilolli",
-       "tooltip-n-mainpage-description": "Xiquitta in tohuēyitlaīx",
+       "tooltip-n-mainpage-description": "Tiquittaz in yacatlahcuilolli",
        "tooltip-n-portal": "Tlachīhualiztechcopa, inōn tihuelīti titlachīhua, tlatēmoyān",
        "tooltip-n-recentchanges": "Yancuic īpan tlapatlaliztli in huiqui",
        "tooltip-n-randompage": "Tiquittaz centlaīxtli",
        "tooltip-n-help": "In tēmachtīlōyān",
        "tooltip-t-whatlinkshere": "Mochīntīn zāzaniltin huiquipan quitzonhuiliah nicān",
-       "tooltip-t-recentchangeslinked": "Yancuic tlapatlaliztli inīn zāzanilhuīcpa moquintzonhuilia",
+       "tooltip-t-recentchangeslinked": "Yancuic tlapatlaliztli ipan tlahcuiloltin tlein quitzonhuilia nican",
        "tooltip-feed-rss": "RSS tlachicāhualiztli inīn zāzaniltechcopa",
        "tooltip-feed-atom": "Atom tlachicāhualiztli inīn zāzaniltechcopa",
        "tooltip-t-contributions": "Tlapōhualmatl ītechpa {{GENDER:$1|inīn tlatequitiltilīlli}} ītlahcuilōl",
        "tooltip-t-emailuser": "Tiquihcuilōz inīn tlatequitiltililhuīc",
-       "tooltip-t-upload": "Tiquinquetzāz tlahcuilōlli",
-       "tooltip-t-specialpages": "Ìntlapòpòwaltekpànal mochtìn in nònkuâkìskàtlaìxtlapaltìn",
-       "tooltip-t-print": "Tepoztlahcuilōlli",
-       "tooltip-ca-nstab-main": "Xiquitta in tlamantlaīxtli",
+       "tooltip-t-upload": "Tiquinquetzaz tlahcuiloltin",
+       "tooltip-t-specialpages": "Intlahtoltecpanaliz mochtin in noncuahquizquitlahcuiloltin",
+       "tooltip-t-print": "Tepoztlahcuilolli",
+       "tooltip-ca-nstab-main": "Tiquittaz tlein quipiya in tlahcuilolli",
        "tooltip-ca-nstab-user": "Xiquitta tlatequitiltilīlli īzāzanil",
        "tooltip-ca-nstab-special": "Inīn nōncuahquīzqui āmatl, auh ahmohuelitizpatla",
        "tooltip-ca-nstab-project": "Xiquitta in tlatequipanōllaīxtli",
        "tooltip-ca-nstab-mediawiki": "Xiquitta in tlahcuilōltzin",
        "tooltip-ca-nstab-template": "Xiquitta in nemachiyōtīlli",
        "tooltip-ca-nstab-help": "Xiquitta in tēpalēhuiliztli zāzanilli",
-       "tooltip-ca-nstab-category": "Mà mỏta ìtlaìxtlapal in tlaìxmatkàyòtlàlilòtl",
+       "tooltip-ca-nstab-category": "tiquittaz neneuhcayotl itlahcuilol",
        "tooltip-minoredit": "Ticmachiyōz quemeh tlapatlalitzintli",
        "tooltip-save": "Ticpiyaz mopatlaliz",
        "tooltip-preview": "Xachtopaitta mopatlaliz ¡Timitztlahtlauhtiliah, xicchīhua yēppa mā tiquimpiya!",
        "widthheightpage": "$1 × $2, $3 {{PLURAL:|zāzanilli|zāzanilli}}",
        "file-info-size": "$1 × $2 pixel; zāzanilli octacayōtl: $3; machiyōtl MIME: $4",
        "file-nohires": "Ahmo ia achi cualli ahmo occē īxiptli.",
-       "show-big-image": "Tzīntilicihcuilōlli",
+       "show-big-image": "Tzintiliztlahcuilolli",
        "newimages": "Yancuīc īxipcān",
        "imagelisttext": "Nicān {{PLURAL:$1|mopiya|mopiyah}} '''$1''' īxiptli $2 iuhcopa.",
        "noimages": "Ahtlein ic tlatta.",
index b46c21b..2b1bc3e 100644 (file)
        "newarticle": "(Sin)",
        "newarticletext": "Lí tòe 1 ê liân-kiat lâi kàu 1 bīn iáu-bōe chûn-chāi ê ia̍h. Beh khai-sí pian-chi̍p chit ia̍h, chhiáⁿ tī ē-kha ê bûn-jī keh-á lāi-té phah-jī. ([$1 Bo̍k-lio̍k] kà lí án-choáⁿ chìn-hêng.) Ká-sú lí bô-tiuⁿ-tî lâi kàu chia, ē-sai chhi̍h liû-lám-khì ê '''téng-1-ia̍h''' tńg--khì.",
        "anontalkpagetext": "----''Pún thó-lūn-ia̍h bô kò·-tēng ê kháu-chō/hō·-thâu, kan-na ū 1 ê IP chū-chí (chhin-chhiūⁿ 123.456.789.123). In-ūi bô kāng lâng tī bô kāng sî-chūn ū khó-lêng tú-hó kong-ke kāng-ê IP, lâu tī chia ê oē ū khó-lêng hō· bô kāng lâng ê! Beh pī-bián chit khoán būn-tê, ē-sái khì [[Special:UserLogin|khui 1 ê hō·-thâu a̍h-sī teng-ji̍p]].''",
-       "noarticletext": "這頁這馬無內容,你會使佇別頁[[Special:Search/{{PAGENAME}}|揣這頁標題]],\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 揣相關日誌],\n抑[{{fullurl:{{FULLPAGENAME}}|action=edit}} 這頁]</span>。",
+       "noarticletext": "這頁這馬無內容,你會使佇別頁[[Special:Search/{{PAGENAME}}|揣這頁標題]],\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 揣相關日誌],\n抑[{{fullurl:{{FULLPAGENAME}}|action=edit}} 創造這頁]</span>。",
        "clearyourcache": "'''Chù-ì:''' Pó-chûn liáu-āu, tio̍h ē-kì leh kā liû-lám-khì ê cache piàⁿ tiāu chiah khoàⁿ-ē-tio̍h kái-piàn: *'''Firefox / Safari:''' chhi̍h tiâu \"Shift\" kâng-sî-chūn tiám-kik ''Reload/têng-sin chài-ji̍p'' a̍h-sī chhi̍h ''Ctrl-F5'' \"Ctrl-R\" kî-tiong chi̍t ê (''Command-R'' tī Mac) \n* '''Google Chrome:''' chhi̍h ''Ctrl-Shift-R'' (''Command-Shift-R'' tī Mac)\n'''Internet Explorer :'''chhi̍h tiâu \"Ctrl\" kâng-sî-chūn tiám-kek ''Refresh/têng-sin chài-ji̍p'' a̍h-sī chhi̍h \"Ctrl-F5\" \n* '''Konqueror:'''  tiám-kek ''Reload/têng-sin chài-ji̍p'' a̍h-sī chhi̍h ''F5''\n* '''Opera:''' piàⁿ-tiāu cache tī ''Tools(ke-si) → Preferences(siat-piān)''",
        "usercssyoucanpreview": "'''Phiat-pō·''': Pó-chûn chìn-chêng ē-sái chhi̍h 'Seng khoàⁿ-māi' kiám-cha sin ê CSS a̍h-sī JavaScript.",
        "userjsyoucanpreview": "'''Phiat-pō·''': Pó-chûn chìn-chêng ē-sái chhi̍h 'Seng khoàⁿ-māi' kiám-cha sin ê CSS a̍h-sī JavaScript.",
        "searchprofile-everything-tooltip": "Chhoē choân-pō͘ (pau-koat thó-lūn-ia̍h)",
        "searchprofile-advanced-tooltip": "佇你家己設的名空間內底揣",
        "search-result-size": "$1 ({{PLURAL:$2|1 jī-goân|$2 jī-goân}})",
-       "search-redirect": "($1 轉)",
+       "search-redirect": "(Tùi $1 choán--kòe)",
        "search-section": "(toān-lo̍h $1)",
        "searchall": "choân-pō·",
        "showingresults": "Ē-kha tùi #<b>$2</b> khai-sí hián-sī <b>$1</b> hāng kiat-kó.",
        "filemissing": "Bô tóng-àn",
        "import": "Su-ji̍p ia̍h",
        "tooltip-pt-userpage": "{{GENDER:|Lí ê iōng-chiá}} ê ia̍h",
-       "tooltip-pt-mytalk": " ê thó-lūn ia̍h",
+       "tooltip-pt-mytalk": "{{GENDER:Lí}} ê thó-lūn ia̍h",
        "tooltip-pt-preferences": "{{GENDER:|Lí ê}} siat-tēng",
        "tooltip-pt-watchlist": "你監視的頁有改過的清單",
-       "tooltip-pt-mycontris": " ê kòng-hiàn lia̍t-toaⁿ",
+       "tooltip-pt-mycontris": "{{GENDER:|Lí}} ê kòng-hiàn lia̍t-toaⁿ",
        "tooltip-pt-login": "Hi-bāng lí teng-ji̍p; m̄-ko bô kiông-chè",
        "tooltip-pt-logout": "Teng-chhut",
        "tooltip-pt-createaccount": "Kiàn-gī lí seng khui chi̍t-ê kháu-chō (bô-it-tēng ài); chiah koh teng-ji̍p.",
        "metadata-collapse": "Am iù-chiat",
        "metadata-fields": "佇顯示圖片的頁,若掀開元資料,下跤的EXIF資料會儂看著。其他的元資料是先看無。\n* 廠商\n* 機型\n* 翕像的時陣\n* 曝光\n* 光圈\n* ISO 速率\n* 焦距\n* 作者\n* 版權\n* 說明\n* 緯度(GPS)\n* 經度(GPS)\n* 海拔(GPS)",
        "exif-software": "Sú-iōng ê nńg-thé",
+       "exif-colorspace": "Sek-chhái khong-kan",
        "namespacesall": "choân-pō·",
        "monthsall": "choân-pō͘",
        "confirmemail": "Khak-jīn e-mail chū-chí",
        "version": "Pán-pún",
        "specialpages": "Te̍k-sû-ia̍h",
        "tag-filter": "[[Special:Tags|Piau-chhiam]] chhoē mi̍h:",
-       "tag-list-wrapper": "([[Special:Tags|$1 ê piau-chhiam]]: $2)",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|piau-chhiam}}]]: $2)",
        "logentry-move-move": "$1 {{GENDER:$2|sóa}} $3 chit ia̍h khì $4",
        "logentry-newusers-create": "已經{{GENDER:$2|開好}}用者口座 $1",
        "searchsuggest-search": "Chhoē {{SITENAME}}",
index 20db454..f3f5855 100644 (file)
        "grant-basic": "Grunnleggende rettigheter",
        "grant-viewdeleted": "Vise slettede filer og sider",
        "grant-viewmywatchlist": "Vise overvåkningslisten din",
+       "grant-viewrestrictedlogs": "Vis begrensede loggposter",
        "newuserlogpage": "Brukeropprettelseslogg",
        "newuserlogpagetext": "Dette er en logg over brukeropprettelser.",
        "rightslog": "Brukerrettighetslogg",
        "activeusers-intro": "Dette er en liste over brukere som har hatt en eller annen form for aktivitet innenfor {{PLURAL:$1|den siste dagen|de siste dagene}}.",
        "activeusers-count": "$1 {{PLURAL:$1|endring|endringer}} {{PLURAL:$3|det siste døgnet|de siste $3 dagene}}",
        "activeusers-from": "Vis brukere fra og med:",
-       "activeusers-hidebots": "Skjul roboter",
-       "activeusers-hidesysops": "Skjul administratorer",
        "activeusers-noresult": "Ingen brukere funnet.",
        "activeusers-submit": "Vis",
        "listgrouprights": "Rettigheter for brukergrupper",
        "movelogpagetext": "Her er ei liste over sider som har blitt flyttet.",
        "movesubpage": "{{PLURAL:$1|Underside|Undersider}}",
        "movesubpagetext": "Denne siden har {{PLURAL:$1|én underside|$1 undersider}} som vises nedenfor.",
+       "movesubpagetalktext": "Den tilsvarende diskusjonssiden har $1 {{PLURAL:$1|underside|undersider}} som vises nedenfor.",
        "movenosubpage": "Denne siden har ingen undersider.",
        "movereason": "Årsak:",
        "revertmove": "tilbakestill",
        "pageinfo-category-pages": "Antall sider",
        "pageinfo-category-subcats": "Antall underkategorier",
        "pageinfo-category-files": "Antall filer",
+       "pageinfo-user-id": "Bruker-ID",
        "markaspatrolleddiff": "Merk som patruljert",
        "markaspatrolledtext": "Merk denne siden som patruljert",
        "markaspatrolledtext-file": "Merk denne filversjonen som patruljert",
        "usercssispublic": "Merk: CSS-undersidene bør ikke inneholde konfidensielle data siden de kan ses av andre brukere.",
        "restrictionsfield-badip": "Ugyldig IP-adresse eller intervall: $1",
        "restrictionsfield-label": "Tillatte IP-intervaller:",
-       "restrictionsfield-help": "Én IP-adresse eller CIDR-intervall per linje. For å slå på alt, bruk <br /><code>0.0.0.0/0</code><br /><code>::/0</code>"
+       "restrictionsfield-help": "Én IP-adresse eller CIDR-intervall per linje. For å slå på alt, bruk <br /><code>0.0.0.0/0</code><br /><code>::/0</code>",
+       "edit-error-short": "Feil: $1",
+       "edit-error-long": "Feil:\n\n$1"
 }
index 0456e94..3babc10 100644 (file)
@@ -21,7 +21,9 @@
                        "Nirjal stha",
                        "राम प्रसाद जोशी",
                        "Matma Rex",
-                       "जनक राज भट्ट"
+                       "जनक राज भट्ट",
+                       "Suniltheblue",
+                       "Irus"
                ]
        },
        "tog-underline": "रेखाङ्कित लिङ्क:",
        "category-file-count-limited": "निम्न  {{PLURAL:$1|फाइल|$1 फाइलहरू}} यस श्रेणीमा रहेको ।",
        "listingcontinuesabbrev": "निरन्तरता...",
        "index-category": "क्रमाङ्कित पृष्ठहरू",
-       "noindex-category": "à¤\95à¥\8dरमाà¤\99à¥\8dà¤\95न नगरिएका पृष्ठहरू",
+       "noindex-category": "à¤\85नà¥\81à¤\95à¥\8dरमण नगरिएका पृष्ठहरू",
        "broken-file-category": "टुटेको फाइल लिङ्कहरूसितको पृष्ठ",
        "about": "बारेमा",
        "article": "सामाग्री पृष्ठ",
        "talk": "वार्तालाप",
        "views": "अवलोकनहरू",
        "toolbox": "औजारहरू",
+       "tool-link-userrights": "परिवर्तन {{GENDER:$1|प्रयोगकर्ता}} समूह",
+       "tool-link-emailuser": "{{GENDER:$1|प्रयोगकर्ता}} लाई इमेल गर्ने",
        "userpage": "प्रयोगकर्ता पृष्ठ हेर्ने",
        "projectpage": "आयोजना पृष्ठ हेर्ने",
        "imagepage": "फाइल पृष्ठ हेर्नुहोस्",
        "privacy": "गोपनियता नीति",
        "privacypage": "Project:गोपनीयता नीति",
        "badaccess": "अनुमतिमा त्रुटि",
-       "badaccess-group0": "तपाà¤\88à¤\81ले अनुरोध गरेको कार्य गर्न तपाईंलाई अनुमति दिइएको छैन।",
+       "badaccess-group0": "तपाà¤\88à¤\82ले अनुरोध गरेको कार्य गर्न तपाईंलाई अनुमति दिइएको छैन।",
        "badaccess-groups": "तपाईंले अनुरोध गर्नुभएको कार्य  {{PLURAL:$2|समूह |कुनै एक समूह}}: $1 मा रहेका प्रयोगकर्ताहरूले मात्र गर्नसक्छन ।",
        "versionrequired": "MediaWiki संस्करण $1 चाहिने",
        "versionrequiredtext": "यो पृष्ठ प्रयोग गर्नको लागि MediaWiki $1 संस्करण चाहिन्छ ।\nहेर्नुहोस्  [[Special:Version|version page]]",
        "backlinksubtitle": "← $1",
        "retrievedfrom": " \"$1\" बाट निकालिएको",
        "youhavenewmessages": "तपाईंको लागि ($2) मा  $1 छ ।",
-       "youhavenewmessagesfromusers": "तपाईंको लागि {{PLURAL:$3|प्रयोगकर्ता|$3 प्रयोगकर्ताहरू}} का $1 छन् । ($2)",
+       "youhavenewmessagesfromusers": "{{PLURAL:$4|तपाईंको लागि}} {{PLURAL:$3|प्रयोगकर्ता|$3 प्रयोगकर्ताहरू}}का $1 छन् । ($2)",
        "youhavenewmessagesmanyusers": "तपाईंलाई धेरै प्रयोगकर्ताहरू($2) बाट $1 छ ।",
        "newmessageslinkplural": "{{PLURAL:$1|एउटा नयाँ सन्देश|999=नयाँ सन्देशहरू}}",
        "newmessagesdifflinkplural": "अन्तिम {{PLURAL:$1|परिवर्तन|999=परिवर्तनहरू}}",
        "nosuchaction": "यस्तो कार्य हैन",
        "nosuchactiontext": "URL ले खुलाएको कार्य मान्य छैन ।\nतपाईंले URL गलत टाइपगर्नु भएको , वा गलत लिंक पछ्याउनु भएको हुनसक्छ ।\nयो{{SITENAME}}ले सफ्टवेयरमा भएको गल्ति देखाएको पनि हुनसक्छ ।",
        "nosuchspecialpage": "त्यस्तो विशेष पृष्ठ छैन",
-       "nospecialpagetext": "<strong>तपाà¤\88à¤\81ले अनुरोध गर्नुभएको विशेष पृष्ठ अमान्य छ ।</strong>\n\nमान्य पृष्ठहरूको सूची यहाँ [[Special:SpecialPages|{{int:specialpages}}]] उपलब्ध छ ।",
+       "nospecialpagetext": "<strong>तपाà¤\88à¤\82ले अनुरोध गर्नुभएको विशेष पृष्ठ अमान्य छ ।</strong>\n\nमान्य पृष्ठहरूको सूची यहाँ [[Special:SpecialPages|{{int:specialpages}}]] उपलब्ध छ ।",
        "error": "त्रुटि",
        "databaseerror": "डेटावेस त्रुटि",
        "databaseerror-text": "डेटाबेस क्वेरीमा खराबी देखा पर्‌यो ।\nयसले सफ्टवेयरमा त्रुटी रहेको इङ्गित गर्न सक्छ ।",
        "mypreferencesprotected": "तपाईंसँग तपाईंको अभिरुचीहरू सम्पादन गर्ने अनुमती छैन",
        "ns-specialprotected": "विशेष पृष्ठहरू सम्पादन गर्न सकिदैन।",
        "titleprotected": "[[User:$1|$1]]द्वारा यो शीर्षक निर्माणहुनबाट जोगाइएको छ।\nकारण <em>$2</em> हो ।",
-       "filereadonlyerror": "फाà¤\87ल \"$1\" à¤²à¤¾à¤\88 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤\97रà¥\8dन à¤¸à¤\95िà¤\81दà¥\88न à¤\95िन à¤­à¤¨à¥\87 à¤«à¤¾à¤\87ल à¤­à¤£à¥\8dडार  \"$2\" à¤\95à¥\87वल à¤ªà¤¢à¥\8dनà¥\87 à¤¸à¥\8dथिति (read-only mode)मा à¤\9b।\n\nयसलाà¤\88 à¤¸à¥\81रà¤\95à¥\8dषित à¤\97रà¥\8dनà¥\87 à¤ªà¥\8dरवनà¥\8dधà¤\95लà¥\87  à¤¯à¥\8b à¤\95ारण à¤¦à¤¿à¤\8fà¤\95ाà¤\9bनà¥\8d : ''$3''।",
+       "filereadonlyerror": "à¤\85à¤\95à¥\8dषम à¤\97रà¥\8dन à¤ªà¤°à¤¿à¤®à¤¾à¤°à¥\8dà¤\9cन à¤«à¤¾à¤\87ल \"$1\" à¤«à¤¾à¤\87ल à¤­à¤£à¥\8dडार \"$2\" à¤®à¤¾ à¤ªà¤¢à¥\8dन-मातà¥\8dर à¤®à¥\8bड à¥¤ \n\nपà¥\8dरणालà¥\80 à¤ªà¥\8dरशासà¤\95 à¤¬à¤¨à¥\8dद à¤\97रà¥\8dनà¥\87 à¤¯à¥\8b à¤\9aढाà¤\8fà¤\95à¥\8b à¤¯à¥\8b à¤µà¥\8dयाà¤\96à¥\8dया: \"$3\".",
        "invalidtitle-knownnamespace": "नेमस्पेस \"$2\" तथा अक्षर \"$3\" सहितको अवैश शिर्षक",
        "invalidtitle-unknownnamespace": "अज्ञात नेमस्पेस अंक $1 तथा अक्षर \"$2\" भएको अवैध शिर्षक",
        "exception-nologin": "प्रवेश (लग ईन) नगरिएको",
        "virus-scanfailed": "पढाइ असफल(कोड $1)",
        "virus-unknownscanner": "अज्ञात एन्टीभाइरस:",
        "logouttext": "<strong>तपाईं अहिले बाहिर निस्कनु भएको छ।</strong>\n\nयाद राख्नुहोस् तपाईंले ब्राउजरको क्याच खालि नगर्दासम्म कुनै पृष्ठहरूमा तपाईं अझै प्रवेश गरिरखेको देखाउन सक्छ।",
+       "cannotlogoutnow-title": "अब लगआउट गर्न सकिँदैन",
+       "cannotlogoutnow-text": "लग आउट सम्भव छैन प्रयोग गर्दा $1.",
        "welcomeuser": "$1जी स्वागत छ!",
        "welcomecreation-msg": "तपाईंको खाता तयार भयो । \nतपाईंले चाहनु भएको खण्डमा {{SITENAME}} [[Special:Preferences|प्राथमिकताहरू]] परिवर्तन गर्न सक्नु हुनेछ ।",
        "yourname": "प्रयोगकर्ता नाम:",
        "createacct-yourpasswordagain-ph": "फेरि पासवर्ड लेख्नुहोस्",
        "userlogin-remembermypassword": "मलाई प्रवेश गराइराख्ने",
        "userlogin-signwithsecure": "सुक्षित जडान प्रयोग गर्ने",
+       "cannotlogin-title": "मा लग गर्न सक्दैनौं",
+       "cannotcreateaccount-title": "सिर्जना गर्न सकिँदैन खाता",
+       "cannotcreateaccount-text": "प्रत्यक्ष खाता सिर्जना सक्षम छैन on this wiki.",
        "yourdomainname": "तपाईंको ज्ञानक्षेत्र(डोमेन):",
        "password-change-forbidden": "यो विकिमा पासवर्ड परिवर्तन गर्न सक्नुहुन्न।",
        "externaldberror": "यहाँ प्रमाणिकरण डेटाबेस त्रुटि भयो या त तपाईंलाई आफ्नो बाहिरी खाता अद्यतन गर्ने अनुमति छैन।",
        "userlogin-createanother": "अर्को खाता खोल्नुहोस्",
        "createacct-emailrequired": "इमेल ठेगाना",
        "createacct-emailoptional": "इमेल ठेगाना (ऐच्छिक)",
-       "createacct-email-ph": "तपाà¤\88à¤\81को इमेल ठेगाना भर्नुहोस्",
+       "createacct-email-ph": "तपाà¤\88à¤\82को इमेल ठेगाना भर्नुहोस्",
        "createacct-another-email-ph": "इमेल ठेगाना भर्नुहोस्",
        "createaccountmail": "कुनै अस्थाई र श्रिजित पासवर्ड प्रयोग गर्ने र खुलाईएको इमेलमा पठाउने",
        "createacct-realname": "वास्तविक नाम (ऐच्छिक)",
        "wrongpasswordempty": "हालिएको पासवर्ड खालि थियो।\nकृपया फेरी प्रयास गर्नुहोला।",
        "passwordtooshort": "पासवर्ड कम्तिमा {{PLURAL:$1|१ अक्षर|$1 अक्षरहरू}}को हुनुपर्छ।",
        "passwordtoolong": "पासवर्ड {{PLURAL:$1|१ अक्षर|$1 अक्षरहरू}} भन्दा लामो हुनु हुदैन ।",
-       "password-name-match": "तपाà¤\88à¤\81à¤\95à¥\8b à¤ªà¥\8dरवà¥\87शशव्द प्रयोगकर्ता नाम भन्दा फरक हुनुपर्छ ।",
+       "password-name-match": "तपाà¤\88à¤\82à¤\95à¥\8b à¤ªà¥\8dरवà¥\87शशब्द प्रयोगकर्ता नाम भन्दा फरक हुनुपर्छ ।",
        "password-login-forbidden": "यो प्रयोगकर्ता नाम र प्रवेश शब्द वर्जित गरिएकोछ ।",
        "mailmypassword": "पासवर्ड पूर्वनिर्धारित गर्नुहोस्",
        "passwordremindertitle": "{{SITENAME}}को लागि नयाँ अस्थायी पासवर्ड",
        "user-mail-no-addy": "इमेल ठेगाना बिना नै इमेल पठाउन खोजिएको थियो।",
        "user-mail-no-body": "खाली वा ज्यादै न्युन सन्देश भएको इमेल पठाउन खोजिएको ।",
        "changepassword": "पासवर्ड परिवर्तन गर्नुहोस्",
-       "resetpass_announce": "पà¥\8dरवà¥\87श à¤ªà¥\82रा à¤\97रà¥\8dन à¤¤à¤ªà¤¾à¤\88à¤\81ले पासवर्ड परिवर्तन गर्नुपर्छ।",
+       "resetpass_announce": "पà¥\8dरवà¥\87श à¤ªà¥\82रा à¤\97रà¥\8dन à¤¤à¤ªà¤¾à¤\88à¤\82ले पासवर्ड परिवर्तन गर्नुपर्छ।",
        "resetpass_text": "<!-- Add text here -->",
        "resetpass_header": "खाताको पासवर्ड परिवर्तन गर्ने",
        "oldpassword": "पुरानो पासवर्ड:",
        "changepassword-success": "तपाईंको पासवर्ड सफलतापूर्वक परिवर्तन भयो!",
        "changepassword-throttled": "तपाईंले भर्खरै धेरै पल्ट प्रवेश (लग इन)को निम्ति प्रयास गर्नुभएको छ। \nकृपया $1 पर्खेर मात्र प्रयास गर्नुहोस्।",
        "resetpass_forbidden": "पासवर्ड परिवर्तन गर्न मिल्दैन",
-       "resetpass-no-info": "यà¥\8b à¤ªà¥\83षà¥\8dठ à¤¸à¤¿à¤§à¥\88 à¤¹à¥\87रà¥\8dनà¤\95à¥\8b à¤²à¤¾à¤\97ि à¤¤à¤ªà¤¾à¤\88à¤\81ले प्रवेश गर्नुपर्छ ।",
+       "resetpass-no-info": "यà¥\8b à¤ªà¥\83षà¥\8dठ à¤¸à¤¿à¤§à¥\88 à¤¹à¥\87रà¥\8dनà¤\95à¥\8b à¤²à¤¾à¤\97ि à¤¤à¤ªà¤¾à¤\88à¤\82ले प्रवेश गर्नुपर्छ ।",
        "resetpass-submit-loggedin": "प्रवेसशब्द परिवर्तन गर्ने",
        "resetpass-submit-cancel": "रद्द गर्ने",
        "resetpass-wrong-oldpass": "अस्थायी अथवा हालिएको प्रवेश शब्द अमान्य\nतपाईंले अघिबाट नैं प्रवेश शब्द सफलता पूर्वक परिवर्तन गरिसक्नु भएको हो वा नयाँ प्रवेश शब्दको निम्ति निवेदन गर्नुभएकोछ।",
        "missingsummary": "'''यादगर्नुहोस् :''' तपाईंले सम्पादन सारांश दिनुभएको छैन ।\nयदि तपाईंले \"{{int:savearticle}}\"  थिच्नुभयो भने , सारांश बिना नै संग्रहित गरिने छ ।",
        "selfredirect": "<strong>चेतावनी:</strong> तपाईं यस पृष्ठलाई आफुमा पुनः निर्देशित गर्दै हुनुहुन्छ।\nहुनसक्छ तपाईं अनुप्रेषितको लागि गलत लक्ष्य निर्दिष्ट गर्दै हुनुहुन्छ, वा गलत पृष्ठको सम्पादन गर्दै हुनुहुन्छ।\nतपाईं पुनः एकपटक \"{{int:savearticle}}\" क्लिक गर्नुहुन्छ, पुनः निर्देशित त्यसै पनि बनाइनेछ।",
        "missingcommenttext": "कृपया टिप्पणी प्रविष्ठ गर्नुहोस् ।",
-       "missingcommentheader": "'''याद गर्नुहोस् :''' तपाईँले टिप्पणीमा विषय /शीर्ष पंक्ति  दिनुभएको छैन ।\nतपाईँले फेरि \"{{int:savearticle}}\"  थिच्नु भएमा , तपाईंको सम्पादन यसै रुपमा संग्रहित हुनेछ ।",
+       "missingcommentheader": "<strong>याद गर्नुहोस् :</strong> तपाईंले टिप्पणीमा विषय /शीर्ष पंक्ति  दिनुभएको छैन ।\nतपाईंले फेरि \"{{int:savearticle}}\"  थिच्नु भएमा , तपाईंको सम्पादन यसै रुपमा सङ्ग्रहित हुनेछ ।",
        "summary-preview": "सारांश पूर्वालोकन:",
        "subject-preview": "विषय/शीर्षपंक्ति पूर्वरुप:",
        "previewerrortext": "तपाईंको परिवर्तनको पूर्वावलोकन बनाउन खोज्दा समस्या आएको छ ।",
        "accmailtitle": "पासवर्ड पठाइयो",
        "accmailtext": "जथाभावीरूपमा सृजना गरिएको प्रवेशशब्द प्रयोगकर्ता [[User talk:$1|$1]] को  $2 मा पठाइएको छ।\n\nयो नयाँ खाताको प्रवेशशब्द  ''[[Special:ChangePassword|change password]]'' मा प्रवेश गरेर परिवर्तन गर्न सकिन्छ ।",
        "newarticle": "(नयाँ)",
-       "newarticletext": "तपाà¤\88à¤\81लà¥\87 à¤\85हिलà¥\87 à¤¸à¤®à¥\8dम à¤¨à¤­à¤\8fà¤\95à¥\8b à¤ªà¥\83षà¥\8dठà¤\95à¥\8b à¤²à¤¿à¤\82à¤\99à¥\8dà¤\95 à¤ªà¤¹à¤¿à¤²à¥\8dयाà¤\89नà¥\81 à¤­à¤\8fà¤\95à¥\8b à¤\9b।\nयà¥\8b à¤ªà¥\83षà¥\8dठ à¤¨à¤¿à¤°à¥\8dमाण à¤\97रà¥\8dन à¤¤à¤²à¤\95à¥\8b à¤\95à¥\8bषà¥\8dठमा à¤\9fाà¤\87प à¤\97रà¥\8dनà¥\81हà¥\8bसà¥\8d  à¥¤(थप à¤\9cानà¤\95ारà¥\80à¤\95à¥\8b à¤²à¤¾à¤\97ि [$1 help page] à¤¹à¥\87रà¥\8dनà¥\81हà¥\8bसà¥\8d )।\nयहाà¤\81 à¤¤à¥\8dयतà¥\8dतिà¤\95à¥\88 à¤\86à¤\87पà¥\81à¤\97à¥\8dनà¥\81 à¤­à¤\8fà¤\95à¥\8b à¤¹à¥\8b à¤­à¤¨à¥\87 , à¤¬à¥\8dराà¤\89à¤\9cरà¤\95à¥\8b  '''back''' à¤¬à¤\9fन à¤¥à¤¿à¤\9aà¥\8dनà¥\81हà¥\8bस ।",
+       "newarticletext": "तपाà¤\88à¤\82लà¥\87 à¤\85हिलà¥\87 à¤¸à¤®à¥\8dम à¤¨à¤­à¤\8fà¤\95à¥\8b à¤ªà¥\83षà¥\8dठà¤\95à¥\8b à¤²à¤¿à¤\99à¥\8dà¤\95 à¤ªà¤¹à¤¿à¤²à¥\8dयाà¤\89नà¥\81 à¤­à¤\8fà¤\95à¥\8b à¤\9b।\nयà¥\8b à¤ªà¥\83षà¥\8dठ à¤¨à¤¿à¤°à¥\8dमाण à¤\97रà¥\8dन à¤¤à¤²à¤\95à¥\8b à¤\95à¥\8bषà¥\8dठमा à¤\9fाà¤\87प à¤\97रà¥\8dनà¥\81हà¥\8bसà¥\8d  à¥¤(थप à¤\9cानà¤\95ारà¥\80à¤\95à¥\8b à¤²à¤¾à¤\97ि [$1 help page] à¤¹à¥\87रà¥\8dनà¥\81हà¥\8bसà¥\8d )।\nयहाà¤\81 à¤¤à¥\8dयतà¥\8dतिà¤\95à¥\88 à¤\86à¤\87पà¥\81à¤\97à¥\8dनà¥\81 à¤­à¤\8fà¤\95à¥\8b à¤¹à¥\8b à¤­à¤¨à¥\87 , à¤¬à¥\8dराà¤\89à¤\9cरà¤\95à¥\8b  '''back''' à¤¬à¤\9fन à¤¥à¤¿à¤\9aà¥\8dनà¥\81हà¥\8bसà¥\8d ।",
        "anontalkpagetext": "----''यो वार्तालाप पृष्ठ अज्ञात प्रयोगकर्ताको हो जसले अहिलेसम्म खाता बनाएकै छैन, अथवा जसले यस पृष्ठको उपयोग गर्दैन।\nयस कारण हामीले उसलाई उसको आइ पी (IP) ठेगानाले चिन्न सक्छौं। \nयस्तो आइ पी (IP) ठेगाना धेरै प्रयोगकर्ताहरूको साझा हुनसक्छ।\nयदि तपाईं अज्ञात प्रयोगकर्ता हुनुहुन्छ र तपाईंमाथि अचाहिँदो टिप्पणी भएको अनुभव गर्नुहुन्छ भने भविष्यमा अन्य अज्ञात प्रयोगकर्तासितको भ्रमबाट बाँच्न कृपया [[Special:CreateAccount|खाता खोल्नुहोस्]] अथवा [[Special:UserLogin|प्रवेश गर्नुहोस्]] ''",
        "noarticletext": "यस लेखमा अहिले केहि पनि पाठ छैन ।\nतपाईंले अन्य पृष्ठमा [[Special:Search/{{PAGENAME}}|यस पृष्ठको शीर्षकको लागि खोज]] गर्न सक्नुहुन्छ ।\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} पृष्ठ सम्बन्धित ढड्डामा खोज],\nवा [{{fullurl:{{FULLPAGENAME}}|action=edit}}  यसै पृष्ठलाई सम्पादन गर्ने]</span>.",
        "noarticletext-nopermission": "यस लेखमा अहिले कुनै पनि पाठ छैन ।\nतपाईंले अन्य पृष्ठमा [[Special:Search/{{PAGENAME}}|यस पृष्ठको शीर्षकको लागि खोज]] गर्न सक्नुहुन्छ,\nअथवा <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|पृष्ठ={{FULLPAGENAMEE}}}} सम्बन्धित लगहरू खोज्न सक्नुहुनेछ ]</span> तर तपाईंलाई नयाँ पृष्ठ बनाउने अधिकार छैन।",
        "missing-revision": "\"{{FULLPAGENAME}}\" पृष्ठको अवतरण #$1 रहेको छैन।\n\nसामान्य रूपमा यसो एउटा हटाइएको पृष्ठको पुरानो लिङ्कमा क्लिक गर्दा हुन्छ।\nअधिक जानकारीको लागि तपाईं [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} हटाएको लग] हेर्न सक्नुहुन्छ।",
-       "userpage-userdoesnotexist": "पà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dताà¤\95à¥\8b à¤\96ाता  \"<nowiki>$1</nowiki>\" à¤¦à¤°à¥\8dता à¤\97रिà¤\8fà¤\95à¥\8b à¤\9bà¥\88न à¥¤\nतपाà¤\88à¤\81ले पृष्ठ निर्माण/सम्पादन गर्न चाहनु भएको भए जाँच गर्नुहोस् ।",
+       "userpage-userdoesnotexist": "पà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dताà¤\95à¥\8b à¤\96ाता  \"<nowiki>$1</nowiki>\" à¤¦à¤°à¥\8dता à¤\97रिà¤\8fà¤\95à¥\8b à¤\9bà¥\88न à¥¤\nतपाà¤\88à¤\82ले पृष्ठ निर्माण/सम्पादन गर्न चाहनु भएको भए जाँच गर्नुहोस् ।",
        "userpage-userdoesnotexist-view": "प्रयोगकर्ता खाता \"$1\" दर्ता गरिएको छैन।",
        "blocked-notice-logextract": "यो प्रयोगकर्ता हाल प्रतिबन्धित छ।\nभर्खरैको प्रतिबन्ध लग प्रविष्टि सन्दर्भको निम्ति तल दिइन्छ:",
-       "clearyourcache": "<strong>à¤\9fिपà¥\8dपणà¥\80</strong> à¤¸à¤\99à¥\8dà¤\97à¥\8dरह à¤\97रà¥\87पà¤\9bि, à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤¹à¥\87रà¥\8dनà¤\95à¥\8b à¤²à¤¾à¤\97ि à¤¤à¤ªà¤¾à¤\88à¤\81लà¥\87 à¤\86फà¥\8dनà¥\8b à¤¬à¥\8dराà¤\89à¤\9cरà¤\95à¥\8b à¤\95à¥\8dयाà¤\9a à¤¬à¤¾à¤\88पास à¤\97रà¥\8dनà¥\81 à¤ªà¤°à¥\8dनà¥\87 à¤¹à¥\81नसà¤\95à¥\8dà¤\9b।\n*<strong>फायरफà¤\95à¥\8dस / à¤¸à¤«à¤¾à¤°à¥\80मा:</strong> <em>Shift</em> à¤\95à¥\81à¤\9eà¥\8dà¤\9cà¥\80 à¤¥à¤¿à¤\9aà¥\80 à¤°à¤¾à¤\96à¥\87र <em>Reload</em> à¤\95à¥\8dलिà¤\95 à¤\97रà¥\8dनà¥\81परà¥\8dà¤\9b, à¤µà¤¾ <em>Ctrl-F5</em> à¤µà¤¾ <em>Ctrl-R</em> à¤¦à¤¬à¤¾à¤\89नà¥\81हà¥\8bस (मà¥\8dयाà¤\95मा <em>â\8c\98-R</em>)\n*<strong>à¤\97à¥\81à¤\97ल à¤\95à¥\8dरà¥\8bम:</strong> <em>Ctrl-Shift-R</em> à¤\95à¥\81à¤\9eà¥\8dà¤\9cà¥\80 à¤¦à¤¬à¤¾à¤\89नà¥\81हà¥\8bस (मà¥\8dयाà¤\95मा <em>â\8c\98-R</em>)\n*<strong>à¤\93पà¥\87रा:</strong> <em>Tools â\86\92 Preferences</em> à¤®à¤¾ à¤\97à¤\8fर à¤\95à¥\8dयाश à¤¹à¤\9fाà¤\89नà¥\81हà¥\8bस\n*<strong>à¤\87नà¥\8dà¤\9fरनà¥\87à¤\9f à¤\8fà¤\95à¥\8dसपà¥\8dलà¥\8bरर</strong>: <em>Ctrl</em> à¤²à¤¾à¤\88 à¤¥à¤¿à¤\9aà¥\80 à¤°à¤¾à¤\96à¥\87र <em>Refresh</em> à¤\95à¥\8dलिà¤\95 à¤\97रà¥\8dनà¥\81हà¥\8bस à¤µà¤¾ <em>Ctrl-F5</em> à¤¥à¤¿à¤\9aà¥\8dनà¥\81हà¥\8bस",
+       "clearyourcache": "<strong>à¤\9fिपà¥\8dपणà¥\80</strong> à¤¸à¤\99à¥\8dà¤\97à¥\8dरह à¤\97रà¥\87पà¤\9bि, à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤¹à¥\87रà¥\8dनà¤\95à¥\8b à¤²à¤¾à¤\97ि à¤¤à¤ªà¤¾à¤\88à¤\82लà¥\87 à¤\86फà¥\8dनà¥\8b à¤¬à¥\8dराà¤\89à¤\9cरà¤\95à¥\8b à¤\95à¥\8dयाà¤\9a à¤¬à¤¾à¤\88पास à¤\97रà¥\8dनà¥\81 à¤ªà¤°à¥\8dनà¥\87 à¤¹à¥\81नसà¤\95à¥\8dà¤\9b।\n*<strong>फायरफà¤\95à¥\8dस / à¤¸à¤«à¤¾à¤°à¥\80मा:</strong> <em>Shift</em> à¤\95à¥\81à¤\9eà¥\8dà¤\9cà¥\80 à¤¥à¤¿à¤\9aà¥\80 à¤°à¤¾à¤\96à¥\87र <em>Reload</em> à¤\95à¥\8dलिà¤\95 à¤\97रà¥\8dनà¥\81परà¥\8dà¤\9b, à¤µà¤¾ <em>Ctrl-F5</em> à¤µà¤¾ <em>Ctrl-R</em> à¤¦à¤¬à¤¾à¤\89नà¥\81हà¥\8bसà¥\8d (मà¥\8dयाà¤\95मा <em>â\8c\98-R</em>)\n*<strong>à¤\97à¥\81à¤\97ल à¤\95à¥\8dरà¥\8bम:</strong> <em>Ctrl-Shift-R</em> à¤\95à¥\81à¤\9eà¥\8dà¤\9cà¥\80 à¤¦à¤¬à¤¾à¤\89नà¥\81हà¥\8bसà¥\8d (मà¥\8dयाà¤\95मा <em>â\8c\98-R</em>)\n*<strong>à¤\93पà¥\87रा:</strong> <em>Tools â\86\92 Preferences</em> à¤®à¤¾ à¤\97à¤\8fर à¤\95à¥\8dयाश à¤¹à¤\9fाà¤\89नà¥\81हà¥\8bसà¥\8d\n*<strong>à¤\87नà¥\8dà¤\9fरनà¥\87à¤\9f à¤\8fà¤\95à¥\8dसपà¥\8dलà¥\8bरर</strong>: <em>Ctrl</em> à¤²à¤¾à¤\88 à¤¥à¤¿à¤\9aà¥\80 à¤°à¤¾à¤\96à¥\87र <em>Refresh</em> à¤\95à¥\8dलिà¤\95 à¤\97रà¥\8dनà¥\81हà¥\8bसà¥\8d à¤µà¤¾ <em>Ctrl-F5</em> à¤¥à¤¿à¤\9aà¥\8dनà¥\81हà¥\8bसà¥\8d",
        "usercssyoucanpreview": "<strong>सुझाव:</strong> तपाईंको नयाँ सिययस सङ्ग्रह गर्न अघि  \"{{int:showpreview}}\" बटन थिचेर जाँच्नुहोस्।",
        "userjsyoucanpreview": "<strong>सुझाव:</strong> तपाईंको नयाँ जाभा स्क्रिप्ट सङ्ग्रह गर्न अघि  \"{{int:showpreview}}\" बटन थिचेर जाँच्नुहोस्।",
-       "usercsspreview": "<strong>याद राख्नुहोस तपाईँले आफ्नो प्रयोगकर्ता सियसयसको पूर्वावलोकन मात्र हेरिरहनु भएको छ।\nयसलाई अहिले सम्म सङ्ग्रह गरिएको छैन!</strong>",
-       "userjspreview": "<strong>याद à¤°à¤¾à¤\96à¥\8dनà¥\81हà¥\8bस à¤¤à¤ªà¤¾à¤\88à¤\81ले आफ्नो प्रयोगकर्ता जाभास्क्रिप्टको पूर्वावलोकन मात्र हेरिरहनु भएको छ।\nयसलाइ अहिले सम्म सङ्ग्रह गरिएको छैन!</strong>",
-       "sitecsspreview": "<strong>याद à¤°à¤¾à¤\96à¥\8dनà¥\81हà¥\8bसà¥\8d à¤¤à¤ªà¤¾à¤\88à¤\81लà¥\87 à¤\95à¥\87वल à¤µà¤¿à¤¶à¥\8dववà¥\8dयापà¥\80 à¤¸à¤¿à¤¯à¤¸à¤¯à¤¸à¤\95à¥\8b à¤ªà¥\82रà¥\8dवावलà¥\8bà¤\95न à¤®à¤¾à¤¤à¥\8dर à¤\85वलà¥\8bà¤\95न à¤\97रà¥\8dनà¥\81भà¤\8fà¤\95à¥\8b à¤\9b।\nयसलाई अहिलेसम्म सङ्ग्रह गरिएको छैन!</strong>",
-       "sitejspreview": "<strong>याद राख्नुहोस तपाईँले केवल जाभास्क्रिप्ट कोडको पूर्वावलोकन मात्र हेरिरहनु भएको छ।\nयसलाई अहिले सम्म सङ्ग्रह गरिएको छैन!</strong>",
+       "usercsspreview": "<strong>याद राख्नुहोस् तपाईंले आफ्नो प्रयोगकर्ता सियसयसको पूर्वावलोकन मात्र हेरिरहनु भएको छ।\nयसलाई अहिले सम्म सङ्ग्रह गरिएको छैन!</strong>",
+       "userjspreview": "<strong>याद à¤°à¤¾à¤\96à¥\8dनà¥\81हà¥\8bस à¤¤à¤ªà¤¾à¤\88à¤\82ले आफ्नो प्रयोगकर्ता जाभास्क्रिप्टको पूर्वावलोकन मात्र हेरिरहनु भएको छ।\nयसलाइ अहिले सम्म सङ्ग्रह गरिएको छैन!</strong>",
+       "sitecsspreview": "<strong>याद à¤°à¤¾à¤\96à¥\8dनà¥\81हà¥\8bसà¥\8d à¤¤à¤ªà¤¾à¤\88à¤\82लà¥\87 à¤\95à¥\87वल à¤µà¤¿à¤¶à¥\8dववà¥\8dयापà¥\80 à¤¸à¤¿à¤¯à¤¸à¤¯à¤¸à¤\95à¥\8b à¤ªà¥\82रà¥\8dवावलà¥\8bà¤\95न à¤®à¤¾à¤¤à¥\8dर à¤\85वलà¥\8bà¤\95न à¤\97रà¥\8dनà¥\81भà¤\8fà¤\95à¥\8b à¤\9b ।\nयसलाई अहिलेसम्म सङ्ग्रह गरिएको छैन!</strong>",
+       "sitejspreview": "<strong>याद राख्नुहोस् तपाईंले केवल जाभास्क्रिप्ट कोडको पूर्वावलोकन मात्र हेरिरहनु भएको छ।\nयसलाई अहिले सम्म सङ्ग्रह गरिएको छैन!</strong>",
        "userinvalidcssjstitle": "<strong>चेतावनी:</strong> यहाँ कुनैपनि \"$1\" नामको खोल छैन।\nप्रचलित .css तथा .js पृष्ठहरूले निम्नपद शीर्षक प्रयोग गर्छन्, जस्तै {{ns:user}}:Foo/Vector.css को सट्टामा {{ns:user}}:Foo/vector.css",
        "updated": "नवीन",
        "note": "'''सूचना:'''",
        "searchprofile-advanced-tooltip": "अनुकुल नेमस्पेसमा खोज्ने",
        "search-result-size": "$1 ({{PLURAL:$2|1 शब्द|$2 शब्दहरू}})",
        "search-result-category-size": "{{PLURAL:$1|एक सदस्य|$1 सदस्यहरू}} ({{PLURAL:$2|1 उपश्रेणी|$2  उपश्रेणीहरू}}, {{PLURAL:$3|एउटा फाइल|$3 फाइलहरू}})",
-       "search-redirect": "(à¤\9cानà¥\87 $1)",
+       "search-redirect": "(रिडाà¤\87रà¥\87à¤\95à¥\8dà¤\9f à¤¦à¥\87à¤\96ि $1)",
        "search-section": "(खण्ड $1)",
        "search-category": "(श्रेणी $1)",
        "search-file-match": "(भेटिएका फाइल सामाग्री)",
        "activeusers-intro": "यो सूची ती प्रयोगकर्ताहरूको हो जसले विगत $1 {{PLURAL:$1|दिन| दिन}}मा  गतिविधि देखाएकाछन्।",
        "activeusers-count": "विगत {{PLURAL:$3|दिनमा|$3 दिनहरूमा}}  $1 {{PLURAL:$1|सम्पादन गरियो|सम्पादनहरू गरिए}}",
        "activeusers-from": "यहाँबाट सुरु हुने प्रयोगकर्ताहरू देखाउनुहोस्:",
-       "activeusers-hidebots": "बोटहरु लुकाउने",
-       "activeusers-hidesysops": "प्रवन्धकहरू लुकाउने",
        "activeusers-noresult": "प्रयोगकर्ताहरू भेटिएनन्।",
        "activeusers-submit": "सक्रिय प्रयोगकर्ताहरू देखाउनुहोस्",
        "listgrouprights": "प्रयोगकर्ता समूह अधिकार",
        "notvisiblerev": "पूर्वावलोकन हटाइयो",
        "watchlist-details": "तपाईंको निगरानी सूचीमा रहेका {{PLURAL:$1|$1 पृष्ठ|$1 पृष्ठहरू}} वार्तालाप पृष्ठ गनिएका छैनन्।",
        "wlheader-enotif": "ईमेल जानकारी सक्रिय गरियो ।",
-       "wlheader-showupdated": "तपाà¤\88à¤\81ले पछिल्लो पल्ट भ्रमण गरेपछि परिवर्तन भएका पृष्ठहरूलाई <strong>गाढा<strong> गरेर देखाइएको छ ।",
+       "wlheader-showupdated": "तपाà¤\88à¤\82ले पछिल्लो पल्ट भ्रमण गरेपछि परिवर्तन भएका पृष्ठहरूलाई <strong>गाढा<strong> गरेर देखाइएको छ ।",
        "wlnote": "$3 र $4 अनुसार विगत {{PLURAL:$2|घण्टामा|'''$2''' घण्टाहरूमा}} {{PLURAL:$1|गरिएको अन्तिम परिवर्तन तल दिइएकोछ|गरिएका अन्तिम  '''$1''' परिवर्तनहरू तल दिइएका छन्}}।",
        "wlshowlast": "पछिल्ला $2 दिनहरू $1 घण्टाहरू देखाउनुहोस्",
        "watchlist-hide": "लुकाउनुहोस्",
        "protect-text": "तपाईं  यहाँ '''$1''' पृष्ठको सुरक्षा स्तर हेर्न र परिवर्तन गर्न सक्नुहुन्छ ।",
        "protect-locked-blocked": "तपाईं प्रतिबन्धित भएको अवस्थामा सुरक्षा स्तरमा परिवर्तन गर्न सक्नुहुन्न।\nपृष्ठ <strong>$1</strong> को वर्तमान स्थिति यो छ:",
        "protect-locked-dblock": "डेटाबेसमा सक्रिय बन्देज भएको कारणले सुरक्षा स्तरमा कुनै परिवर्तन गर्न सकिंदैन।\nपृष्ठ <strong>$1</strong> को वर्तमान स्थिति यो छ:",
-       "protect-locked-access": "तपाà¤\88à¤\81को खातालाई पृष्ठको सुरक्षा स्तरहरू परिवर्तन गर्ने अनुमति छैन ।\n'''$1''पृष्ठको हालको स्थिति  निम्न छ :",
+       "protect-locked-access": "तपाà¤\88à¤\82को खातालाई पृष्ठको सुरक्षा स्तरहरू परिवर्तन गर्ने अनुमति छैन ।\n'''$1''पृष्ठको हालको स्थिति  निम्न छ :",
        "protect-cascadeon": "हालमा यो पृष्ठ सुरक्षित गरिएको छ किन कि यसमा निम्न {{PLURAL:$1|पृष्ठ, जसको|पृष्ठहरू, जसको}} सुरक्षामा व्यापकता कायम गरिएको छ। \nतपाईंले पृष्ठको सुरक्षा स्तर परिवर्तन गर्न सक्नुहुनेछ तर यसले व्यापक सुरक्षालाई केहि असर पार्ने छैन।",
        "protect-default": "सबै प्रयोगकर्ताहरूलाई अनुमति दिने",
        "protect-fallback": "\"$1\" वर्गमा भएका प्रयोगकर्ताहरूलाई अनुमति दिने",
        "movepage-moved": "'''\"$1\" लाई \"$2\"मा सारिएको छ'''",
        "movepage-moved-redirect": "अनुप्रेषित पृष्ठ सृजना गरियो।",
        "movepage-moved-noredirect": "रिडाइरेक्ट पृष",
-       "articleexists": "यस नामको पृष्ठ पहिले देखि नै रहेको ,या तपाईँले छान्नु भएको नाम अमान्य छ।\nकृपया अर्कै नाम छान्नुहोस् ।",
+       "articleexists": "यस नामको पृष्ठ पहिले देखि नै रहेको छ, या तपाईंले छान्नु भएको नाम अमान्य छ । कृपया अर्कै नाम छान्नुहोस् ।",
        "cantmove-titleprotected": "तपाईं यो स्थानमा पृष्ठ सार्न सक्नुहुन्न, किनकी यो नयाँ शिर्षकलाई सिर्जना हुनबाट जोगाइएको छ",
        "movetalk": "सम्बन्धित वार्ता पृष्ठ",
        "move-subpages": "सहायक पृष्ठहरू सार्ने($1 सम्मको)",
        "tooltip-pt-mytalk": "{{GENDER:|तपाईंको}} वार्ता पृष्ठ",
        "tooltip-pt-anontalk": "यो IP ठेगानाबाट गरिएका सम्पादनका बारेमा बार्तालाप",
        "tooltip-pt-preferences": "{{GENDER:|तपाईंका}} अभिरुचिहरू",
-       "tooltip-pt-watchlist": "पà¥\83षà¥\8dठहरà¥\82à¤\95à¥\8b à¤¸à¥\82à¤\9aà¥\80 à¤\9cसà¤\95ा à¤ªà¤°à¤¿à¤µà¤°à¥\8dतनहरà¥\82लाà¤\88 à¤¤à¤ªà¤¾à¤\88à¤\81ले निगरानी गरिरहनु भएको छ",
+       "tooltip-pt-watchlist": "पà¥\83षà¥\8dठहरà¥\82à¤\95à¥\8b à¤¸à¥\82à¤\9aà¥\80 à¤\9cसà¤\95ा à¤ªà¤°à¤¿à¤µà¤°à¥\8dतनहरà¥\82लाà¤\88 à¤¤à¤ªà¤¾à¤\88à¤\82ले निगरानी गरिरहनु भएको छ",
        "tooltip-pt-mycontris": "{{GENDER:|तपाईंका}} योगदानहरूको सूची",
        "tooltip-pt-login": "तपाईंलाई प्रवेस गर्न सुझाव दिइन्छ ; तर यो जरुरी भने छैन",
        "tooltip-pt-logout": "निर्गमन (लग आउट) गर्नुहोस्",
        "compare-submit": "दँजाउनुहोस्",
        "compare-invalid-title": "तपाईंले खुलाउनु भएको शिर्षक अमान्य छ।",
        "compare-title-not-exists": "तपाईंले खुलाउनु भएको शिर्षक उपलब्ध छैन ।",
-       "compare-revision-not-exists": "तपाà¤\88à¤\81ले खुलाउनु भएको संस्करण उपलब्ध छैन ।",
+       "compare-revision-not-exists": "तपाà¤\88à¤\82ले खुलाउनु भएको संस्करण उपलब्ध छैन ।",
        "dberr-problems": "क्षमा पाउँ! यो साइटमा तकनीकी गड़बड़ी आइपरेकोछ।",
        "dberr-again": "केही समय पर्खिएर पुन: लोड हुन दिनुहोस् ।",
        "dberr-info": "(डेटाबेस सर्भर: $1 सँग सम्पर्क स्थापित गर्न सकिएन)",
        "htmlform-invalid-input": "तपाईंको कुनै प्रविष्ठिहरू सही छैनन्",
        "htmlform-select-badoption": "तपाईंले खुलाउनु भएको मान मान्य विकल्प हैन ।",
        "htmlform-int-invalid": "तपाईंले खुलाउनु भएको मान कुनै इन्टिजर हैन ।",
-       "htmlform-float-invalid": "तपाà¤\88à¤\81ले जनाउनु भएको मान कुनै संख्या हैन ।",
+       "htmlform-float-invalid": "तपाà¤\88à¤\82ले जनाउनु भएको मान कुनै संख्या हैन ।",
        "htmlform-int-toolow": "तपाईंले जनाउनु भएको मान न्युनतम $1 भन्दा कम भयो ।",
        "htmlform-int-toohigh": "तपाईंले जनाउनु भएको मान अधिकतम $1 भन्दा बढी भयो ।",
        "htmlform-required": "यसको मूल्य(value) चाहिन्छ",
        "feedback-thanks": "धन्यवाद! तपाईंको प्रतिक्रिया पृष्ठमा नियुक्त गरिएको छ \"[ $2  $1 ]\"।",
        "feedback-thanks-title": "धन्यवाद!",
        "feedback-useragent": "प्रयोगकर्ता एजेन्ट:",
-       "searchsuggest-search": "खोज",
+       "searchsuggest-search": "{{SITENAME}} मा खोज्नुहोस्",
        "searchsuggest-containing": "समावेश भएको...",
        "api-error-badaccess-groups": "यस विकिमा तपाईंलाई फाइल अपलोड गर्ने अनुमति छैन।",
        "api-error-badtoken": "आन्तरिक समस्याः खराब टोकन ।",
index 8f06a69..c86e332 100644 (file)
@@ -79,7 +79,8 @@
                        "Dinosaur918",
                        "Jdforrester",
                        "Jeleniccz",
-                       "MrLeopold"
+                       "MrLeopold",
+                       "Hex"
                ]
        },
        "tog-underline": "Koppelingen onderstrepen:",
        "category-file-count-limited": "Deze categorie bevat {{PLURAL:$1|het volgende bestand|de volgende $1 bestanden}}.",
        "listingcontinuesabbrev": "meer",
        "index-category": "Te indexeren pagina's",
-       "noindex-category": "Niet te indexeren pagina's",
+       "noindex-category": "Niet-geïndexeerde pagina's",
        "broken-file-category": "Pagina's met onjuiste bestandskoppelingen",
        "about": "Over",
        "article": "Pagina",
        "cannotloginnow-title": "Niet mogelijk om aan te melden",
        "cannotloginnow-text": "Aanmelden is niet mogelijk bij het gebruik van $1.",
        "cannotcreateaccount-title": "Kan geen accounts aanmaken",
+       "cannotcreateaccount-text": "Direct aanmaken van een gebruiker is niet ingeschakeld op deze wiki.",
        "yourdomainname": "Uw domein:",
        "password-change-forbidden": "U kunt uw wachtwoord niet wijzigen in deze wiki.",
        "externaldberror": "Er is een fout opgetreden bij het aanmelden bij de database of u hebt geen toestemming uw externe gebruiker bij te werken.",
        "createacct-email-ph": "Geef uw e-mailadres op",
        "createacct-another-email-ph": "Geef een e-mailadres op",
        "createaccountmail": "Gebruik een tijdelijk willekeurig wachtwoord en stuur het naar het opgegeven e-mailadres",
+       "createaccountmail-help": "Kan worden gebruikt voor het aanmaken van een gebruiker voor een andere persoon zonder het wachtwoord te leren.",
        "createacct-realname": "Echte naam (optioneel)",
        "createaccountreason": "Reden:",
        "createacct-reason": "Reden",
        "createacct-reason-ph": "Waarom u een andere account aanmaakt",
+       "createacct-reason-help": "Weergegeven bericht in het logbestand van aangemaakte gebruikers",
        "createacct-submit": "Account aanmaken",
        "createacct-another-submit": "Account aanmaken",
        "createacct-continue-submit": "Doorgaan met het maken van een account",
        "nocookiesnew": "De gebruiker is geregistreerd, maar niet aangemeld.\n{{SITENAME}} gebruikt cookies voor het aanmelden van gebruikers.\nSchakel die in en meld daarna aan met uw nieuwe gebruikersnaam en wachtwoord.",
        "nocookieslogin": "{{SITENAME}} gebruikt cookies voor het aanmelden van gebruikers.\nCookies zijn uitgeschakeld in uw browser.\nSchakel deze optie in en probeer het opnieuw.",
        "nocookiesfornew": "De gebruiker is niet gemaakt omdat de bron niet bevestigd kon worden.\nZorg ervoor dat u cookies hebt ingeschakeld, herlaad deze pagina en probeer het opnieuw.",
+       "createacct-loginerror": "De gebruiker is succesvol aangemaakt, maar u kon niet automatisch worden aangemeld. Ga naar [[Special:UserLogin|handmatig aanmelden]].",
        "noname": "U hebt geen geldige gebruikersnaam opgegeven.",
        "loginsuccesstitle": "Aangemeld",
        "loginsuccess": "<strong>U bent nu aangemeld bij {{SITENAME}} als \"$1\".</strong>",
        "eauthentsent": "Er is ter bevestiging een e-mail naar het opgegeven e-mailadres gezonden.\nVolg de aanwijzingen in de e-mail om aan te geven dat het uw e-mailadres is.\nTot die tijd worden er geen e-mails naar het e-mailadres gezonden.",
        "throttled-mailpassword": "In {{PLURAL:$1|het laatste uur|de laatste $1 uur}} is al een wachtwoordherinnering verzonden.\nOm misbruik te voorkomen wordt er slechts één wachtwoordherinnering per {{PLURAL:$1|uur|$1 uur}} verzonden.",
        "mailerror": "Fout bij het verzenden van e-mail: $1",
-       "acct_creation_throttle_hit": "Bezoekers van deze wiki met hetzelfde IP-adres als u hebben de afgelopen dag al $1 gebruiker{{PLURAL:$1||s}} geregistreerd, wat het maximale aantal in deze periode is.\nDaarom kunt u vanaf uw IP-adres op dit moment geen nieuwe gebruikers registreren.",
+       "acct_creation_throttle_hit": "Bezoekers van deze wiki met hetzelfde IP-adres als u hebben de afgelopen $2 al {{PLURAL:$1|1 gebruiker|$1 gebruikers}} geregistreerd, wat het maximale toegestane aantal is voor deze periode.\nDaarom kunt u vanaf uw IP-adres op dit moment geen nieuwe gebruikers registreren.",
        "emailauthenticated": "Uw e-mailadres is bevestigd op $2 om $3.",
        "emailnotauthenticated": "Uw e-mailadres is niet bevestigd.\nDe volgende functies verzenden nog geen e-mail.",
        "noemailprefs": "Geef een e-mailadres op in uw voorkeuren om deze functies te gebruiken.",
        "botpasswords-updated-body": "Het botwachtwoord voor de bot \"$1\" van gebruiker \"$2\" is succesvol bijgewerkt.",
        "botpasswords-deleted-title": "Botwachtwoord verwijderd",
        "botpasswords-deleted-body": "Het botwachtwoord voor de bot \"$1\" van gebruiker \"$2\" is verwijderd.",
-       "botpasswords-newpassword": "Het nieuwe wachtwoord om aan te melden met <strong>$1</strong> is nu <strong>$2</strong>. <em>Bewaar dit goed voor toekomstig gebruik.</em>",
+       "botpasswords-newpassword": "Het nieuwe wachtwoord om aan te melden met <strong>$1</strong> is <strong>$2</strong>. <em>Bewaar dit goed voor toekomstig gebruik.</em> <br> (Voor oude robots die vereisen dat de loginnaam hetzelfde is als de eventuele gebruikersnaam, kan ook <strong>$3</strong> als gebruikersnaam en <strong>$4</strong> als wachtwoord worden gebruikt.)",
        "botpasswords-no-provider": "BotPasswordsSessionProvider is niet beschikbaar.",
        "botpasswords-restriction-failed": "Botwachtwoordbeperkingen maken het aanmelden onmogelijk.",
        "botpasswords-invalid-name": "De gebruikersnaam bevat niet het scheidingsteken van het botwachtwoord (\"$1\").",
        "passwordreset-emailelement": "Gebruikersnaam: \n$1\n\nTijdelijk wachtwoord: \n$2",
        "passwordreset-emailsentemail": "Als dit e-mailadres aan uw account gekoppeld is, dan wordt er een e-mail verzonden om uw wachtwoord opnieuw in te stellen.",
        "passwordreset-emailsentusername": "Als er een e-mailadres geregistreerd is voor die gebruikersnaam, dan wordt er een e-mail verzonden om uw wachtwoord opnieuw in te stellen.",
+       "passwordreset-emailsent-capture2": "De wachtwoordherstel-{{PLURAL:$1|e-mail is|e-mails zijn}} verzonden. {{PLURAL:$1|De gebruikersnaam en het wachtwoord worden|De lijst van gebruikersnamen en wachtwoorden wordt}} hier weergegeven.",
        "passwordreset-emailerror-capture2": "Het e-mailen naar de {{GENDER:$2|gebruiker}} is mislukt: $1 {{PLURAL:$3|De gebruikersnaam en het wachtwoord|De lijst met gebruikersnamen en wachtwoorden}} wordt hieronder weergegeven.",
+       "passwordreset-nocaller": "Een aanroeper moet worden opgegeven",
+       "passwordreset-nosuchcaller": "Aanroeper bestaat niet: $1",
+       "passwordreset-ignored": "Opnieuw instellen van het wachtwoord niet is afgehandeld. Misschien is er geen provider geconfigureerd?",
        "passwordreset-invalideamil": "Ongeldig e-mailadres",
        "passwordreset-nodata": "Er is geen gebruikersnaam of e-mailadres opgegeven",
        "changeemail": "E-mailadres wijzigen of verwijderen",
        "invalid-content-data": "Ongeldige inhoudsgegevens",
        "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.\nAls u bent aangemeld, kunt u deze waarschuwing uitschakelen in het tabblad \"{{int:prefs-editing}}\" in uw voorkeuren.",
+       "editpage-invalidcontentmodel-title": "Inhoudsmodel wordt niet ondersteund",
+       "editpage-invalidcontentmodel-text": "Het inhoudsmodel \"$1\" wordt niet ondersteund.",
        "editpage-notsupportedcontentformat-title": "Inhoudsformaat niet ondersteund",
        "editpage-notsupportedcontentformat-text": "Het inhoudstype $1 wordt niet ondersteund door het inhoudsmodel $2.",
        "content-model-wikitext": "wikitekst",
        "content-json-empty-object": "Leeg object",
        "content-json-empty-array": "Lege reeks",
        "deprecated-self-close-category": "Pagina's met ongeldige zelfsluitende HTML-tags",
+       "deprecated-self-close-category-desc": "De pagina bevat ongeldige zelf-afgesloten HTML-tags, zoals <code>&lt;b/&gt;</code> of <code>&lt;span/&gt;</code>. Het gedrag van deze tags zal binnenkort veranderd worden zodat dit overeenkomt met de HTML5-specificatie, dus het gebruik hiervan is verouderd en wordt afgeraden.",
        "duplicate-args-warning": "<strong>Waarschuwing:</strong> [[:$1]] roept [[:$2]] aan met meer dan één waarde voor de parameter \"$3\". Alleen de laatste waarde wordt gebruikt.",
        "duplicate-args-category": "Pagina's met dubbele sjabloonparameters",
        "duplicate-args-category-desc": "De pagina bevat aanroepen van sjablonen waarin hetzelfde argument meerdere keren wordt gebruikt, bijvoorbeeld <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> of <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "right-override-export-depth": "Pagina's exporteren inclusief pagina's waarnaar verwezen wordt tot een diepte van vijf",
        "right-sendemail": "E-mail versturen aan andere gebruikers",
        "right-passwordreset": "E-mails voor wachtwoord opnieuw instellen bekijken",
-       "right-managechangetags": "[[Special:Tags|Labels]] aan de database toevoegen of eruit verwijderen",
+       "right-managechangetags": "[[Special:Tags|Labels]] aanmaken en (de)activeren",
        "right-applychangetags": "[[Special:Tags|Labels]] aan bewerkingen toewijzen",
        "right-changetags": "Willekeurige [[Special:Tags|labels]] toevoegen aan en verwijderen van versies en logboekregels",
+       "right-deletechangetags": "[[Special:Tags|Labels]] uit de database verwijderen",
        "grant-generic": "Rechtengroep \"$1\"",
        "grant-group-page-interaction": "Werken met pagina's",
        "grant-group-file-interaction": "Werken met media",
        "grant-group-high-volume": "Activiteiten met hoog volume uitvoeren",
        "grant-group-customization": "Aanpassingen en voorkeuren",
        "grant-group-administration": "Beheerdershandelingen uitvoeren",
+       "grant-group-private-information": "Persoonlijke gegevens over u bekijken",
        "grant-group-other": "Diverse handelingen",
        "grant-blockusers": "Gebruikers (de)blokkeren",
        "grant-createaccount": "Accounts aanmaken",
        "grant-highvolume": "Veel bewerkingen in korte tijd maken",
        "grant-oversight": "Gebruikers en versies verbergen",
        "grant-patrol": "Wijzigingen aan pagina's controleren",
+       "grant-privateinfo": "Persoonlijke gegevens bekijken",
        "grant-protect": "Pagina's beveiligen en beveiliging opheffen",
        "grant-rollback": "Wijzigingen aan pagina's terugdraaien",
        "grant-sendemail": "E-mail verzenden aan andere gebruikers",
        "grant-basic": "Basisrechten",
        "grant-viewdeleted": "Verwijderde bestanden en pagina's bekijken",
        "grant-viewmywatchlist": "Eigen volglijst bekijken",
+       "grant-viewrestrictedlogs": "Vertrouwelijke logboekbestanden bekijken",
        "newuserlogpage": "Logboek nieuwe gebruikers",
        "newuserlogpagetext": "Hieronder staan de nieuw ingeschreven gebruikers",
        "rightslog": "Gebruikersrechtenlogboek",
        "file-thumbnail-no": "De bestandsnaam begint met <strong>$1</strong>.\nHet lijkt een verkleinde afbeelding te zijn ''(miniatuurafbeelding)''.\nAls u deze afbeelding in volledige resolutie hebt, upload die afbeelding dan.\nWijzig anders de bestandsnaam.",
        "fileexists-forbidden": "Er bestaat al een bestand met deze naam, en dat kan niet overschreven worden.\nUpload uw bestand onder een andere naam.\n[[File:$1|thumb|center|$1]]",
        "fileexists-shared-forbidden": "Er bestaat al een bestand met deze naam bij de gedeelde bestanden.\nAls u het bestand alsnog wilt uploaden, ga dan terug en kies een andere naam.\n[[File:$1|thumb|center|$1]]",
+       "fileexists-no-change": "De upload is een exacte kopie van de huidige versie van <strong>[[:$1]]</strong>.",
+       "fileexists-duplicate-version": "De upload is een exacte kopie van {{PLURAL:$2|een oudere versie|oudere versies}} van <strong>[[:$1]]</strong>.",
        "file-exists-duplicate": "Dit bestand is identiek aan {{PLURAL:$1|het volgende bestand|de volgende bestanden}}:",
        "file-deleted-duplicate": "Een bestand dat identiek is aan dit bestand ([[:$1]]) is voorheen verwijderd.\nRaadpleeg het verwijderingslogboek voordat u verder gaat.",
        "file-deleted-duplicate-notitle": "Er is een verwijderd bestand aangetroffen dat identiek is aan dit bestand, en de naam van het bestand is onderdrukt.\nVraag iemand die onderdrukte bestandsgegevens kan bekijken om de situatie opnieuw te beoordelen voordat u het bestand opnieuw toevoegt.",
        "upload-http-error": "Er is een HTTP-fout opgetreden: $1",
        "upload-copy-upload-invalid-domain": "Uploaden per kopie is niet beschikbaar vanuit dit domein.",
        "upload-foreign-cant-upload": "Deze wiki is niet geconfigureerd om bestanden te uploaden naar de bestandsrepository op een andere site.",
+       "upload-foreign-cant-load-config": "Het laden van de configuratie voor bestanduploads naar de externe opslagplaats is mislukt.",
+       "upload-dialog-disabled": "Het uploaden van bestanden met behulp van dit dialoogvenster is uitgeschakeld op deze wiki.",
        "upload-dialog-title": "Bestand uploaden",
        "upload-dialog-button-cancel": "Annuleren",
        "upload-dialog-button-back": "Terug",
        "backend-fail-read": "Het was niet mogelijk het bestand $1 te lezen.",
        "backend-fail-create": "Het was niet mogelijk naar het bestand $1 te schrijven.",
        "backend-fail-maxsize": "Het was niet mogelijk naar het bestand $1 te schrijven omdat het groter is dan {{PLURAL:$2|één byte|$2 bytes}}.",
-       "backend-fail-readonly": "Het opslagbackend \"$1\" kan op dit moment alleen gelezen worden. De opgegeven reden was: \"$2\"",
+       "backend-fail-readonly": "Het opslagbackend \"$1\" kan op dit moment alleen gelezen worden. De opgegeven reden is: <em>$2</em>",
        "backend-fail-synced": "Het bestand \"$1\" bevindt zich in een inconsistente toestand in de interne opslagbackends.",
        "backend-fail-connect": "Het was niet mogelijk een verbinding te maken met het opslagbackend \"$1\".",
        "backend-fail-internal": "Er is een onbekende fout opgetreden in het opslagbackend \"$1\".",
        "uploadstash-summary": "Deze pagina biedt toegang tot bestanden die geüpload zijn of nog geüpload worden maar nog niet beschikbaar gemaakt zijn in de wiki. Deze bestanden zijn alleen zichtbaar voor de gebruiker die ze uploadt.",
        "uploadstash-clear": "Verborgen bestanden weggooien",
        "uploadstash-nofiles": "Er zijn geen verborgen bestanden.",
-       "uploadstash-badtoken": "Het uitvoeren van de handeling is mislukt. Dit komt mogelijk doordat uw bewerkingsreferenties zijn verlopen. Probeer het opnieuw.",
+       "uploadstash-badtoken": "Het uitvoeren van de handeling is mislukt, mogelijk doordat uw bewerkingsreferenties zijn verlopen. Probeer het opnieuw.",
        "uploadstash-errclear": "Het wissen van de bestanden is mislukt.",
        "uploadstash-refresh": "Lijst met bestanden bijwerken",
        "uploadstash-thumbnail": "miniatuurafbeelding weergeven",
+       "uploadstash-exception": "Kon de upload niet opslaan in de opslagplaats ($1): \"$2\".",
        "invalid-chunk-offset": "Ongeldige chunkoffset",
        "img-auth-accessdenied": "Toegang geweigerd",
        "img-auth-nopathinfo": "PATH_INFO ontbreekt.\nUw server is niet ingesteld om deze gegevens door te geven.\nMisschien gebruikt deze CGI, en dan wordt img_auth niet ondersteund.\nZie https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization voor meer informatie.",
        "filerevert-submit": "Terugdraaien",
        "filerevert-success": "'''[[Media:$1|$1]]''' is teruggedraaid tot de [$4 versie op $2, $3].",
        "filerevert-badversion": "Er is geen vorige lokale versie van dit bestand met het opgegeven tijdstip.",
+       "filerevert-identical": "De huidige versie van het bestand is al identiek aan de geselecteerde.",
        "filedelete": "\"$1\" verwijderen",
        "filedelete-legend": "Bestand verwijderen",
        "filedelete-intro": "U staat op het punt om het bestand '''[[Media:$1|$1]]''' te verwijderen, inclusief alle eerdere versies.",
        "apisandbox-results-fixtoken-fail": "Het ophalen van het token van type \"$1\" is mislukt.",
        "apisandbox-alert-page": "Velden op deze pagina zijn niet geldig.",
        "apisandbox-alert-field": "De waarde van dit veld is niet geldig.",
+       "apisandbox-continue": "Doorgaan",
        "apisandbox-continue-clear": "Wissen",
+       "apisandbox-continue-help": "{{int:apisandbox-continue}} zal [https://www.mediawiki.org/wiki/API:Query#Continuing_queries doorgaan] met het laatste verzoek; {{int:apisandbox-continue-clear}} zal de voortgangsparameters wissen.",
        "booksources": "Boekinformatie",
        "booksources-search-legend": "Bronnen en gegevens over een boek zoeken",
        "booksources-search": "Zoeken",
        "activeusers-intro": "Dit is een lijst met gebruikers die enige activiteit hebben laten zien in de afgelopen {{PLURAL:$1|dag|$1 dagen}}.",
        "activeusers-count": "$1 recente {{PLURAL:$1|handeling|handelingen}} in de {{PLURAL:$3|afgelopen dag|laatste $3 dagen}}",
        "activeusers-from": "Gebruikers worden weergegeven vanaf:",
-       "activeusers-hidebots": "Bots verbergen",
-       "activeusers-hidesysops": "Beheerders verbergen",
        "activeusers-noresult": "Geen actieve gebruikers gevonden.",
        "activeusers-submit": "Weergeven",
        "listgrouprights": "Rechten van gebruikersgroepen",
        "trackingcategories-msg": "Volgcategorie",
        "trackingcategories-name": "Berichtnaam",
        "trackingcategories-desc": "Opnamecriteria",
+       "restricted-displaytitle-ignored": "Pagina's met genegeerde weergavetitels",
+       "restricted-displaytitle-ignored-desc": "Deze pagina heeft een genegeerde <code><nowiki>{{DISPLAYTITLE}}</nowiki></code> omdat het niet overeenkomstig is met de pagina's werkelijke titel.",
        "noindex-category-desc": "De pagina bevat het magische woord <code><nowiki>__NOINDEX__</nowiki></code> (en bevindt zich in een naamruimte waarin dat magische woord is toegestaan), en wordt niet geïndexeerd door robots.",
        "index-category-desc": "De pagina bevat het magische woord <code><nowiki>__INDEX__</nowiki></code> (en bevindt zich in een naamruimte waarin dat magische woord is toegestaan), en wordt geïndexeerd door robots, terwijl dat normaliter niet zou gebeuren.",
        "post-expand-template-inclusion-category-desc": "De pagina groter dan <code>$wgMaxArticleSize</code> na het uitbreiden van alle sjablonen, dus zijn sommige sjablonen niet uitgebreid.",
        "watchnologin": "U bent niet aangemeld",
        "addwatch": "Toevoegen aan volglijst",
        "addedwatchtext": "\"[[:$1]]\" en de bijhorende overlegpagina zijn toegevoegd aan uw [[Special:Watchlist|volglijst]].",
+       "addedwatchtext-talk": "\"[[:$1]]\" en de gerelateerde pagina zijn toegevoegd aan je [[Special:Watchlist|volglijst]].",
        "addedwatchtext-short": "De pagina \"$1\" is aan uw volglijst toegevoegd.",
        "removewatch": "Verwijderen uit volglijst",
        "removedwatchtext": "\"[[:$1]]\" en de bijhorende overlegpagina zijn verwijderd van uw [[Special:Watchlist|volglijst]].",
        "rollbacklinkcount": "{{PLURAL:$1|één bewerking|$1 bewerkingen}} terugdraaien",
        "rollbacklinkcount-morethan": "Meer dan {{PLURAL:$1|één bewerking|$1 bewerkingen}} terugdraaien",
        "rollbackfailed": "Ongedaan maken van wijzigingen mislukt.",
+       "rollback-missingparam": "Er ontbreken benodigde parameters in het verzoek.",
        "cantrollback": "Ongedaan maken van wijzigingen onmogelijk: deze pagina heeft slechts 1 auteur.",
        "alreadyrolled": "Het is niet mogelijk om de bewerking van de pagina [[:$1]] door [[User:$2|$2]] ([[User talk:$2|overleg]]{{int:pipe-separator}}[[Special:Contributions/$2|bijdragen]]) ongedaan te maken.\nIemand anders heeft deze pagina al bewerkt of hersteld naar een eerdere versie.\n\nDe meest recente bewerking is gemaakt door [[User:$3|$3]] ([[User talk:$3|overleg]]{{int:pipe-separator}}[[Special:Contributions/$3|bijdragen]]).",
        "editcomment": "De bewerkingssamenvatting was: <em>$1</em>.",
        "feedback-thanks": "Bedankt! Uw terugkoppeling is op de pagina \"[$2 $1]\" geplaatst.",
        "feedback-thanks-title": "Bedankt!",
        "feedback-useragent": "Useragent:",
-       "searchsuggest-search": "Zoeken",
+       "searchsuggest-search": "Zoeken in {{SITENAME}}",
        "searchsuggest-containing": "bevat...",
        "api-error-badaccess-groups": "U mag geen bestanden uploaden in deze wiki.",
        "api-error-badtoken": "Interne fout: het token klopt niet.",
index b92995c..66b151e 100644 (file)
        "talk": "Diskusjon",
        "views": "Visningar",
        "toolbox": "Verktøy",
+       "tool-link-userrights": "Endra {{GENDER:$1|brukargrupper}}",
+       "tool-link-emailuser": "Send e-post til {{GENDER:$1|brukaren}}",
        "userpage": "Vis brukarside",
        "projectpage": "Sjå prosjektsida",
        "imagepage": "Vis filside",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
        "content-json-empty-object": "Tomt objekt",
+       "duplicate-args-warning": "<strong>Åtvaring:</strong> [[:$1]] kallar [[:$2]] med meir enn éin verdi for argumentet «$3». Berre den sist oppgjevne verdien vert nytta.",
        "expensive-parserfunction-warning": "Åtvaring: Denne sida inneheld for mange prosesskrevande parserfunksjonar.\n\nDet burde vere færre enn {{PLURAL:$2|$2|$2}}, men er no {{PLURAL:$1|$1|$1}}.",
        "expensive-parserfunction-category": "Sider med for mange prosesskrevande parserfunksjonar",
        "post-expand-template-inclusion-warning": "Åtvaring: Storleiken på malar som er inkluderte er for stor.\nNokre malar vert ikkje inkluderte.",
        "activeusers-intro": "Dette er ei liste over brukarar som har hatt ei eller anna form for aktivitet innanfor {{PLURAL:$1|den siste dagen|dei siste dagane}}.",
        "activeusers-count": "{{PLURAL:$1|Éi handling|$1 handlingar}} {{PLURAL:$3|det siste døgeret|dei siste $3 døgra}}",
        "activeusers-from": "Vis brukarar frå og med:",
-       "activeusers-hidebots": "Gøym robotar",
-       "activeusers-hidesysops": "Gøym administratorar",
        "activeusers-noresult": "Ingen brukarar funne.",
        "listgrouprights": "Rettar for brukargrupper",
        "listgrouprights-summary": "Detter ei liste som viser brukargruppene som er definerte på wikien, og kva rettar dei har. Det kan finnast [[{{MediaWiki:Listgrouprights-helppage}}|meir informasjon]]  om dei ulike rettane.",
index 79c3ea9..b3facd6 100644 (file)
        "oct": "Diphalane",
        "nov": "Dibatsela",
        "dec": "Manthole",
+       "january-date": "$1 Pherekgong",
+       "february-date": "$1 Dibokwane",
+       "march-date": "$1 Hlakola",
+       "april-date": "$1 Moranang",
+       "may-date": "$1 Mopitlo",
+       "june-date": "$1 Phupu",
+       "july-date": "$1 Mosegamanye",
+       "august-date": "$1 Phato",
+       "september-date": "$1 Lewedi",
+       "october-date": "$1 Diphalane",
+       "november-date": "$1 Dibatsela",
+       "december-date": "$1 Mathole",
        "pagecategories": "{{PLURAL:$1|Sehlopha|Dihlopha}}",
        "category_header": "Matlakala go sehlopha \"$1\"",
        "subcategories": "Dihlophana",
        "moredotdotdot": "Tše dingwe...",
        "mypage": "Letlakala",
        "mytalk": "Bolela",
-       "anontalk": "Poledišano ya IP ye",
+       "anontalk": "Poledišano",
        "navigation": "Tšwelotšo",
        "and": "&#32;le",
        "qbfind": "Humana",
+       "qbbrowse": "Leba",
        "qbedit": "Fetola",
        "qbpageoptions": "Letlakala le",
        "qbmyoptions": "Matlakala a ka",
        "updatedmarker": "fetotšwe esale ketelo yaka ya mafelelo",
        "printableversion": "''Version'' ya go gatišega",
        "permalink": "Hlomaganyo yao e tiišeditšwego",
+       "view": "Leba",
+       "view-foreign": "Leba go $1",
        "edit": "Fetola",
        "create": "Tlhoma",
        "editthispage": "Fetola letlakala  le",
        "disclaimers": "Hlapa-matsogo",
        "disclaimerpage": "Project:Hlapa-Matsogo",
        "edithelp": "Thušo ya go fetola",
+       "helppage-top-gethelp": "Thušo",
        "mainpage": "Letlakala la Pele",
        "mainpage-description": "Letlakala la Pele",
        "policy-url": "Project:Melao",
-       "portal": "''Portal'' ya badudi",
-       "portal-url": "Project:Portal ya Badudi",
+       "portal": "Sebaka sa badudi",
+       "portal-url": "Project:Sebaka sa Badudi",
        "privacy": "Melao ya praebesi",
        "privacypage": "Project:Polisi ya praefesi",
        "badaccess": "Thušo ya tumello",
        "toc": "Mateng",
        "showtoc": "bontšha",
        "hidetoc": "fihla",
+       "confirmable-yes": "Ee",
+       "confirmable-no": "Aowa",
        "thisisdeleted": "Nyakorela goba hlaphola $1?",
        "viewdeleted": "Nyakorela $1?",
        "restorelink": "{{PLURAL:$1|e tee phetogo ye phumutšwego|phetogo tše $1 tše phumutšwego}}",
        "protectedpagetext": "Letlakala le le notletšwe go thibela diphetogo.",
        "viewsourcetext": "O ka lebelela goba wa kôpiša mothapo wa letlakala le:",
        "namespaceprotected": "Ga ona tokelo ya go fetola matlakala  go  '''$1''' .",
+       "exception-nologin": "Ga wa tsena",
        "yourname": "Leina la mošomiši:",
+       "userlogin-yourname": "Leina la mošomši",
        "yourpassword": "Ditlhaka-tša-siphiri:",
        "yourpasswordagain": "Tlanya ditlhaka-tša-siphiri gape:",
-       "remembermypassword": "Gopola sedi yaka ya go tsena khomphutha ye (bogolo bja  $1 ya {{PLURAL:$1| letšatši le|matšatši a}})",
        "login": "Tsena",
        "nav-login-createaccount": "Tsena / Tlhola tšhupaleloko (''account'')",
        "userlogin": "Tsena / tlhola tšhupaleloko (''account'')",
+       "userloginnocreate": "Tsena",
        "logout": "Etšwa/Tswalela",
        "userlogout": "Etšwa/Tswalela",
        "notloggedin": "Ga wa tsena",
        "createaccountreason": "Lebaka:",
        "badretype": "Ditlhaka-tša-siphiri tše o di šomišitšego ga di swane.",
        "noname": "Gawa fana ka leina la mošomiši la go loka.",
-       "loginsuccesstitle": "O tsene ka katlego",
+       "loginsuccesstitle": "O tsene",
        "loginsuccess": "'''Bjale o tsene go {{SITENAME}} bjalo ka \"$1\".'''",
-       "nosuchuser": "Ga gona mošomiši wa leina la \"$1\".\nMaina a huduetša ke ditlhaka.\nLebele mopeleto wa gago goba [[Special:CreateAccount|o tlhome mošomiši yo mophsa]].",
+       "nosuchuser": "Ga gona mošomiši wa leina la \"$1\".\nMaina a huduetša ke seemo sa ditlhaka (case sensitive).\nLebele mopeleto wa gago goba [[Special:CreateAccount|o tlhome mošomiši yo mophsa]].",
        "nosuchusershort": "Ga gona mošomiši wa leina la \"$1\". Hlokomela mopeleto wa gago.",
        "nouserspecified": "O swanela ke go fana ka leina la mošomiši.",
        "wrongpassword": "O loketše ditlhaka-tša-siphiri tšeo e sego tšona. Ka kgopelo, leka gape.",
        "passwordremindertext": "Motho yo mongwe (goba wena, gotšwa IP atrese $1) o\nkgopetše gore re moromele Ditlhaka-tša-siphiri tše mfsa tša {{SITENAME}} ($4).\n\nDitlhaka-tša-siphiri tša  mošomiši \"$2\" go tloga bjale ke  \"$3\".\n\nDitlhaka-tša-siphiri di tla šoma {{PLURAL:$5|letšatši|matšatši a $5}}.\n\nGa eba motho yo mongwe esego wena o dirile kgopelo ye, goba o gopola Ditlhaka-tša-siphiri gomme ga o sa\nhloka gore e fetolwe, hlokomologa molaetša wo, o tšwele pele o šumiše Ditlhaka-tša-siphiri tša kgale.",
        "noemail": "Ga gona e-mail atrese ya mošomiši \"$1\".",
        "passwordsent": "\nDihlaka tša siphiri (''password'') tše mphsa di rometšwe go e-mail atrese ya \"$1\".\nRe kgopela gore o tsene ge fetša go e hwetša.",
-       "blocked-mailpassword": "IP atrese ya gago e thibetšwe go dira diphetogo, ka fao ga wa dumellwa\ngo šomiša thulusu ya go hwetša Ditlhaka-tša-siphiri go thibela go hlapanya.",
+       "blocked-mailpassword": "IP atrese ya gago e thibetšwe go dira diphetogo.\nGo thibela go hlapanya, ga wa dumellwa\ngo šomiša thulusu ya go hwetša Ditlhaka-tša-siphiri ka aterese ye.",
        "eauthentsent": "Molaetša wa go tiišetša o  rometšwe go e-mail atrese.\n\nPele re romela melaetša ye mengwe go atrese ye, o kgopelwa go latela ditaelo tšeo dilego molaetšeng go tiišetša gore atrese ke ya gago.",
        "throttled-mailpassword": "Kgopelo ya go fetola ditlhaka-tša-siphiri e rometšwe {{PLURAL:$1|iring|diiring tše $1}} tša gofeta.\nGo thibela go hlapanya/kgobošo, kgopotšo e tee ka {{PLURAL:$1|iri|diiri tše $1}} e tla romellwa.",
        "mailerror": "Gobile le phošo go romeleng molaetša  : $1",
-       "acct_creation_throttle_hit": "Ka maswabi, IP Aterese ya gago e tlhomile {{PLURAL:$1|tšhupaleloko|$1 tša ditšhupaleloko}} e se kgale.\nGa wa dumelwa go tlhoma tše dingwe ka se sebaka.",
+       "acct_creation_throttle_hit": "Ka maswabi, IP Aterese ya gago e tlhomile {{PLURAL:$1|tšhupaleloko|$1 tša ditšhupaleloko}} sebakeng sa $2.\nGa wa dumelwa go tlhoma tše dingwe ka se sebaka.",
        "emailauthenticated": "E-mail atrese ya gago e kgonthišitšwe ka $2  $3.",
        "accountcreated": "Tšhupaleloko (Account) e tlhodilwe",
        "accountcreatedtext": "Tšhupaleloko (account) ya modiri [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]]) e tlhodilwe.",
        "loginlanguagelabel": "Polelo: $1",
+       "pt-login": "Tsena",
+       "pt-login-button": "Tsena",
+       "pt-createaccount": "Bula tšhupaleloko",
+       "pt-userlogout": "Etšwa/Tswalela",
        "changepassword": "Fetola ditlhaka-tša-siphiri",
        "resetpass_text": "<!-- Tsenya ditlhaka mo -->",
        "oldpassword": "Ditlhaka-tša-siphiri tša kgale:",
        "newpassword": "Ditlhaka-tša-siphiri tše mpsha:",
        "retypenew": "Tlanya ditlhaka tše mphsa tša siphiri gape:",
-       "changepassword-success": "Ditlhaka tša siphiri di fetotšwe ka katlego!",
+       "resetpass_submit": "Lokela ditlhaka-tša-siphiri o tsene",
+       "changepassword-success": "Ditlhaka tša siphiri di fetotšwe!",
+       "passwordreset-username": "Leina la mošomiši:",
        "bold_sample": "Mongwalo wa '''Bold'''",
        "bold_tip": "Ditlhaka tše Bold",
        "italic_sample": "Ditlhaka tše Italic",
        "accmailtext": "Ditlhaka-tša-siphiri tša  [[User talk:$1|$1]]  di rometšwe go $2. Di ka fetolwa go letlaka la <em>[[Special:ChangePassword|go fetola ditlhaka-tša-siphiri ]]</em> ge o tsena.",
        "newarticle": "(mpsha)",
        "newarticletext": "O latetše hlomaganyo go letlakala leo le sego gona ka se sebaka.\nGo tlhola letlakala, thoma go ngwalo lepokising le letelago\n(lebelela [$1 letlakala la thušo] go hwetša šedi).\nGa eba o le fa ka phošo, o ka boela morago ka go šumiša konopo ya '''back''' go ''browser'' ya gago.",
-       "noarticletext": "Ga gona ditlhaka letlakaleng le, oka [[Special:Search/{{PAGENAME}}|fetleka leina la letlakala]] matlakaleng a mangwe, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} fetleka \"logs\"], goba [{{fullurl:{{FULLPAGENAME}}|action=edit}} wa fetola letlakala le]</span>.",
-       "noarticletext-nopermission": "Ga gona ditlhaka letlakaleng le, \noka [[Special:Search/{{PAGENAME}}|fetleka leina la letlakala]] matlakaleng a mangwe,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} fetleka \"logs\"],\n goba [{{fullurl:{{FULLPAGENAME}}|action=edit}} wa fetola letlakala le]</span>.",
+       "noarticletext": "Ga gona ditlhaka letlakaleng le.\nO ka [[Special:Search/{{PAGENAME}}|fetleka leina la letlakala]] matlakaleng a mangwe, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} fetleka \"logs\"], goba [{{fullurl:{{FULLPAGENAME}}|action=edit}} wa fetola letlakala le]</span>.",
+       "noarticletext-nopermission": "Ga gona ditlhaka letlakaleng le.\nO ka [[Special:Search/{{PAGENAME}}|fetleka leina la letlakala]] matlakaleng a mangwe,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} fetleka \"logs\"],\n goba [{{fullurl:{{FULLPAGENAME}}|action=edit}} wa fetola letlakala le]</span>.",
        "note": "'''Ela hloko:'''",
        "previewnote": "'''Elelwa gore ye ke taetšo ya sebopego sa letlakala fela.'''\nDiphetogo tša gago ga šetšo di bolokwa!",
        "editing": "O fetola $1",
        "skin-preview": "Ponopele",
        "prefs-rc": "Diphetogo tša bjale",
        "prefs-watchlist": "Lenano la tlhapetšo",
+       "prefs-rendering": "Ponagalo",
        "saveprefs": "Boloka",
        "prefs-editing": "Fetola",
        "searchresultshead": "Fetleka",
        "savedprefs": "Dikgatlhegelo tša gago di bolokilwe.",
        "allowemail": "Dumella melaetša ya e-mail go tšwa go bašomiši ba bangwe",
+       "prefs-searchoptions": "Fetleka",
        "prefs-files": "Difaele",
        "youremail": "E-Poso",
        "username": "{{GENDER:$1|Mošomiši}}:",
        "yourlanguage": "Polelo:",
        "yournick": "Tshaeno:",
        "badsiglength": "Leina la boreelo le letelele kudu.\nLe swanela goba fase ga $1 {{PLURAL:$1|ya tlhaka|tša ditlhaka}}",
-       "prefs-help-realname": "Leina la nnete gale gapeletšwe, efela ge o kgetha go fana ka lona, le tla šomišwa go bontšha diabe mešomong ya gago.",
+       "prefs-help-realname": "Leina la nnete gale gapeletšwe.\nGe o kgetha go fana ka lona, le tla šomišwa go bontšha diabe mešomong ya gago.",
        "prefs-help-email": "Aterese ya E-poso gae hlokagale, efela e ka hlokagala ge dihlaka tša sephiri di fetolwa, ge o ka lebala dihlaka tša gago tša sephiri",
        "prefs-help-email-others": "O ka kgetha gore batho ba bangwe ba bolele le wena ka  e-poso ga kgokaganyo letlakala la gago goba letlakala la dipoledišano.\nGa re fane ka e-poso ya gago go bašumiši ba bangwe ge ba polela le wena ka yona.",
        "prefs-help-email-required": "E-mail atrese eya nyakega.",
        "rightslog": "''log'' ya ditumello tša mošomiši",
        "action-edit": "Fetola letlakala  le",
        "nchanges": "$1 {{PLURAL:$1|phetogo|diphetogo}}",
+       "enhancedrc-history": "histori",
        "recentchanges": "Diphetogo tša bjale",
        "recentchanges-legend": "Dikgetho tša diphetogo tša bjale",
        "recentchanges-summary": "Lebalana diphetogo tše di mphsa-mphsa go wiki  letlakaleng le.",
        "rcnotefrom": "Tlase ke diphetogo go tloga ka <strong>$3, $4</strong> (go  fihla ka <strong>$1</strong>).",
        "rclistfrom": "Laêtša dipheto tše mfsa go thoma go $3 $2",
        "rcshowhideminor": "$1 ya diphetogo tše nnyenyane",
+       "rcshowhideminor-hide": "Fihla",
        "rcshowhidebots": "$1 bots",
+       "rcshowhidebots-show": "Bontšha",
        "rcshowhideliu": "$1 bašumiši bao batsebjawago",
+       "rcshowhideliu-hide": "Fihla",
        "rcshowhideanons": "$1 bašumiši bago se tsebege",
+       "rcshowhideanons-hide": "Fihla",
        "rcshowhidepatr": "$1 diphetogo tše ''patrolled''",
        "rcshowhidemine": "$1 diphetogo tsa ka",
+       "rcshowhidemine-hide": "Fihla",
        "rclinks": "Bontšha diphetogo tša bofelo tše $1 matšatšing a  $2  a bofelo <br />$3",
        "diff": "phapang",
        "hist": "histori",
        "blanknamespace": "(Hlogo)",
        "contributions": "Diabe tša mošomiši",
        "contributions-title": "Diabe tša mošumiši go $1",
-       "mycontris": "Diabe tša ka",
+       "mycontris": "Diabe",
        "contribsub2": "Ya $1 ($2)",
-       "uctop": "(godimo)",
+       "uctop": "(bjale)",
        "month": "Go tloga kgweding (le peleng):",
        "year": "Go tloga ngwageng (le peleng):",
        "sp-contributions-newbies": "Laetša diabe tša bašumiši ba bafsa fela",
        "tooltip-pt-login": "O a kgothatšwa gore o tsene, e efela ga se kgapeletšo.",
        "tooltip-pt-logout": "Etšwa fa/Tswalela/Log out",
        "tooltip-ca-talk": "Poledišano mabapi le letlakala le",
-       "tooltip-ca-edit": "O ka fetola letlakala le. Kgopelo ke gore o šumiše konopo ya go Laetša sebopego sa letlakala pele o le boloka.",
+       "tooltip-ca-edit": "Fetola letlakala  le",
        "tooltip-ca-addsection": "Lokela sekgao se seswa",
        "tooltip-ca-viewsource": "Letlakala le le lotilew. O ka lebelela mothopo fela.",
        "tooltip-ca-history": "Lebelela thumeletšo ya go feta ya letlakala le",
        "lastmodifiedatby": "Letlakala le  fetotšwe la mafelelo ka $2, $1 ke $3.",
        "others": "tše dingwe",
        "siteusers": "{{SITENAME}} {{PLURAL:$2|mošumiši|bašumiši}} $1",
+       "pageinfo-toolboxlink": "Tsebo ya Letlakala",
        "filedeleteerror-short": "Phošo go phumuleng faele: $1",
        "filedeleteerror-long": "Diphošo di hlagile ge go phumulwa faele:\n\n$1",
        "filedelete-missing": "Faele \"$1\" ga e phumulege ka ge e segona.",
        "specialpages": "Matlakala a kgethegilego",
        "external_image_whitelist": " #Tlogela letlakale ka mokgwa wo<pre>\n#Tsenya  \"regular expression fragments\" (parata ya magareng ga //) below\n#These will be matched with the URLs of external (hotlinked) images\n#Those that match will be displayed as images, otherwise only a link to the image will be shown\n#Lines beginning with # are treated as comments\n#This is case-insensitive\n\n#Put all regex fragments above this line. Leave this line exactly as it is</pre>",
        "tag-filter": "[[Special:Tags|Tag]] \"filter\":",
+       "searchsuggest-search": "Fetleka  {{SITENAME}}",
        "expand_templates_output": "Phetho"
 }
index 4048ef8..3493eb7 100644 (file)
@@ -33,6 +33,7 @@
        "tog-watchdefault": "Apondre las paginas que modifiqui e los fichièrs qu'impòrti a ma lista de seguiment",
        "tog-watchmoves": "Apondre las paginas e los fichièrs que tòrni nomenar a ma lista de seguiment",
        "tog-watchdeletion": "Apondre las paginas e los fichièrs que suprimissi de ma lista de seguiment",
+       "tog-watchuploads": "Apondre los novèls fichièrs qu’impòrti a ma lista de seguiment",
        "tog-watchrollback": "Apondre a ma lista de seguiment las paginas sus las qualas ai efectuat una revocacion",
        "tog-minordefault": "Considerar mas modificacions coma menoras per defaut",
        "tog-previewontop": "Far veire la previsualizacion al dessús de la zòna de modificacion",
@@ -42,7 +43,7 @@
        "tog-enotifminoredits": "M’avertir per corrièr electronic quitament en cas de modificacions menoras de las paginas o dels fichièrs",
        "tog-enotifrevealaddr": "Afichar mon adreça electronica dins la los corrièrs electronics d’avertiment",
        "tog-shownumberswatching": "Afichar lo nombre d'utilizaires que seguisson aquesta pagina",
-       "tog-oldsig": "Signatura existenta :",
+       "tog-oldsig": "Vòstra signatura existenta :",
        "tog-fancysig": "Tractar la signatura coma de wikitèxte (sens ligam automatic)",
        "tog-uselivepreview": "Utilizar l’apercebut rapid",
        "tog-forceeditsummary": "M'avertir quand ai pas completat lo contengut de la bóstia de comentaris",
@@ -59,7 +60,7 @@
        "tog-showhiddencats": "Afichar las categorias amagadas",
        "tog-norollbackdiff": "Afichar pas lo diff aprèp aver revocat",
        "tog-useeditwarning": "M’avisar quand quiti una pagina de modificacion sens publicar los cambiaments",
-       "tog-prefershttps": "Utilizar totjorn una connexion securizada en essent connectat",
+       "tog-prefershttps": "Utilizatz totjorn una connexion securizada per vos connectar",
        "underline-always": "Totjorn",
        "underline-never": "Pas jamai",
        "underline-default": "Valor per defaut del navigador o del tèma",
        "newwindow": "(dobrís una fenèstra novèla)",
        "cancel": "Anullar",
        "moredotdotdot": "E mai...",
-       "morenotlisted": "Aquesta lista es pas completa.",
+       "morenotlisted": "Aquesta lista pòt èsser incompleta.",
        "mypage": "Pagina",
        "mytalk": "Discussion",
        "anontalk": "Discussion",
        "talk": "Discussion",
        "views": "Afichatges",
        "toolbox": "Aisinas",
+       "tool-link-userrights": "Modificar los gropes de {{GENDER:$1|l’utilizaire|l’utilizaira}}",
+       "tool-link-emailuser": "Mandar un corrièr electronic a {{GENDER:$1|l’utilizaire|l’utilizaira}}",
        "userpage": "Pagina d'utilizaire",
        "projectpage": "Pagina meta",
        "imagepage": "Veire la pagina del fichièr",
        "virus-unknownscanner": "antivirús desconegut :",
        "logouttext": "'''Ara, sètz desconnectat.'''\n\nNotatz que d'unas paginas pòdon èsser encara afichadas coma s'eratz encara connectat, fins al moment qu'escafaretz l'escondedor de vòstre navigador.",
        "cannotlogoutnow-title": "Impossible de se desconnectar ara",
+       "cannotlogoutnow-text": "La desconnexion es pas possibla en utilizant $1.",
        "welcomeuser": "Benvenguda, $1&nbsp;!",
        "welcomecreation-msg": "Vòstre compte d'utilizaire es estat creat.\nDoblidetz pas de modificar [[Special:Preferences|vòstras preferéncias per {{SITENAME}}]].",
        "yourname": "Nom d'utilizaire :",
        "createacct-yourpasswordagain-ph": "Entratz lo senhal tornarmai",
        "userlogin-remembermypassword": "Gardar ma session activa",
        "userlogin-signwithsecure": "Utilizar una connexion securizada",
+       "cannotlogin-title": "Impossible de se connectar",
+       "cannotlogin-text": "La connexion es pas possibla.",
        "cannotloginnow-title": "Impossible de se connectar ara",
+       "cannotloginnow-text": "La connexion es pas possibla en utilizant $1.",
+       "cannotcreateaccount-title": "Creacion de comptes impossibla",
+       "cannotcreateaccount-text": "La creacion dirècta de comptes d'utilizaires es pas activada sus aqueste wiki.",
        "yourdomainname": "Vòstre domeni",
        "password-change-forbidden": "Podètz pas modificar los senhals sus aqueste wiki.",
        "externaldberror": "Siá una error s’es produita amb la basa de donadas d’autentificacion extèrna, siá sètz pas autorizat a metre a jorn vòstre compte extèrne.",
        "login": "Identificacion",
+       "login-security": "Verificar vòstra identitat",
        "nav-login-createaccount": "Crear un compte o se connectar",
        "userlogin": "Crear un compte o se connectar",
        "userloginnocreate": "Connexion",
        "userlogin-resetpassword-link": "Senhal doblidat ?",
        "userlogin-helplink2": "Ajuda a la connexion",
        "userlogin-loggedin": "Sètz ja connectat en tant que {{GENDER:$1|$1}}.\nUtilizatz lo formulari çaijós per vos connectar amb un autre utilizaire.",
+       "userlogin-reauth": "Vos cal vos reconnectar per verificar que sètz {{GENDER:$1|$1}}.",
        "userlogin-createanother": "Crear un autre compte",
        "createacct-emailrequired": "Adreça electronica",
        "createacct-emailoptional": "Adreça de corrièr electronic (facultativa)",
        "createacct-reason-ph": "Perqué creatz un autre compte",
        "createacct-submit": "Creatz vòstre compte",
        "createacct-another-submit": "Crear un compte",
+       "createacct-continue-submit": "Contunhar la creacion de compte",
+       "createacct-another-continue-submit": "Contunhar la creacion de compte",
        "createacct-benefit-heading": "{{SITENAME}} es escrit per de monde coma vos.",
        "createacct-benefit-body1": "{{PLURAL:$1|cambiament|cambiaments}}",
        "createacct-benefit-body2": "{{PLURAL:$1|pagina|paginas}}",
        "createacct-another-realname-tip": "Lo nom vertadièr es opcional.\nSe decidissètz de lo provesir, serà utilizat per atribuir a l’utilizaire sos trabalhs.",
        "pt-login": "Se connectar",
        "pt-login-button": "Se connectar",
+       "pt-login-continue-button": "Contunhar la connexion",
        "pt-createaccount": "Crear un compte",
        "pt-userlogout": "Se desconnectar",
        "php-mail-error-unknown": "Error desconeguda dins la foncion mail() de PHP.",
        "changepassword-success": "Vòstre senhal es estat modificat !",
        "changepassword-throttled": "Avètz ensajat un tròp grand nombre de connexions darrièrament.\nEsperatz $1 abans d’ensajar tornarmai.",
        "botpasswords": "Senhals de robòts",
+       "botpasswords-label-appid": "Nom del robòt :",
+       "botpasswords-label-create": "Crear",
+       "botpasswords-label-update": "Metre a jorn",
+       "botpasswords-label-cancel": "Anullar",
+       "botpasswords-label-delete": "Suprimir",
+       "botpasswords-label-resetpassword": "Reïnicializar lo senhal",
+       "botpasswords-label-grants": "Dreits aplicables :",
+       "botpasswords-label-grants-column": "Acordat",
+       "botpasswords-bad-appid": "Lo nom del robòt «$1» es pas valid.",
        "resetpass_forbidden": "Los senhals pòdon pas èsser cambiats",
        "resetpass-no-info": "Vos cal èsser connectat per aver accès a aquesta pagina.",
        "resetpass-submit-loggedin": "Modificar lo senhal",
        "history-feed-description": "Istoric per aquesta pagina sul wiki",
        "history-feed-item-nocomment": "$1 lo $2",
        "history-feed-empty": "La pagina demandada existís pas.\nBenlèu es estada escafada o renomenada.\nEnsajatz de [[Special:Search|recercar sul wiki]] per trobar de paginas en rapòrt.",
+       "history-edit-tags": "Modificar las balisas de las versions seleccionadas",
        "rev-deleted-comment": "(resumit de comentari suprimit)",
        "rev-deleted-user": "(nom d’utilizaire suprimit)",
        "rev-deleted-event": "(detalhs de l'entrada suprimida)",
        "mergehistory-empty": "Cap de revision pòt pas èsser fusionada.",
        "mergehistory-done": "$3 version{{PLURAL:$3||s}} de $1 {{PLURAL:$3|es estada fusionada|son estada fusionadas}} dins [[:$2]].",
        "mergehistory-fail": "Impossible de procedir a la fusion dels istorics. Seleccionatz  tornamai la pagina e mai los paramètres de data.",
+       "mergehistory-fail-bad-timestamp": "L’orodatatge es pas valid.",
        "mergehistory-fail-toobig": "Impossible d’efectuar la fusion de l’istoric perque un nombre de {{PLURAL:$1|revisions}} superior al limit de $1 deuriá èsser desplaçat.",
        "mergehistory-no-source": "La pagina d'origina $1 existís pas.",
        "mergehistory-no-destination": "La pagina de destinacion $1 existís pas.",
        "searchprofile-advanced-tooltip": "Recercar dins d'espacis de noms personalizats",
        "search-result-size": "$1 ({{PLURAL:$2|1 mot|$2 mots}})",
        "search-result-category-size": "$1 membre{{PLURAL:$1||s}} ($2 soscategoria{{PLURAL:$2||s}}, $3 fichièr{{PLURAL:$3||s}})",
-       "search-redirect": "(redireccion cap a $1)",
+       "search-redirect": "(redireccion dempuèi $1)",
        "search-section": "(seccion $1)",
        "search-category": "(categoria $1)",
        "search-file-match": "(correspond al contengut del fichièr)",
        "activeusers-intro": "Aquò es una lista dels utilizaires qu'an exerçat una activitat quina que siá al cors {{PLURAL:$1|de la darrièra jornada|dels $1 darrièrs jorns}}.",
        "activeusers-count": "$1 {{PLURAL:$1|accion|accions}} al moment {{PLURAL:$3|del darrièr jorn|dels $3 darrièrs jorns}}",
        "activeusers-from": "Afichar los utilizaires dempuèi :",
-       "activeusers-hidebots": "Amagar los robòts",
-       "activeusers-hidesysops": "Amagar los administrators",
        "activeusers-noresult": "Cap d'utilizaire pas trobat.",
        "listgrouprights": "Dreits dels gropes d'utilizaires",
        "listgrouprights-summary": "Aquesta pagina conten una lista de gropes definits sus aqueste wiki e mai los dreits d'accès qu'i son associats.\nI pòt aver [[{{MediaWiki:Listgrouprights-helppage}}|d'entresenhas complementàrias]] a prepaus dels dreits.",
        "htmlform-cloner-create": "Apondre encara",
        "htmlform-cloner-delete": "Suprimir",
        "htmlform-cloner-required": "Una valor al mens es obligatòria.",
-       "sqlite-has-fts": "$1 amb recèrca en tèxte integral suportada",
-       "sqlite-no-fts": "$1 sens recèrca en tèxte integral suportada",
        "logentry-delete-delete": "$1 {{GENDER:$2|a suprimit}} la pagina $3",
        "logentry-delete-restore": "$1 {{GENDER:$2|a restablit}} la pagina $3",
        "logentry-delete-event": "$1 {{GENDER:$2|a modificat}} la visibilitat {{PLURAL:$5|d'un eveniment del jornal|de $5 eveniments del jornal}} sus $3 : $4",
        "feedback-close": "Fait",
        "feedback-external-bug-report-button": "Senhalar un bug tecnic",
        "feedback-dialog-title": "Sometre un comentari",
-       "feedback-error-title": "Error",
        "feedback-error1": "Error : Resultat de l'IPA pas reconegut",
        "feedback-error2": "Error : la modificacion a fracassat",
        "feedback-error3": "Error : pas cap de responsa de l'API",
        "feedback-thanks": "Mercé ! Vòstre comentari es estat publicat sus la pagina \"[$2 $1]\".",
        "feedback-thanks-title": "Mercés !",
        "feedback-useragent": "Agent utilizaire :",
-       "searchsuggest-search": "Recercar",
+       "searchsuggest-search": "Recercar sus {{SITENAME}}",
        "searchsuggest-containing": "que conten...",
        "api-error-badaccess-groups": "Sètz pas autorizat a cargar de fichièrs sus aqueste wiki.",
        "api-error-badtoken": "Error intèrna : marrit « geton ».",
index 849c619..1f25b38 100644 (file)
        "minoredit": "ଏହା ଏକ ସାମାନ୍ୟ ସମ୍ପାଦନା",
        "watchthis": "ଏହି ପୃଷ୍ଠାଟିକୁ ଦେଖିବେ",
        "savearticle": "ସାଇତିବେ [Save]",
-       "savechanges": "ସାଇତିବେ ['''Save''']",
+       "savechanges": "ସାଇତିବେ [Save]",
        "preview": "ସାଇତିବା ଆଗରୁ ଦେଖନ୍ତୁ",
        "showpreview": "ଦେଖଣା [Preview]",
        "showdiff": "ବଦଳଗୁଡ଼ିକ ଦେଖାଇବେ",
        "activeusers-intro": "ବିଗତ $1 {{PLURAL:$1|ଦିନ|ଦିନ}} ଭିତରେ କିଛି ପ୍ରକାରର କାମ କରିଥିବା ସଭ୍ୟମାନଙ୍କର ତାଲିକା ।",
        "activeusers-count": "ବିଗତ {{PLURAL:$3|ଦିନ|$3 ଦିନରେ}}ରେ $1ଟି {{PLURAL:$1|ସମ୍ପାଦନା|ସମ୍ପାଦନାଗୁଡିକ}}",
        "activeusers-from": "ଏହି ନାମରେ ଆରମ୍ଭ ହେଉଥିବା ସଭ୍ୟମାନଙ୍କୁ ଦେଖାଇବେ:",
-       "activeusers-hidebots": "ଆପେଆପେ ଚାଳିତ ସଭ୍ୟମାନଙ୍କୁ ଲୁଚାନ୍ତୁ",
-       "activeusers-hidesysops": "ପରିଚାଳକମାନଙ୍କୁ ଲୁଚାଇବେ",
        "activeusers-noresult": "ଜଣେ ବି ସଭ୍ୟ ମିଳିଲେ ନାହିଁ ।",
        "listgrouprights": "ସଭ୍ୟ ଗୋଠ ଅଧିକାରସମୂହ",
        "listgrouprights-summary": "ତଳେ ଉଇକି ସ୍ଥିର କରାଯାଇଥିବା ଏକ ଏକ ବ୍ୟବହାରକାରୀ ଗୋଠର ତାଲିକା ଦିଆଯାଇଛି, ସେଥିରେ ସେମାନଙ୍କ ବ୍ୟବହାର ଅଧିକାର ବାବଦରେ ମଧ୍ୟ ଦିଆଯାଇଛି ।\nସେଥିରେ ବୋଧେ [[{{MediaWiki:Listgrouprights-helppage}}|ଅଧିକ ବ୍ୟକ୍ତିଗତ ବିବରଣୀ ଥାଇପାରେ]] ।",
index 705cc5c..ece57c4 100644 (file)
        "action-applychangetags": "wprowadzania znaczników wraz z własnymi zmianami",
        "action-changetags": "dodawania i usuwania dowolnych znaczników z poszczególnych wersji i wpisów w rejestrze",
        "action-deletechangetags": "usuwania znaczników z bazy danych",
+       "action-purge": "wyczyść pamięć podręczną tej strony",
        "nchanges": "$1 {{PLURAL:$1|zmiana|zmiany|zmian}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|od ostatniej wizyty}}",
        "enhancedrc-history": "historia",
        "filerevert-submit": "Przywróć",
        "filerevert-success": "Plik '''[[Media:$1|$1]]''' został cofnięty do [$4 wersji z $3, $2].",
        "filerevert-badversion": "Brak poprzedniej lokalnej wersji tego pliku z podaną datą.",
+       "filerevert-identical": "Aktualna wersja pliku już jest identyczna z wybraną.",
        "filedelete": "Usuwanie „$1”",
        "filedelete-legend": "Usuń plik",
        "filedelete-intro": "Chcesz usunąć plik '''[[Media:$1|$1]]''' razem z całą jego historią.",
        "booksources-search": "Szukaj",
        "booksources-text": "Poniżej znajduje się lista odnośników do innych witryn, które pośredniczą w sprzedaży nowych i używanych książek, a także mogą posiadać dalsze informacje na temat poszukiwanej przez Ciebie książki.",
        "booksources-invalid-isbn": "Podany numer ISBN został rozpoznany jako nieprawidłowy. Sprawdź czy podany numer zgadza się z numerem zaczerpniętym ze źródła.",
+       "magiclink-tracking-rfc": "Strony używające magicznych linków RFC",
+       "magiclink-tracking-pmid": "Strony używające magicznych linków PMID",
+       "magiclink-tracking-isbn": "Strony używające magicznych linków ISBN",
        "specialloguserlabel": "Kto:",
        "speciallogtitlelabel": "Co (tytuł lub {{ns:user}}:nick użytkownika):",
        "log": "Rejestr operacji",
        "activeusers-intro": "Poniżej znajduje się lista użytkowników, którzy byli aktywni w ciągu {{PLURAL:$1|ostatniego dnia|ostatnich $1 dni}}.",
        "activeusers-count": "w ciągu {{PLURAL:$3|ostatniego dnia|ostatnich $3 dni}} {{GENDER:$2|wykonał|wykonała|wykonał}} $1 {{PLURAL:$1|operację|operacje|operacji}}",
        "activeusers-from": "Pokaż użytkowników zaczynając od:",
-       "activeusers-hidebots": "Ukryj boty",
-       "activeusers-hidesysops": "Ukryj administratorów",
+       "activeusers-groups": "Wyświetl użytkowników należących do grup:",
        "activeusers-noresult": "Nie odnaleziono żadnego użytkownika.",
        "activeusers-submit": "Wyświetl aktywnych użytkowników",
        "listgrouprights": "Uprawnienia grup użytkowników",
        "modifiedarticleprotection": "zmienił(a) stopień zabezpieczenia „[[$1]]”",
        "unprotectedarticle": "odbezpieczył(a) „[[$1]]”",
        "movedarticleprotection": "przeniósł ustawienia zabezpieczeń z [[$2]] do [[$1]]",
+       "protectedarticle-comment": "{{GENDER:$2|Zabezpieczył|Zabezpieczyła}} „[[$1]]”",
+       "modifiedarticleprotection-comment": "{{GENDER:$2|Zmienił|Zmieniła}} poziom zabezpieczenia „[[$1]]”",
+       "unprotectedarticle-comment": "{{GENDER:$2|Usunął|Usunęła}} zabezpieczenie z „[[$1]]”",
        "protect-title": "Zmiana stopnia zabezpieczenia „$1”",
        "protect-title-notallowed": "Podgląd stopnia zabezpieczenia „$1”",
        "prot_1movedto2": "stronę [[$1]] przeniósł do [[$2]]",
        "log-action-filter-suppress-reblock": "Ukrycie użytkownika poprzez ponowną blokadę",
        "log-action-filter-upload-upload": "Nowe przesłane",
        "log-action-filter-upload-overwrite": "Przesłane ponownie",
+       "authmanager-authn-autocreate-failed": "Automatyczne tworzenie lokalnego konta nie powiodło się: $1",
        "authmanager-create-disabled": "Utworzenie konta jest wyłączone.",
-       "authmanager-create-from-login": "Aby utworzyć konto, wypełnij poniższe pola.",
+       "authmanager-create-from-login": "Aby utworzyć konto, wypełnij odpowiednie pola.",
+       "authmanager-create-not-in-progress": "Tworzenie konta nie jest wykonywane lub dane sesji zostały utracone. Zacznij od początku.",
        "authmanager-authplugin-setpass-failed-title": "Zmiana hasła nie powiodła się",
        "authmanager-authplugin-setpass-failed-message": "Wtyczka do uwierzytelniania uniemożliwiła zmianę hasła.",
        "authmanager-authplugin-create-fail": "Wtyczka do uwierzytelniania uniemożliwiła utworzenie konta.",
        "authmanager-provider-password-domain": "Uwierzytelnianie na podstawie hasła i domeny",
        "authmanager-provider-temporarypassword": "Hasło tymczasowe",
        "authprovider-confirmlink-success-line": "$1: Połączono.",
+       "authprovider-confirmlink-ok-help": "Kontynuuj po wyświetleniu komunikatów o błędach linkowania.",
        "authprovider-resetpass-skip-label": "Pomiń",
        "authprovider-resetpass-skip-help": "Pomiń resetowanie hasła.",
        "authform-newtoken": "Brakujący token. $1",
index 668515e..90cf9cc 100644 (file)
        "underline-default": "Padrão do navegador/skin",
        "editfont-style": "Estilo da fonte da área de edição:",
        "editfont-default": "Padrão do navegador",
-       "editfont-monospace": "Fonte mono-espaçada",
+       "editfont-monospace": "Fonte monoespaçada",
        "editfont-sansserif": "Fonte sem serifa",
        "editfont-serif": "Fonte serifada",
        "sunday": "domingo",
        "protectedpages-page": "Página",
        "protectedpages-expiry": "Expira",
        "protectedpages-performer": "Usuário que protegeu",
-       "protectedpages-params": "Parâmetros de proteção.",
+       "protectedpages-params": "Parâmetros de proteção",
        "protectedpages-reason": "Motivo",
        "protectedpages-submit": "Exibir páginas",
        "protectedpages-unknown-timestamp": "Desconhecido",
        "activeusers-intro": "Esta é uma lista de usuários com algum tipo de atividade nos últimos $1 {{PLURAL:$1|dia|dias}}.",
        "activeusers-count": "$1 {{PLURAL:$1|ação|ações}} {{PLURAL:$3|no último dia|nos últimos $3 dias}}",
        "activeusers-from": "Mostrar usuários começando por:",
-       "activeusers-hidebots": "Esconder robôs",
-       "activeusers-hidesysops": "Esconder administradores",
        "activeusers-noresult": "Nenhum usuário encontrado.",
        "activeusers-submit": "Mostrar usuários ativos",
        "listgrouprights": "Privilégios de grupos de usuários",
        "listgrouprights-namespaceprotection-namespace": "Namespace",
        "listgrouprights-namespaceprotection-restrictedto": "Direito(s) permitindo edições do usuário",
        "listgrants": "Atribuições",
+       "listgrants-summary": "Esta é uma lista de atribuições com os respetivos acessos às permissões de usuário. Os usuários podem autorizar aplicações a utilizar suas contas, mas com permissões limitadas baseadas nas atribuições dadas pelos usuários a cada aplicação. No entanto, uma aplicação agindo em nome de um usuário não pode utilizar permissões que o usuário não possui.\nPode haver [[{{MediaWiki:Listgrouprights-helppage}}|informação adicional]] sobre permissões individuais.",
        "listgrants-grant": "Atribuição",
        "listgrants-rights": "Direitos",
        "trackingcategories": "Categorias de rastreamento",
        "delete-toobig": "Esta página possui um longo histórico de edições, com mais de $1 {{PLURAL:$1|edição|edições}}.\nA eliminação de tais páginas foi restrita, a fim de se evitarem problemas acidentais em {{SITENAME}}.",
        "delete-warning-toobig": "Esta página possui um longo histórico de edições, com mais de $1 {{PLURAL:$1|edição|edições}}.\nEliminá-la poderá causar problemas na base de dados de {{SITENAME}};\nprossiga com cuidado.",
        "deleteprotected": "Não é possível eliminar esta página porque foi protegida.",
-       "deleting-backlinks-warning": "'''Cuidado:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Other pages]] ligam ou redirecionam para a página que você está prestes a excluir.",
+       "deleting-backlinks-warning": "'''Cuidado:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|outras páginas]] ligam ou redirecionam para a página que você está prestes a eliminar.",
        "rollback": "Reverter edições",
        "rollbacklink": "reverter",
        "rollbacklinkcount": "reverter $1 {{PLURAL:$1|edição|edições}}",
        "protect-cascadeon": "Esta página está protegida porque é transclusa da seguinte {{PLURAL:$1|página, que possui|páginas, que possuem}} a proteção em cascata ativas.\nAs mudanças no nível de proteção desta página não afetam a proteção em cascata.",
        "protect-default": "Permitir todos os usuários",
        "protect-fallback": "Permitir apenas os usuários com privilégio de \"$1\"",
-       "protect-level-autoconfirmed": "Permitir apenas usuários auto-confirmados",
+       "protect-level-autoconfirmed": "Permitir apenas usuários autoconfirmados",
        "protect-level-sysop": "Permitir apenas administradores",
        "protect-summary-cascade": "em cascata",
        "protect-expiring": "expira em $1 (UTC)",
        "tooltip-t-recentchangeslinked": "Mudanças recentes nas páginas para as quais esta possui links",
        "tooltip-feed-rss": "Feed RSS desta página",
        "tooltip-feed-atom": "Feed Atom desta página",
-       "tooltip-t-contributions": "Ver as contribuições {{GENDER:$1{{BASEPAGENAME}}|deste usuário|desta usuária|deste(a) usuário(a)}}",
+       "tooltip-t-contributions": "Ver as contribuições {{GENDER:$1|deste usuário|desta usuária|deste(a) usuário(a)}}",
        "tooltip-t-emailuser": "Enviar um e-mail a {{GENDER:{{BASEPAGENAME}}|este usuário|esta usuária|este(a) usuário(a)}}",
        "tooltip-t-info": "Mais informações sobre esta página",
        "tooltip-t-upload": "Enviar arquivos",
        "feedback-external-bug-report-button": "Registrar uma tarefa técnica",
        "feedback-dialog-title": "Enviar comentários",
        "feedback-dialog-intro": "Você pode usar o simples formulário abaixo para enviar seus comentários. Os mesmos serão adicionados à página \"$1\", junto com seu nome de usuário.",
-       "feedback-error-title": "Erro",
        "feedback-error1": "Erro: O resultado da API não foi reconhecido",
        "feedback-error2": "Erro: A edição falhou",
        "feedback-error3": "Erro: A API não responde",
index c208a6a..49fb484 100644 (file)
        "search": "Pesquisa",
        "search-ignored-headings": " #<!-- deixe esta linha exatamente como ela está --> <pre>\n# Títulos de página que serão ignorados pela pesquisa.\n# Mudanças a esta lista terão efeito quando a página com o título referido for indexada.\n# Pode forçar a indexação de uma página realizando uma edição nula nessa página.\n# A sintaxe é a seguinte:\n#  * Tudo desde um símbolo de cardinal (#) até ao fim da linha é um comentário\n#  * Cada linha não vazia é o título exato a ignorar, respeitando o uso de maiúsculas\nReferências\nLinks externos\nVer também\n #</pre> <!-- deixe esta linha exatamente como ela está -->",
        "searchbutton": "Pesquisar",
-       "go": "Ir",
+       "go": "Prosseguir",
        "searcharticle": "Ir",
        "history": "Histórico",
        "history_short": "Histórico",
        "databaseerror-query": "Consulta: $1",
        "databaseerror-function": "Função: $1",
        "databaseerror-error": "Erro: $1",
-       "transaction-duration-limit-exceeded": "Para evitar a criação de lag replicação alta, esta operação foi abortada porque a duração de gravação ($1) excedeu o limite de $2 {{PLURAL:$2|segundo|segundos}}. Se está a mudar muitos itens de uma vez, tente fazer várias operações menores em vez disso.",
+       "transaction-duration-limit-exceeded": "Para evitar grandes atrasos na replicação, esta operação foi cancelada porque a duração de gravação ($1) excedeu o limite de $2 {{PLURAL:$2|segundo|segundos}}. Se está a mudar muitos objetos de uma só vez, tente desmultiplicar a operação em várias de menor dimensão.",
        "laggedslavemode": "'''Aviso:''' A página pode não conter as atualizações mais recentes.",
        "readonly": "Base de dados bloqueada (limitada a leituras)",
        "enterlockreason": "Introduza um motivo para bloquear, incluindo uma estimativa de quando será desbloqueada",
        "delete-hook-aborted": "A eliminação foi cancelada por um \"hook\".\nNão foi dada nenhuma explicação.",
        "no-null-revision": "Não foi possível criar uma nova revisão nula para a página \"$1\"",
        "badtitle": "Título inválido",
-       "badtitletext": "O título de página solicitado era inválido, vazio, ou a ligação interlínguas estava incorreta.\nTalvez contenha um ou mais caracteres que não podem ser usados em títulos.",
+       "badtitletext": "O título de página solicitado era inválido, vazio, ou um link interlínguas ou interwikis incorrecto.\nTalvez contenha um ou mais caracteres que não podem ser usados em títulos.",
        "title-invalid-empty": "O título da página solicitada está vazio ou contém apenas o nome de um domínio.",
        "title-invalid-utf8": "O título da página solicitada contém uma sequência UTF-8 inválida.",
        "title-invalid-interwiki": "O título da página solicitada contém uma ligação interlíngua que não pode ser utilizada em títulos.",
        "title-invalid-magic-tilde": "O título da página solicitada possui uma sequência de tis inválida (<nowiki>~~~</nowiki>).",
        "title-invalid-too-long": "O título da página solicitada é demasiado longo. Não deverá ser maior que $1 {{PLURAL:$1|byte|bytes}} na codificação UTF-8.",
        "title-invalid-leading-colon": "O título da página solicitada contém um erro de pontuação (:) no início.",
-       "perfcached": "Os seguintes dados encontram-se armazenados na ''cache'' e podem não estar atualizados. No máximo {{PLURAL:$1|um resultado é disponível|$1 resultados são disponíveis}} na ''cache''.",
-       "perfcachedts": "Os seguintes dados encontram-se armazenados na ''cache'' e foram atualizados pela última vez a $1. No máximo {{PLURAL:$4|um resultado está disponível|$4 resultados estão disponíveis}} na ''cache''.",
+       "perfcached": "Os seguintes dados encontram-se armazenados na ''cache'' e podem não estar atualizados. {{PLURAL:$1|Está disponível na ''cache'' um máximo de um resultado|Estão disponíveis na ''cache'' um máximo de $1 resultados}}.",
+       "perfcachedts": "Os seguintes dados encontram-se armazenados na ''cache'' e foram atualizados pela última vez a $1. {{PLURAL:$4|Está disponível na ''cache'' um máximo de um resultado|Estão disponíveis na ''cache'' um máximo de $4 resultados}}.",
        "querypage-no-updates": "As atualizações estão presentemente desativadas para esta página.\nPor enquanto, os dados aqui presentes não poderão ser atualizados.",
        "viewsource": "Ver código-fonte",
        "viewsource-title": "Mostrar código-fonte de $1",
        "nocookiesnew": "A conta de utilizador foi criada, mas neste momento não tem sessão iniciada.\nA {{SITENAME}} utiliza ''cookies'' para autenticar os utilizadores.\nOs ''cookies'' estão desativados no seu navegador.\nAtive-os e inicie sessão com o seu nome de utilizador e a sua palavra-passe, por favor.",
        "nocookieslogin": "A {{SITENAME}} utiliza ''cookies'' para autenticar os utilizadores.\nOs ''cookies'' estão desativados no seu navegador.\nAtive-os e tente novamente, por favor.",
        "nocookiesfornew": "A conta de utilizador não foi criada, porque não foi possível confirmar a sua origem.\nCertifique-se de que tem os ''cookies'' ativados, recarregue esta página e tente novamente.",
-       "createacct-loginerror": "A conta foi criada com êxito, mas não pôde ser autenticado automaticamente. Por favor, faça o [[Special:UserLogin|início de sessão manualmente]].",
+       "createacct-loginerror": "A conta foi criada, mas não foi possível iniciar a sessão automaticamente. Por favor, [[Special:UserLogin|inície a sessão manualmente]].",
        "noname": "Não especificou um nome de utilizador válido.",
        "loginsuccesstitle": "Autenticação bem sucedida",
        "loginsuccess": "'''Encontra-se agora ligado à {{SITENAME}} como \"$1\"'''.",
        "login-throttled": "Realizou demasiadas tentativas de início de sessão com esta conta.\nAguarde $1 antes de tentar novamente, por favor.",
        "login-abort-generic": "O início de sessão falhou - Cancelado",
        "login-migrated-generic": "A sua conta foi migrada e o seu nome de utilizador já não existe nesta wiki.",
-       "loginlanguagelabel": "Idioma: $1",
+       "loginlanguagelabel": "Língua: $1",
        "suspicious-userlogout": "O seu pedido para sair foi negado porque parece ter sido enviado por um navegador danificado ou por um proxy com cache.",
        "createacct-another-realname-tip": "O fornecimento do nome verdadeiro é opcional.\nSe optar por revelá-lo, ele será utilizado para atribuir-lhe crédito pelo seu trabalho.",
        "pt-login": "Entrar",
        "botpasswords-label-cancel": "Cancelar",
        "botpasswords-label-delete": "Eliminar",
        "botpasswords-label-resetpassword": "Redefinir palavra-passe",
-       "botpasswords-label-grants": "Atribuições aplicáveis:",
-       "botpasswords-help-grants": "Cada atribuição dá acesso às permissões listadas que uma conta de utilizador já possua. Consulte a [[Special:ListGrants|tabela de atribuições]] para mais informação.",
+       "botpasswords-label-grants": "Concessões de permissões aplicáveis:",
+       "botpasswords-help-grants": "As concessões de permissões permitem acesso a permissões já detidas pela sua conta de utilizador. Fazer uma concessão aqui não fornece acesso a quaisquer permissões que a usa conta de utilizador não possua. Consulte a [[Special:ListGrants|tabela de concessões]] para mais informação.",
        "botpasswords-label-grants-column": "Concedido",
        "botpasswords-bad-appid": "O nome do robô \"$1\" não é válido.",
        "botpasswords-insert-failed": "Falhou ao adicionar o nome do robô \"$1\". Já foi adicionado?",
        "deprecated-self-close-category-desc": "Esta página contém marcações HTML auto-fechadas, que são inválidas, tais como <code>&lt;b/></code> ou <code>&lt;span/></code>.  O comportamento destas tags será alterado em breve, para ser consistente com a especificação HTML5, pelo que o seu uso na notação wiki foi descontinuado.",
        "duplicate-args-warning": "<strong>Aviso:</strong> [[:$1]] chama [[:$2]] com mais de um valor para o parâmetro \"$3\". Somente o último valor fornecido será utilizado.",
        "duplicate-args-category": "Páginas com argumentos de predefinições duplicados",
-       "duplicate-args-category-desc": "A página contém campos de predefinições que utilizam duplicatas de argumentos, tais como <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> ou <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
+       "duplicate-args-category-desc": "A página contém chamadas de predefinições que passam à predefinição argumentos duplicados, tais como <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> ou <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "'''Aviso:''' Esta página contém demasiadas chamadas de funções exigentes do analisador sintático.\n\nDevia ter menos de $2 {{PLURAL:$2|chamada|chamadas}}. Neste momento tem $1 {{PLURAL:$1|chamada|chamadas}}.",
        "expensive-parserfunction-category": "Páginas com demasiadas chamadas a funções exigentes",
        "post-expand-template-inclusion-warning": "Aviso: O tamanho de inclusão de predefinições é demasiado grande, algumas predefinições não serão incluídas.",
        "logdelete-selected": "{{PLURAL:$1|Evento do registo selecionado|Eventos do registo selecionados}}:",
        "revdelete-text-text": "Revisões eliminadas ainda aparecerão no histórico da página, mas parte do seu conteúdo estará inacessível para o público.",
        "revdelete-text-file": "Versões eliminadas do ficheiro ainda aparecerão no histórico da página, mas parte do seu conteúdo estará inacessível para o público.",
-       "logdelete-text": "Os eventos eliminados ainda aparecerão no histórico da página, mas pare de seu conteúdo será inacessível ao público.",
+       "logdelete-text": "Os eventos eliminados ainda aparecerão no histórico da página, mas parte do seu conteúdo será inacessível ao público.",
        "revdelete-text-others": "Outros administradores serão ainda capazes de aceder ao conteúdo oculto e torná-lo visível novamente, a menos que sejam definidas restrições adicionais.",
        "revdelete-confirm": "Por favor, confirme que pretende executar esta operação, que compreende as suas consequências e que o faz em concordância com as [[{{MediaWiki:Policy-url}}|políticas e recomendações]].",
        "revdelete-suppress-text": "A supressão '''só''' deverá ser usada nos seguintes casos:\n* Informação potencialmente caluniosa, difamatória ou injuriosa\n* Informação pessoal imprópria\n*: ''endereços de domicílio e números de telefone, números de identificação nacional, etc''",
        "right-ipblock-exempt": "Contornar bloqueios de IP, bloqueios automáticos e bloqueios de gamas de IP",
        "right-unblockself": "Desbloquearem-se a si próprios",
        "right-protect": "Mudar níveis de proteção e editar páginas protegidas em cascata",
-       "right-editprotected": "Editar páginas protegidas como \"{{int:protect-level-sysop}}\"",
-       "right-editsemiprotected": "Editar páginas protegidas como \"{{int:protect-level-autoconfirmed}}\"",
+       "right-editprotected": "Editar páginas protegidas com \"{{int:protect-level-sysop}}\"",
+       "right-editsemiprotected": "Editar páginas protegidas com \"{{int:protect-level-autoconfirmed}}\"",
        "right-editcontentmodel": "Editar o modelo de conteúdo de uma página",
        "right-editinterface": "Editar a interface de utilizador",
        "right-editusercssjs": "Editar os ficheiros CSS e JS de outros utilizadores",
        "grant-basic": "Direitos básicos",
        "grant-viewdeleted": "Ver páginas e ficheiros eliminados",
        "grant-viewmywatchlist": "Ver a sua lista de páginas vigiadas",
+       "grant-viewrestrictedlogs": "Ver entradas de registo restritas",
        "newuserlogpage": "Registo de criação de utilizadores",
        "newuserlogpagetext": "Este é um registo de novas contas de utilizador",
        "rightslog": "Registo de privilégios de utilizadores",
        "upload-misc-error-text": "Ocorreu um erro desconhecido durante o envio.\nVerifique se o endereço (URL) é válido e acessível e tente novamente.\nCaso o problema persista, contacte um [[Special:ListUsers/sysop|administrador]].",
        "upload-too-many-redirects": "O URL continha demasiados redirecionamentos",
        "upload-http-error": "Ocorreu um erro HTTP: $1",
-       "upload-copy-upload-invalid-domain": "Não é possível realizar carregamentos remotos neste domínio.",
+       "upload-copy-upload-invalid-domain": "Não é possível carregar cópias de ficheiros vindos deste domínio.",
        "upload-foreign-cant-upload": "Esta wiki não está configurada para carregar ficheiros para o repositório externo solicitado.",
        "upload-foreign-cant-load-config": "Não foi possível inserir a configuração de carregamento de ficheiros no repositório externo.",
        "upload-dialog-disabled": "O carregamento de ficheiros através deste diálogo está desativado na wiki.",
        "upload-form-label-infoform-name": "Nome",
        "upload-form-label-infoform-name-tooltip": "Um título descritivo e único para ser usado como nome do ficheiro. Pode usar linguagem normal e espaços. Não inclua a extensão do ficheiro.",
        "upload-form-label-infoform-description": "Descrição",
-       "upload-form-label-infoform-description-tooltip": "Descreva de forma breve todos os elementos notórios sobre o trabalho.\nPara uma fotografia, mencione os principais destaques, a ocasião ou o lugar.",
+       "upload-form-label-infoform-description-tooltip": "Descreva de forma breve todos os elementos de nota sobre o trabalho.\nPara uma fotografia, mencione os principais motivos fotografados, a ocasião, ou o lugar.",
        "upload-form-label-usage-title": "Uso",
        "upload-form-label-usage-filename": "Nome do ficheiro",
        "upload-form-label-own-work": "Este é minha obra própria",
        "filedelete-edit-reasonlist": "Editar motivos de eliminação",
        "filedelete-maintenance": "Eliminação e restauro de ficheiros foram temporariamente impossibilitadas durante a manutenção.",
        "filedelete-maintenance-title": "Não é possível eliminar o ficheiro",
-       "mimesearch": "Pesquisa MIME",
-       "mimesearch-summary": "Esta página permite a filtragem de ficheiros pelo seu tipo MIME. Entrada: contenttype/subtype ou contenttype/*, ex. <code>image/jpeg</code>.",
+       "mimesearch": "Pesquisa de ficheiros pelo tipo MIME",
+       "mimesearch-summary": "Esta página permite a filtragem de ficheiros pelo seu tipo MIME.\nSintaxe: \"tipo de conteúdo/subtipo\" ou \"tipo de conteúdo/*\". Exemplos, <code>image/jpeg</code>, <code>image/png</code>, <code>application/*</code>.",
        "mimetype": "Tipo MIME:",
        "download": "descarregar",
        "unwatchedpages": "Páginas não vigiadas",
-       "listredirects": "Lista de redirecionamentos",
-       "listduplicatedfiles": "Lista de ficheiros com duplicatas",
-       "listduplicatedfiles-summary": "Esta é uma lista de ficheiros cuja suas versões mais recentes são duplicatas da versão mais recente de outros ficheiros. Somente os ficheiros locais são considerados.",
-       "listduplicatedfiles-entry": "[[:File:$1|$1]] possui [[$3|{{PLURAL:$2|uma duplicata|$2 duplicatas}}]].",
+       "listredirects": "Redirecionamentos",
+       "listduplicatedfiles": "Ficheiros com duplicados",
+       "listduplicatedfiles-summary": "Esta é uma lista de ficheiros cuja versões mais recentes são duplicados da versão mais recente de outros ficheiros. Só os ficheiros locais são considerados.",
+       "listduplicatedfiles-entry": "[[:File:$1|$1]] tem [[$3|{{PLURAL:$2|um duplicado|$2 duplicados}}]].",
        "unusedtemplates": "Predefinições não utilizadas",
        "unusedtemplatestext": "Esta página lista todas as páginas no domínio {{ns:template}} que não são incluídas em nenhuma outra página. Lembre-se de verificar a existência de outras ligações para as predefinições, antes de eliminá-las.",
        "unusedtemplateswlh": "outras ligações",
        "randomincategory-nopages": "Não há páginas na categoria [[:Category:$1|$1]].",
        "randomincategory-category": "Categoria:",
        "randomincategory-legend": "Página aleatória na categoria",
-       "randomincategory-submit": "Ir",
+       "randomincategory-submit": "Continuar",
        "randomredirect": "Redirecionamento aleatório",
        "randomredirect-nopages": "Não há redirecionamentos no domínio \"$1\".",
        "statistics": "Estatísticas",
        "statistics-users": "[[Special:ListUsers|Utilizadores]] registados",
        "statistics-users-active": "Utilizadores ativos",
        "statistics-users-active-desc": "Utilizadores que efectuaram uma operação {{PLURAL:$1|no último dia|nos últimos $1 dias}}",
-       "pageswithprop": "Páginas com uma propriedade",
-       "pageswithprop-legend": "Páginas com uma propriedade",
+       "pageswithprop": "Páginas que usam uma propriedade",
+       "pageswithprop-legend": "Páginas que usam uma propriedade",
        "pageswithprop-text": "Esta página lista páginas que usam uma propriedade em particular.",
        "pageswithprop-prop": "Nome da propriedade:",
        "pageswithprop-submit": "Avançar",
        "fewestrevisions": "Páginas com menos revisões",
        "nbytes": "$1 {{PLURAL:$1|byte|bytes}}",
        "ncategories": "$1 {{PLURAL:$1|categoria|categorias}}",
-       "ninterwikis": "$1 {{PLURAL:$1|interlíngua|interlínguas}}",
+       "ninterwikis": "$1 {{PLURAL:$1|interwiki|interwikis}}",
        "nlinks": "$1 {{PLURAL:$1|ligação|ligações}}",
        "nmembers": "$1 {{PLURAL:$1|membro|membros}}",
        "nmemberschanged": "$1 → $2 {{PLURAL:$2|membro|membros}}",
        "mostlinkedtemplates": "Páginas mais transcluídas",
        "mostcategories": "Páginas com mais categorias",
        "mostimages": "Ficheiros com mais afluentes",
-       "mostinterwikis": "Páginas com mais interlínguas",
+       "mostinterwikis": "Páginas com mais ligações interwikis",
        "mostrevisions": "Páginas com mais revisões",
        "prefixindex": "Todas as páginas iniciadas por",
        "prefixindex-namespace": "Todas as páginas com prefixo (domínio $1)",
        "protectedpages-performer": "Protetor",
        "protectedpages-params": "Parâmetros de proteção",
        "protectedpages-reason": "Motivo",
-       "protectedpages-submit": "Exibir páginas",
+       "protectedpages-submit": "Mostrar páginas",
        "protectedpages-unknown-timestamp": "Desconhecido",
        "protectedpages-unknown-performer": "Utilizador desconhecido",
        "protectedtitles": "Títulos protegidos",
        "protectedtitles-summary": "Esta página lista títulos cuja criação está impossibilitada. Para ver uma lista de páginas protegidas, consulte [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
        "protectedtitlesempty": "Neste momento, nenhum dos títulos está protegido com estes parâmetros.",
-       "protectedtitles-submit": "Exibir de títulos",
+       "protectedtitles-submit": "Mostrar títulos",
        "listusers": "Utilizadores",
        "listusers-editsonly": "Mostrar apenas utilizadores com edições",
        "listusers-creationsort": "Ordenar por data de criação",
        "pager-older-n": "{{PLURAL:$1|1 anterior|$1 anteriores}}",
        "suppress": "Suprimir",
        "querypage-disabled": "Esta página especial está desativada para não prejudicar o desempenho.",
-       "apihelp": "Ajuda API",
+       "apihelp": "Ajuda da API",
        "apihelp-no-such-module": "Módulo \"$1\" não encontrado.",
        "apisandbox": "Testes da API",
        "apisandbox-jsonly": "Para usar a área de testes da API é necessário o JavaScript.",
        "apisandbox-api-disabled": "A API está desativada neste site.",
-       "apisandbox-intro": "Use esta página para fazer experiências com a <strong>API de serviços da web do MediaWiki</strong>.\nConsulte a [[mw:API:Main page|documentação da API]] para informações sobre o uso da API. Exemplo: [https://www.mediawiki.org/wiki/API#A_simple_example obter o conteúdo da Página Principal]. Selecione uma operação para ver mais exemplos.\n\nNote que, embora esta seja uma área de testes, as operações que executar nesta página podem modificar a wiki.",
+       "apisandbox-intro": "Use esta página para fazer experiências com a <strong>API operacional do MediaWiki</strong>.\nConsulte a [[mw:API:Main page|documentação da API]] para informações sobre o seu uso. Exemplo: [https://www.mediawiki.org/wiki/API#A_simple_example obter o conteúdo da Página Principal]. Selecione uma operação para ver mais exemplos.\n\nNote que, embora esta seja uma área de testes, as operações que executar nesta página podem modificar a wiki.",
        "apisandbox-fullscreen": "Expandir painel",
        "apisandbox-fullscreen-tooltip": "Expandir o painel da página de testes para preencher a janela do navegador.",
        "apisandbox-unfullscreen": "Mostrar página",
        "booksources-search": "Pesquisar",
        "booksources-text": "É apresentada abaixo uma lista de ligações para outros sítios na Internet que vendem livros novos e usados e talvez possuam informações adicionais sobre os livros que procura:",
        "booksources-invalid-isbn": "O número ISBN fornecido não parece ser válido; verifique a existência de erros ao copiar da fonte original.",
+       "magiclink-tracking-rfc": "Páginas que usam links mágicos RFC",
+       "magiclink-tracking-rfc-desc": "Esta página usa links mágicos RFC. Consulte a [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] para saber como migrar.",
+       "magiclink-tracking-pmid": "Páginas que usam links mágicos PMID",
+       "magiclink-tracking-pmid-desc": "Esta página usa links mágicos PMID. Consulte a [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] para saber como migrar.",
+       "magiclink-tracking-isbn": "Páginas que usam links mágicos ISBN",
+       "magiclink-tracking-isbn-desc": "Esta página usa links mágicos ISBN. Consulte a [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] para saber como migrar.",
        "specialloguserlabel": "Executante:",
        "speciallogtitlelabel": "Alvo (título ou página ou {{ns:user}}:nome de utilizador):",
        "log": "Registos",
        "listusers-submit": "Mostrar",
        "listusers-noresult": "Não foram encontrados utilizadores.",
        "listusers-blocked": "({{GENDER:$1|bloqueado|bloqueada|bloqueado(a)}})",
-       "activeusers": "Lista de utilizadores ativos",
+       "activeusers": "Utilizadores ativos",
        "activeusers-intro": "Esta é uma lista dos utilizadores com qualquer tipo de atividade {{PLURAL:$1|no último dia|nos últimos $1 dias}}.",
        "activeusers-count": "$1 {{PLURAL:$1|ação|ações}} {{PLURAL:$3|no último dia|nos últimos $3 dias}}",
        "activeusers-from": "Mostrar utilizadores começados por:",
-       "activeusers-hidebots": "Ocultar robôs",
-       "activeusers-hidesysops": "Ocultar administradores",
+       "activeusers-groups": "Apresentar os utilizadores que pertencem aos grupos:",
        "activeusers-noresult": "Nenhum utilizador encontrado.",
-       "activeusers-submit": "Exibir utilizadores ativos",
+       "activeusers-submit": "Mostrar utilizadores ativos",
        "listgrouprights": "Privilégios dos grupos de utilizadores",
        "listgrouprights-summary": "A seguinte lista contém os grupos de utilizadores definidos nesta wiki, com os respectivos privilégios de acesso.\nEncontram-se disponíveis [[{{MediaWiki:Listgrouprights-helppage}}|informações adicionais]] sobre privilégios individuais.",
        "listgrouprights-key": "Legenda:\n* <span class=\"listgrouprights-granted\">Privilégio concedido</span>\n* <span class=\"listgrouprights-revoked\">Privilégio revogado</span>",
        "listgrouprights-removegroup-self": "Remover a própria conta {{PLURAL:$2|do grupo|dos grupos}}: $1",
        "listgrouprights-addgroup-self-all": "Adicionar a própria conta a todos os grupos",
        "listgrouprights-removegroup-self-all": "Remover a própria conta de todos os grupos",
-       "listgrouprights-namespaceprotection-header": "Restrições do domínio",
+       "listgrouprights-namespaceprotection-header": "Restrições de domínios",
        "listgrouprights-namespaceprotection-namespace": "Domínio",
        "listgrouprights-namespaceprotection-restrictedto": "Direito(s) do utilizador para editar",
-       "listgrants": "Atribuições",
-       "listgrants-summary": "Esta é uma lista de atribuições com os respetivos acessos às permissões de utilizador. Os utilizadores podem autorizar aplicações a utilizar as suas contas, mas com permissões limitadas baseadas nas atribuições dadas pelos utilizadores a cada aplicação. No entanto, uma aplicação que age em nome de um utilizador não pode utilizar permissões que o utilizador não possui.\nPode haver [[{{MediaWiki:Listgrouprights-helppage}}|informação adicional]] sobre as permissões individuais.",
-       "listgrants-grant": "Atribuição",
-       "listgrants-rights": "Direitos",
+       "listgrants": "Concessões de permissões a aplicações ligadas",
+       "listgrants-summary": "Esta é uma lista das possíveis concessões de permissões e das respetivas permissões dos utilizadores que são atribuídas por cada concessão. Os utilizadores podem autorizar aplicações a utilizar a sua conta, agindo assim em seu nome mas com as permissões limitadas com base nestas concessões. Uma aplicação que age em nome de um utilizador não pode utilizar permissões que o utilizador não possui.\nPoderá existir [[{{MediaWiki:Listgrouprights-helppage}}|informação adicional]] sobre as permissões individuais.",
+       "listgrants-grant": "Concessão de permissões",
+       "listgrants-rights": "Permissões",
        "trackingcategories": "Categorias de monitorização",
        "trackingcategories-summary": "Esta página lista as categorias de monitorização geradas automaticamente pelo software MediaWiki. Os nomes das categorias podem ser alterados modificando as mensagens de sistema relevantes no domínio {{ns:8}}.",
        "trackingcategories-msg": "Categoria monitorada",
        "trackingcategories-name": "Nome da mensagem",
        "trackingcategories-desc": "Critérios de inclusão",
-       "restricted-displaytitle-ignored": "Páginas com títulos de exibição ignorados",
+       "restricted-displaytitle-ignored": "Páginas com títulos de apresentação ignorados",
        "restricted-displaytitle-ignored-desc": "Esta página tem um <code><nowiki>{{DISPLAYTITLE}}</nowiki></code> ignorado porque não é equivalente ao título verdadeiro da página.",
        "noindex-category-desc": "A página não é indexada por robôs porque contém a palavra mágica <code><nowiki>__NOINDEX__</nowiki></code> e está num domínio onde esta palavra mágica é permitida.",
        "index-category-desc": "A página contém a palavra mágica <code><nowiki>__INDEX__</nowiki></code> (e está num domínio em que essa marca é permitida) e, portanto, será indexada pelos robôs mesmo quando normalmente não o seria.",
        "rollback-success-notify": "Revertidas as edições de $1;\nMudança para a última revisão de $2. [$3 Mostrar alterações]",
        "sessionfailure-title": "Erro de sessão",
        "sessionfailure": "Foram detectados problemas com a sua sessão;\na operação foi cancelada como medida de proteção contra a interceptação de sessões.\nVolte à página anterior, recarregue-a e tente novamente.",
-       "changecontentmodel": "Editar o modelo de conteúdo de uma página",
+       "changecontentmodel": "Alterar modelo de conteúdo de uma página",
        "changecontentmodel-legend": "Editar modelo de contéudo",
        "changecontentmodel-title-label": "Título da página",
        "changecontentmodel-model-label": "Novo modelo de conteúdo",
        "modifiedarticleprotection": "alterou o nível de proteção para \"[[$1]]\"",
        "unprotectedarticle": "desprotegeu \"[[$1]]\"",
        "movedarticleprotection": "moveu as configurações de proteção de \"[[$2]]\" para \"[[$1]]\"",
+       "protectedarticle-comment": "{{GENDER:$2|Protegeu}} \"[[$1]]\"",
+       "modifiedarticleprotection-comment": "{{GENDER:$2|Alterou o nível de proteção}} de \"[[$1]]\"",
+       "unprotectedarticle-comment": "{{GENDER:$2|Removeu a proteção}} de \"[[$1]]\"",
        "protect-title": "Alterar o nível de proteção de \"$1\"",
        "protect-title-notallowed": "Ver o nível de proteção de \"$1\"",
        "prot_1movedto2": "moveu [[$1]] para [[$2]]",
        "namespace_association": "Domínio associado",
        "tooltip-namespace_association": "Marque esta caixa para incluir também o domínio de conteúdo ou de discussão associado à sua seleção",
        "blanknamespace": "(Principal)",
-       "contributions": "Contribuições {{GENDER:$1|do utilizador|da utilizadora|do(a) utilizador(a)}}",
-       "contributions-title": "Contribuições {{GENDER:$1|do utilizador|da utilizadora|do(a) utilizador(a)}} $1",
+       "contributions": "Contribuições {{GENDER:$1|do utilizador|da utilizadora}}",
+       "contributions-title": "Contribuições {{GENDER:$1|do utilizador|da utilizadora}} $1",
        "mycontris": "Contribuições",
        "anoncontribs": "Contribuições",
        "contribsub2": "Para {{GENDER:$3|$1}} ($2)",
        "whatlinkshere-hidelinks": "$1 ligações",
        "whatlinkshere-hideimages": "$1 ligações para ficheiros",
        "whatlinkshere-filters": "Filtros",
-       "whatlinkshere-submit": "Ir",
+       "whatlinkshere-submit": "Continuar",
        "autoblockid": "Bloqueio automático nº$1",
        "block": "Bloquear utilizador(a)",
        "unblock": "Desbloquear utilizador",
        "movepage-page-moved": "A página $1 foi movida para $2.",
        "movepage-page-unmoved": "Não foi possível mover a página $1 para $2.",
        "movepage-max-pages": "O limite de $1 {{PLURAL:$1|página movida|páginas movidas}} foi atingido; não será possível mover mais páginas de forma automática.",
-       "movelogpage": "Registo de movimento",
+       "movelogpage": "Registo de movimentação de páginas",
        "movelogpagetext": "Abaixo encontra-se uma lista de páginas movidas.",
        "movesubpage": "{{PLURAL:$1|Subpágina|Subpáginas}}",
        "movesubpagetext": "Esta página tem $1 {{PLURAL:$1|subpágina mostrada|subpáginas mostradas}} abaixo.",
        "tooltip-ca-talk": "Discussão sobre o conteúdo da página",
        "tooltip-ca-edit": "Editar esta página",
        "tooltip-ca-addsection": "Iniciar uma nova secção",
-       "tooltip-ca-viewsource": "Esta página está protegida.\nApenas pode visualizar o seu conteúdo",
+       "tooltip-ca-viewsource": "Esta página está protegida.\nSó pode ver o conteúdo.",
        "tooltip-ca-history": "Edições anteriores desta página.",
        "tooltip-ca-protect": "Proteger esta página",
        "tooltip-ca-unprotect": "Alterar a proteção desta página",
        "pageinfo-header-edits": "Histórico de edições",
        "pageinfo-header-restrictions": "Proteção da página",
        "pageinfo-header-properties": "Propriedades da página",
-       "pageinfo-display-title": "Título exibido",
+       "pageinfo-display-title": "Título apresentado",
        "pageinfo-default-sort": "Chave de classificação padrão",
        "pageinfo-length": "Tamanho da página (em bytes)",
        "pageinfo-article-id": "ID da página",
        "exif-orientation-8": "Rodado 90° no sentido horário",
        "exif-planarconfiguration-1": "formato irregular",
        "exif-planarconfiguration-2": "formato plano",
+       "exif-xyresolution-c": "$1 pt/cm",
        "exif-colorspace-65535": "Cor não calibrada",
        "exif-componentsconfiguration-0": "não existe",
        "exif-exposureprogram-0": "Não definido",
        "imgmultigoto": "Ir para a página $1",
        "img-lang-default": "(língua padrão)",
        "img-lang-info": "Compor esta imagem em $1. $2",
-       "img-lang-go": "Ir",
+       "img-lang-go": "Compor",
        "ascending_abbrev": "asc",
        "descending_abbrev": "desc",
        "table_pager_next": "Página seguinte",
        "table_pager_last": "Última página",
        "table_pager_limit": "Mostrar $1 por página",
        "table_pager_limit_label": "Entradas por página:",
-       "table_pager_limit_submit": "Ir",
+       "table_pager_limit_submit": "Continuar",
        "table_pager_empty": "Sem resultados",
        "autosumm-blank": "Limpou toda a página",
        "autosumm-replace": "Página substituída por \"$1\"",
        "watchlistedit-clear-submit": "Limpar páginas vigiadas (isto é permanente!)",
        "watchlistedit-clear-done": "A sua lista de páginas vigiadas foi limpa.",
        "watchlistedit-clear-removed": "{{PLURAL:$1|1 página foi removida|$1 páginas foram removidas}}:",
-       "watchlistedit-too-many": "Existem demasiadas páginas para exibir.",
+       "watchlistedit-too-many": "Existem demasiadas páginas para apresentar.",
        "watchlisttools-clear": "Limpar lista de páginas vigiadas",
        "watchlisttools-view": "Ver alterações relevantes",
        "watchlisttools-edit": "Ver e editar a lista de páginas vigiadas",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|discussão]])",
        "timezone-local": "Local",
        "duplicate-defaultsort": "<strong>Aviso:</strong> A chave de ordenação padrão \"$2\" sobrepõe-se à anterior \"$1\".",
-       "duplicate-displaytitle": "<strong>Aviso:</strong> O título em exibição \"$2\" anula o título anteriormente em exibição \"$1\".",
+       "duplicate-displaytitle": "<strong>Aviso:</strong> O título de apresentação \"$2\" anula o título anterior \"$1\".",
        "restricted-displaytitle": "<strong>Aviso</strong>: A apresentação do título \"$1\" foi ignorada porque não é equivalente ao título atual da página.",
        "invalid-indicator-name": "<strong>Erro:</strong> O atributo <code>name</code>, da página de estados, não deve estar em branco.",
        "version": "Versão",
        "version-entrypoints": "URL de ponto de entrada",
        "version-entrypoints-header-entrypoint": "Ponto de entrada",
        "version-entrypoints-header-url": "URL",
+       "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath Caminho dos artigos]",
+       "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgScriptPath Caminho dos <i>scripts</i>]",
        "version-libraries": "Bibliotecas instaladas",
        "version-libraries-library": "Biblioteca",
        "version-libraries-version": "Versão",
        "version-libraries-license": "Licença",
        "version-libraries-description": "Descrição",
        "version-libraries-authors": "Autores",
-       "redirect": "Redirecionar por ficheiro, utilizador, página, revisão, ou ID de registo",
-       "redirect-summary": "Esta página especial redireciona para um ficheiro (dado o nome do ficheiro), para uma página (dado um ID de revisão ou página), para uma página de utilizador (dado um ID numérico do utilizador) ou para uma entrada do registo (dado o ID do registo). Utilização: [[{{#Special:Redirect}}/file/Example.jpg]], \n[[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], [[{{#Special:Redirect}}/user/101]], ou [[{{#Special:Redirect}}/logid/186]].",
-       "redirect-submit": "Ir",
+       "redirect": "Redirecionar por nome de ficheiro, ou ID de utilizador, página, revisão ou registo",
+       "redirect-summary": "Esta página especial redireciona para um ficheiro (dado o nome do ficheiro), para uma página (dado o identificador numérico da página ou da revisão), para uma página de utilizador (dado o identificador numérico do utilizador) ou para uma entrada do registo (dado o identificador numérico da entrada no registo). Exemplos de utilização: [[{{#Special:Redirect}}/file/Flag_Bandeiras_lusófonas.JPG]], \n[[{{#Special:Redirect}}/page/12071]], [[{{#Special:Redirect}}/revision/700]], [[{{#Special:Redirect}}/user/1]], ou [[{{#Special:Redirect}}/logid/18868382]].",
+       "redirect-submit": "Continuar",
        "redirect-lookup": "Pesquisa:",
        "redirect-value": "Valor:",
        "redirect-user": "Identificador do utilizador",
-       "redirect-page": "Identificador (ID) da página",
-       "redirect-revision": "Revisão da página",
+       "redirect-page": "Identificador da página",
+       "redirect-revision": "Identificador de revisão da página",
        "redirect-file": "Nome do ficheiro",
-       "redirect-logid": "ID do registo",
+       "redirect-logid": "Identificador da entrada do registo",
        "redirect-not-exists": "Valor não encontrado",
-       "fileduplicatesearch": "Ficheiros duplicados",
-       "fileduplicatesearch-summary": "Procure ficheiros duplicados tendo por base o seu resumo criptográfico.",
-       "fileduplicatesearch-filename": "Ficheiro:",
+       "fileduplicatesearch": "Pesquisa de ficheiros duplicados",
+       "fileduplicatesearch-summary": "Pesquisa de ficheiros duplicados baseada no resumo criptográfico.",
+       "fileduplicatesearch-filename": "Nome do ficheiro:",
        "fileduplicatesearch-submit": "Pesquisar",
        "fileduplicatesearch-info": "$1 × $2 píxeis<br />Tamanho: $3<br />tipo MIME: $4",
-       "fileduplicatesearch-result-1": "O ficheiro \"$1\" não possui cópias idênticas.",
+       "fileduplicatesearch-result-1": "O ficheiro \"$1\" não tem cópias idênticas.",
        "fileduplicatesearch-result-n": "O ficheiro \"$1\" possui {{PLURAL:$2|uma cópia idêntica|$2 cópias idênticas}}.",
        "fileduplicatesearch-noresults": "Não foi encontrado nenhum ficheiro com o nome \"$1\".",
        "specialpages": "Páginas especiais",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Etiqueta|Etiquetas}}]]: $2)",
        "tag-mw-contentmodelchange": "alteração do modelo de conteúdo",
        "tag-mw-contentmodelchange-description": "Edições que [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:ChangeContentModel alteram o modelo de conteúdo] de uma página",
-       "tags-title": "Etiquetas",
+       "tags-title": "Etiquetas de modificação válidas",
        "tags-intro": "Esta página lista as etiquetas com que o software poderá marcar uma edição, e o seu significado.",
        "tags-tag": "Nome da etiqueta",
        "tags-display-header": "Aparência nas listas de modificações",
        "logentry-delete-revision-legacy": "$1 {{GENDER:$2|alterou}} a visibilidade de revisões na página $3",
        "logentry-suppress-delete": "$1 {{GENDER:$2|suprimiu}} a página $3",
        "logentry-suppress-event": "$1 {{GENDER:$2|alterou}} secretamente a visibilidade de {{PLURAL:$5|uma entrada|$5 entradas}} em $3: $4",
-       "logentry-suppress-revision": "$1 secretamente alterou a visibilidade de {{PLURAL:$5|uma revisão|$5 revisões}} em $3: $4",
+       "logentry-suppress-revision": "$1 alterou secretamente a visibilidade de {{PLURAL:$5|uma revisão|$5 revisões}} em $3: $4",
        "logentry-suppress-event-legacy": "$1 {{GENDER:$2|alterou}} secretamente a visibilidade de entradas de registo em $3",
        "logentry-suppress-revision-legacy": "$1 {{GENDER:$2|alterou}} secretamente a visibilidade de revisões da página $3",
        "revdelete-content-hid": "conteúdo oculto",
        "api-error-stashedfilenotfound": "O ficheiro escondido não foi encontrado ao tentar carregá-lo.",
        "api-error-stashpathinvalid": "O caminho no qual o ficheiro escondido deveria ter sido encontrado era inválido.",
        "api-error-stashfilestorage": "Ocorreu um erro no carregamento do ficheiro escondido.",
-       "api-error-stashzerolength": "O servidor não pôde esconder o ficheiro, porque ele tinha de comprimento zero.",
+       "api-error-stashzerolength": "Não foi possível o servidor esconder o ficheiro, porque este tinha comprimento zero.",
        "api-error-stashnotloggedin": "Tem de ter uma sessão iniciada para gravar ficheiros na área de ficheiros escondidos.",
        "api-error-stashwrongowner": "O ficheiro a que estava a tentar aceder na área de ficheiros escondidos não lhe pertence.",
        "api-error-stashnosuchfilekey": "O chave do ficheiro a que estava a tentar aceder na área de ficheiros escondidos não existe.",
        "expand_templates_input_missing": "Necessita de fornecer pelo menos algum texto de entrada.",
        "pagelanguage": "Alterar idioma da página",
        "pagelang-name": "Página",
-       "pagelang-language": "Idioma",
+       "pagelang-language": "Língua",
        "pagelang-use-default": "Usar idioma pré-definido",
        "pagelang-select-lang": "Escolher o idioma",
        "pagelang-submit": "Submeter",
        "mediastatistics": "Estatísticas multimédia",
        "mediastatistics-summary": "Estatísticas sobre os tipos de ficheiros carregados. Inclui apenas a versão mais recente do ficheiro. Versões antigas ou eliminadas são excluídas.",
        "mediastatistics-nbytes": "{{PLURAL:$1|$1 byte|$1 bytes}} ($2; $3%)",
-       "mediastatistics-bytespertype": "Tamanho total de ficheiro para este secção: {{PLURAL:$1|$1 byte|$1 bytes}} ($2; $3%).",
-       "mediastatistics-allbytes": "Tamanho total de ficheiro para todos os ficheiros: {{PLURAL:$1|$1 byte|$1 bytes}} ($2).",
+       "mediastatistics-bytespertype": "Tamanho total dos ficheiros para esta secção: {{PLURAL:$1|$1 byte|$1 bytes}} ($2; $3%).",
+       "mediastatistics-allbytes": "Tamanho total de todos os ficheiros: {{PLURAL:$1|$1 byte|$1 bytes}} ($2).",
        "mediastatistics-table-mimetype": "Tipo MIME",
        "mediastatistics-table-extensions": "Extensões possíveis",
        "mediastatistics-table-count": "Número de ficheiros",
        "mediastatistics-table-totalbytes": "Tamanho combinado",
        "mediastatistics-header-unknown": "Desconhecido",
-       "mediastatistics-header-bitmap": "Imagens de mapa de bits",
+       "mediastatistics-header-bitmap": "Imagens em mapa de bits",
        "mediastatistics-header-drawing": "Desenhos (imagens vetoriais)",
        "mediastatistics-header-audio": "Áudio",
        "mediastatistics-header-video": "Vídeo",
        "sessionprovider-generic": "Sessões $1",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "sessões baseadas em cookie",
        "sessionprovider-nocookies": "Os cookies podem estar desativados. Certifique-se de que os cookies estão ativados e inicie novamente.",
-       "randomrootpage": "Página raiz aleatória",
+       "randomrootpage": "Página aleatória de raiz",
        "log-action-filter-block": "Tipo de bloqueio:",
        "log-action-filter-contentmodel": "Tipo de alteração de modelo de conteúdo:",
        "log-action-filter-delete": "Tipo de eliminação:",
        "authmanager-autocreate-noperm": "A criação automática de contas não é permitida.",
        "authmanager-autocreate-exception": "A criação automática de contas foi temporariamente desativada devido a erros prévios.",
        "authmanager-userdoesnotexist": "A conta de utilizador(a) \"$1\" não está registada.",
-       "authmanager-userlogin-remembermypassword-help": "Se a palavra-passe deve ser memorizada por um período superior à duração da sessão.",
+       "authmanager-userlogin-remembermypassword-help": "Se a palavra-passe deve ser recordada por um período superior à duração da sessão.",
        "authmanager-username-help": "Nome de utilizador(a) para autenticação.",
        "authmanager-password-help": "Palavra-passe para autenticação.",
        "authmanager-domain-help": "Domínio para a autenticação externa.",
        "authform-notoken": "Chave em falta",
        "authform-wrongtoken": "Chave errada",
        "specialpage-securitylevel-not-allowed-title": "Não permitido",
-       "specialpage-securitylevel-not-allowed": "Desculpe, não tem permissão para utilizar esta página porque a sua identidade não pôde ser verificada.",
+       "specialpage-securitylevel-not-allowed": "Desculpe, não tem permissão para utilizar esta página porque não foi possível verificar a sua identidade.",
        "authpage-cannot-login": "Não é possível iniciar sessão.",
        "authpage-cannot-login-continue": "Não é possível continuar a iniciar sessão. A sua sessão pode ter expirado.",
        "authpage-cannot-create": "Não é possível iniciar a criação da conta.",
index cde2575..8e2b441 100644 (file)
        "botpasswords-label-delete": "Button label for the button to delete a bot password.\n{{Identical|Delete}}",
        "botpasswords-label-resetpassword": "Label for the checkbox to reset the actual password for the current bot password.",
        "botpasswords-label-grants": "Label for the checkmatrix for selecting grants allowed when the bot password is used.\n\ngrant: Vidu http://komputeko.net/index_en.php?vorto=grant sed \"konced/i\" egale funkcius.",
-       "botpasswords-help-grants": "Help text for the grant selection checkmatrix.",
+       "botpasswords-help-grants": "Help text for the grant selection checkmatrix.\n\nIdentical:\n* {{msg-mw|Mwoauth-consumer-grantshelp}}",
        "botpasswords-label-grants-column": "Label for the checkbox column on the checkmatrix for selecting grants allowed when the bot password is used.",
        "botpasswords-bad-appid": "Used as an error message when an invalid \"bot name\" is supplied on [[Special:BotPasswords]]. Parameters:\n* $1 - The rejected bot name.",
        "botpasswords-insert-failed": "Error message when saving a new bot password failed. It's likely that the failure was because the user resubmitted the form after a previous successful save. Parameters:\n* $1 - Bot name",
        "passwordreset-emailsentusername": "Used in [[Special:PasswordReset]].\n\nSee also:\n* {{msg-mw|Passwordreset-emailsent-capture}}\n* {{msg-mw|Passwordreset-emailerror-capture}}",
        "passwordreset-emailsent-capture2": "Used in [[Special:PasswordReset]].\n\nParameters:\n* $1 - number of accounts notified\n\nSee also:\n* {{msg-mw|Passwordreset-emailsentemail}}\n* {{msg-mw|Passwordreset-emailsentusername}}\n* {{msg-mw|Passwordreset-emailerror-capture}}",
        "passwordreset-emailerror-capture2": "Error message displayed in [[Special:PasswordReset]] when sending an email fails. Parameters:\n* $1 - error message\n* $2 - username, used for GENDER\n* $3 - number of accounts notified\n\nSee also:\n* {{msg-mw|Passwordreset-emailsentemail}}\n* {{msg-mw|Passwordreset-emailsentusername}}\n* {{msg-mw|Passwordreset-emailsent-capture}}\n* {{msg-mw|Passwordreset-emailerror-capture}}",
-       "passwordreset-nocaller": "Shown when a password reset was requested but the caller was not provided. This is an internal error.",
+       "passwordreset-nocaller": "Shown when a password reset was requested but the process failed due to an internal error related to missing details about the origin (caller) of the password reset request.",
        "passwordreset-nosuchcaller": "Shown when a password reset was requested but the username of the caller could not be resolved to a user. This is an internal error.\n\nParameters:\n* $1 - username of the caller",
        "passwordreset-ignored": "Shown when password reset was unsuccessful due to configuration problems.",
        "passwordreset-invalideamil": "Returned when the email address is syntatically invalid.",
        "editpage-invalidcontentmodel-text": "Error message shown when using an unrecognized content model on EditPage. $1 is the user's invalid input",
        "editpage-notsupportedcontentformat-title": "Title of error page shown when using an incompatible format on EditPage.\n\nUsed as title for the following error message:\n* {{msg-mw|Editpage-notsupportedcontentformat-text}}.",
        "editpage-notsupportedcontentformat-text": "Error message shown when using an incompatible format on EditPage.\n\nThe title for this error is {{msg-mw|Editpage-notsupportedcontentformat-title}}.\n\nParameters:\n* $1 - the format id\n* $2 - the content model name",
-       "content-model-wikitext": "Name for the wikitext content model, used when decribing what type of content a page contains.\n\nThis message is substituted in:\n*{{msg-mw|Bad-target-model}}\n*{{msg-mw|Content-not-allowed-here}}",
+       "content-model-wikitext": "Name for the wikitext content model, used when decribing what type of content a page contains.\n\nThis message is substituted in:\n*{{msg-mw|Bad-target-model}}\n*{{msg-mw|Content-not-allowed-here}}\n{{Identical|Wikitext}}",
        "content-model-text": "Name for the plain text content model, used when decribing what type of content a page contains. Plaintext means that the content of the page will be rendered as is like:\n\n<nowiki>This is [[plain text]]. <a href=\"https://www.mediawiki.org/\">Really!</a></nowiki>\n\nThis message is substituted in:\n*{{msg-mw|Bad-target-model}}\n*{{msg-mw|Content-not-allowed-here}}\n\n{{Identical|Plain text}}",
        "content-model-javascript": "Name for the JavaScript content model, used when decribing what type of content a page contains.\n\nThis message is substituted in:\n*{{msg-mw|Bad-target-model}}\n*{{msg-mw|Content-not-allowed-here}}",
-       "content-model-css": "Name for the CSS content model, used when decribing what type of content a page contains.\n\nThis message is substituted in:\n*{{msg-mw|Bad-target-model}}\n*{{msg-mw|Content-not-allowed-here}}",
+       "content-model-css": "Name for the CSS content model, used when decribing what type of content a page contains.\n\nThis message is substituted in:\n*{{msg-mw|Bad-target-model}}\n*{{msg-mw|Content-not-allowed-here}}\n{{Identical|CSS}}",
        "content-model-json": "Name for the JSON content model, used when decribing what type of content a page contains.\n\nThis message is substituted in:\n*{{msg-mw|Bad-target-model}}\n*{{msg-mw|Content-not-allowed-here}}",
        "content-json-empty-object": "Used to represent an object with no properties on a JSON content model page.",
        "content-json-empty-array": "Used to represent an array with no values on a JSON content model page.",
        "right-ipblock-exempt": "{{doc-right|ipblock-exempt}}\nThis user automatically bypasses IP blocks, auto-blocks and range blocks - so I presume - but I am uncertain",
        "right-unblockself": "{{doc-right|unblockself}}",
        "right-protect": "{{doc-right|protect}}",
-       "right-editprotected": "{{doc-right|editprotected}}\nRefers to {{msg-mw|Protect-level-sysop}}.\n\nSee also:\n* {{msg-mw|Right-editsemiprotected}}",
-       "right-editsemiprotected": "{{doc-right|editsemiprotected}}\nRefers to {{msg-mw|Protect-level-autoconfirmed}}.\n\nSee also:\n* {{msg-mw|Right-editprotected}}",
+       "right-editprotected": "{{doc-right|editprotected}}\nRefers to {{msg-mw|Protect-level-sysop}}.\n\nSee also:\n* {{msg-mw|Right-editeditorprotected}}\n* {{msg-mw|Right-editextendedsemiprotected}}\n* {{msg-mw|Right-editprotected}}\n* {{msg-mw|Right-editsemiprotected}}",
+       "right-editsemiprotected": "{{doc-right|editsemiprotected}}\nRefers to {{msg-mw|Protect-level-autoconfirmed}}.\n\nSee also:\n* {{msg-mw|Right-editeditorprotected}}\n* {{msg-mw|Right-editextendedsemiprotected}}\n* {{msg-mw|Right-editprotected}}\n* {{msg-mw|Right-editsemiprotected}}",
        "right-editcontentmodel": "{{doc-right|editcontentmodel}}",
        "right-editinterface": "{{doc-right|editinterface}}",
        "right-editusercssjs": "{{doc-right|editusercssjs}}",
        "right-changetags": "{{doc-right|changetags}}",
        "right-deletechangetags": "{{doc-right|deletechangetags}}",
        "grant-generic": "Used if the grant name is not defined. Parameters:\n* $1 - grant name\n\nDefined grants (grant name refers: blockusers, createeditmovepage, ...):\n* {{msg-mw|grant-checkuser}}\n* {{msg-mw|grant-blockusers}}\n* {{msg-mw|grant-createaccount}}\n* {{msg-mw|grant-createeditmovepage}}\n* {{msg-mw|grant-delete}}\n* {{msg-mw|grant-editinterface}}\n* {{msg-mw|grant-editmycssjs}}\n* {{msg-mw|grant-editmyoptions}}\n* {{msg-mw|grant-editmywatchlist}}\n* {{msg-mw|grant-editpage}}\n* {{msg-mw|grant-editprotected}}\n* {{msg-mw|grant-highvolume}}\n* {{msg-mw|grant-oversight}}\n* {{msg-mw|grant-patrol}}\n* {{msg-mw|grant-privateinfo}}\n* {{msg-mw|grant-protect}}\n* {{msg-mw|grant-rollback}}\n* {{msg-mw|grant-sendemail}}\n* {{msg-mw|grant-uploadeditmovefile}}\n* {{msg-mw|grant-uploadfile}}\n* {{msg-mw|grant-basic}}\n* {{msg-mw|grant-viewdeleted}}\n* {{msg-mw|grant-viewmywatchlist}}",
-       "grant-group-page-interaction": "{{Related|grant-group}}",
-       "grant-group-file-interaction": "{{Related|grant-group}}",
-       "grant-group-watchlist-interaction": "{{Related|grant-group}}",
+       "grant-group-page-interaction": "{{Related|Grant-group}}",
+       "grant-group-file-interaction": "{{Related|Grant-group}}",
+       "grant-group-watchlist-interaction": "{{Related|Grant-group}}",
        "grant-group-email": "{{Related|Grant-group}}\n{{Identical|E-mail}}",
        "grant-group-high-volume": "{{Related|Grant-group}}",
        "grant-group-customization": "{{Related|Grant-group}}",
        "grant-basic": "Name for grant \"basic\".\n{{Related|Grant}}",
        "grant-viewdeleted": "Name for grant \"viewdeleted\".\n{{Related|Grant}}",
        "grant-viewmywatchlist": "Name for grant \"viewmywatchlist\".\n{{Related|Grant}}\n{{Identical|View your watchlist}}",
+       "grant-viewrestrictedlogs": "Name for grant \"viewrestrictedlogs\".\n{{Related|Grant}}",
        "newuserlogpage": "{{doc-logpage}}\n\nPart of the \"Newuserlog\" extension. It is both the title of [[Special:Log/newusers]] and the link you can see in [[Special:RecentChanges]].",
        "newuserlogpagetext": "Part of the \"Newuserlog\" extension. It is the description you can see on [[Special:Log/newusers]].",
        "rightslog": "{{doc-logpage}}\n\nIn [[Special:Log]]",
        "filedelete-edit-reasonlist": "Shown beneath the file deletion form on the right side. It is a link to [[MediaWiki:Filedelete-reason-dropdown]].\n\n{{Identical|Edit delete reasons}}",
        "filedelete-maintenance": "Content of the error page when $wgUploadMaintenance is set to true.",
        "filedelete-maintenance-title": "Title of the error page when $wgUploadMaintenance is set to true.",
-       "mimesearch": "Title of [[Special:MIMESearch]]. Also used as legend of the form.\n\nSee also:\n* {{msg-mw|Mimetype|label for input box}}\n* {{msg-mw|Ilsubmit|Submit button text}}",
-       "mimesearch-summary": "Text for [[Special:MIMESearch]]",
-       "mimetype": "Used as label for input box in the MIMESearch form on [[Special:MIMESearch]].\n\nSee also:\n* {{msg-mw|Mimesearch|page title}}\n* {{msg-mw|Ilsubmit|Submit button text}}\n{{Identical|MIME type}}",
+       "mimesearch": "Used as page title for [[Special:MIMESearch]], legend of input form and link text in [[Special:SpecialPages]].\n\nStrings on the page:\n* {{msg-mw|Mimesearch|page title, legend of input form, link in special pages}}\n* {{msg-mw|Mimesearch-summary|page summary}}\n* {{msg-mw|Mimetype|label for input box}}\n* {{msg-mw|Ilsubmit|search button}}\n\nCheck [[mw:Manual:MIME_type_detection]] for MIME types.",
+       "mimesearch-summary": "Page summary for [[Special:MIMESearch]]\n\nStrings on the page:\n* {{msg-mw|Mimesearch|page title, legend of input form, link in special pages}}\n* {{msg-mw|Mimesearch-summary|page summary}}\n* {{msg-mw|Mimetype|label for input box}}\n* {{msg-mw|Ilsubmit|search button}}\n\nCheck [[mw:Manual:MIME_type_detection]] for MIME types.",
+       "mimetype": "Label for input box in [[Special:MIMESearch]].\n\nStrings on the page:\n* {{msg-mw|Mimesearch|page title, legend of input form, link in special pages}}\n* {{msg-mw|Mimesearch-summary|page summary}}\n* {{msg-mw|Mimetype|label for input box}}\n* {{msg-mw|Ilsubmit|search button}}\n\nCheck [[mw:Manual:MIME_type_detection]] for MIME types.\n\n{{Identical|MIME type}}",
        "download": "Direct download link in each line returned by [[Special:MIMESearch]]. Points to the actual file, rather than the image description page.\n{{Identical|Download}}",
        "unwatchedpages": "{{doc-special|UnwatchedPages}}",
        "unwatchedpages-summary": "{{doc-specialpagesummary|unwatchedpages}}",
        "booksources-search": "Search button in [[Special:BookSources]]\n\n{{Identical|Search}}",
        "booksources-text": "Used in [[Special:BookSources/1]].\n\nThis message is followed by a list of links to other sites.\n\nSee also:\n* {{msg-mw|Booksources|title}}\n* {{msg-mw|Booksources-text|text}}",
        "booksources-invalid-isbn": "This message is displayed after an invalid ISBN is entered on [[Special:Booksources]].",
+       "magiclink-tracking-rfc": "Name of the [[mw:Special:MyLanguage/Help:Tracking categories|tracking category]] where pages that use RFC magic links will be added.",
+       "magiclink-tracking-rfc-desc": "Description of the tracking category {{mw-msg|magiclink-tracking-rfc}}",
+       "magiclink-tracking-pmid": "Name of the [[mw:Special:MyLanguage/Help:Tracking categories|tracking category]] where pages that use PMID magic links will be added.",
+       "magiclink-tracking-pmid-desc": "Description of the tracking category {{mw-msg|magiclink-tracking-pmid}}",
+       "magiclink-tracking-isbn": "Name of the [[mw:Special:MyLanguage/Help:Tracking categories|tracking category]] where pages that use ISBN magic links will be added.",
+       "magiclink-tracking-isbn-desc": "Description of the tracking category {{mw-msg|magiclink-tracking-isbn}}",
        "rfcurl": "{{notranslate}}\nParameters:\n* $1 - RFC number\nSee also:\n* {{msg-mw|Pubmedurl}}",
        "pubmedurl": "{{notranslate}}\nParameters:\n* $1 - Pubmed number\nSee also:\n* {{msg-mw|Rfcurl}}",
        "specialloguserlabel": "Used in [[Special:Log]] as a label for an input field with which the log can be filtered for entries describing actions ''performed'' by the specified user.  \"Carried out\" and \"done\" are possible alternatives for \"performed\".",
        "activeusers-summary": "{{doc-specialpagesummary|activeusers}}",
        "activeusers-intro": "Used as introduction in [[Special:ActiveUsers]]. Parameters:\n* $1 - number of days (<code>$wgActiveUserDays</code>)",
        "activeusers-count": "Used in [[Special:ActiveUsers]] to show the active user's recent action count in brackets ([]).\n* $1 is the number of recent actions\n* $2 is the user's name for use with GENDER (optional)\n* $3 is the maximum number of days of the RecentChangesList",
-       "activeusers-from": "Used as label for checkbox in the form on [[Special:ActiveUsers]].\n\nidentical with {{msg-mw|listusersfrom}}\n\nSee also:\n* {{msg-mw|activeusers|legend for the form}}\n* {{msg-mw|activeusers-hidebots|label for checkbox}}\n* {{msg-mw|activeusers-hidesysops|label for checkbox}}",
-       "activeusers-hidebots": "Used as label for checkbox in the form on [[Special:ActiveUsers]].\n\nSee also:\n* {{msg-mw|activeusers|legend for the form}}\n* {{msg-mw|activeusers-from|label for input box}}\n* {{msg-mw|activeusers-hidesysops|label for checkbox}}",
-       "activeusers-hidesysops": "Used as label for checkbox in the form on [[Special:ActiveUsers]].\n\nSee also:\n* {{msg-mw|activeusers|legend for the form}}\n* {{msg-mw|activeusers-from|label for input box}}\n* {{msg-mw|activeusers-hidebots|label for checkbox}}",
+       "activeusers-from": "Used as label for checkbox in the form on [[Special:ActiveUsers]].\n\nidentical with {{msg-mw|listusersfrom}}\n\nSee also:\n* {{msg-mw|activeusers|legend for the form}}",
+       "activeusers-groups": "Used as label on [[Special:ActiveUsers]].",
        "activeusers-noresult": "identical with {{msg-mw|listusers-noresult}}",
        "activeusers-submit": "Used as label for button in the form on [[Special:ActiveUsers]]",
        "listgrouprights": "The name of the special page [[Special:ListGroupRights]].",
        "modifiedarticleprotection": "This is a ''logentry'' message only used on IRC.\nText describing an action. $1 is a page title.",
        "unprotectedarticle": "This is a ''logentry'' message only used on IRC.\nUsed as action. Parameters:\n* $1 - target page title",
        "movedarticleprotection": "This is a ''logentry'' message only used on IRC. It appears in the log if a protected page is renamed.\n\nExample:\n<code>00:51, 16 September 2010 Siebrand +(Talk • contribs • block) moved protection settings from \"User:Siebrand/prot-move\" to \"User:Siebrand/prot-moved\" ‎ (User:Siebrand/prot-move moved to User:Siebrand/prot-moved: prot_move test.)</code>\n\nParameters:\n* $1 - target page title\n* $2 - source page title",
+       "protectedarticle-comment": "Used as part of the edit summary placed in the page history when a page is protected.\n\nParameters:\n* $1 - page title\n* $2 - user who carried out the action (should only be used in the <code>GENDER</code> magic word)",
+       "modifiedarticleprotection-comment": "Used as part of the edit summary placed in the page history when a page's protection settings are modified.\n\nParameters:\n* $1 - page title\n* $2 - user who carried out the action (should only be used in the <code>GENDER</code> magic word)",
+       "unprotectedarticle-comment": "Used as part of the edit summary placed in the page history when a page is unprotected.\n\nParameters:\n* $1 - page title\n* $2 - user who carried out the action (should only be used in the <code>GENDER</code> magic word)",
        "protect-title": "Title for the protection form. $1 is the title of the page to be (un)protected.",
        "protect-title-notallowed": "Same as {{msg-mw|Protect-title}}, but when the user does not have the right to change protection levels.\n\nParameters:\n* $1 - page title",
        "prot_1movedto2": "Message description: [[mw:Manual:Interface/1movedto2]]\n\nParameters:\n* $1 - source page title\n* $2 - target page title",
        "patrol-log-header": "Text that appears above the log entries on the [[Special:log|patrol log]].",
        "log-show-hide-patrol": "Used in [[Special:Log]]. Parameters:\n* $1 - link text; one of {{msg-mw|Show}} or {{msg-mw|Hide}}\n{{Related|Log-show-hide}}",
        "log-show-hide-tag": "Used in [[Special:Log]]. Parameters:\n* $1 - link text; one of {{msg-mw|Show}} or {{msg-mw|Hide}}\n{{Related|Log-show-hide}}",
+       "confirm-markpatrolled-button": "Used as Submit button text.\n{{Identical|OK}}",
+       "confirm-markpatrolled-top": "Confirmation message on interstitial form.\n\nParameters:\n* $1 - Target page title\n* $2 - Link to target page with page title as label\n* $3 - Link to recent change diff with revision ID as label",
        "deletedrevision": "Used as log comment. Parameters:\n* $1 - archive name of old image",
        "filedeleteerror-short": "Used as error message. Parameters:\n* $1 – There are two uses: 1) filename or 2) more specific error message like {{msg-mw|Backend-fail-internal}}.\nSee also:\n* {{msg-mw|Filedeleteerror-long}}",
        "filedeleteerror-long": "Used as error message. Parameters:\n* $1 - ...\nSee also:\n* {{msg-mw|Filedeleteerror-short}}",
        "newimages-hidepatrolled": "Used as label for a checkbox. When checked, [[Special:NewImages]] will not display patrolled uploads.\n\nCf. {{msg-mw|tog-hidepatrolled}} and {{msg-mw|apihelp-feedrecentchanges-param-hidepatrolled}}.",
        "noimages": "This is shown on the special page [[Special:NewImages]], when there aren't any recently uploaded files.",
        "gallery-slideshow-toggle": "Tooltip for the icon that toggles thumbnails on a slideshow  gallery.",
-       "ilsubmit": "Used as label for input box in the MIMESearch form on [[Special:MIMESearch]].\n\nSee also:\n* {{msg-mw|Mimesearch|page title}}\n* {{msg-mw|Mimetype|label for input box}}\n{{Identical|Search}}",
+       "ilsubmit": "Search button in [[Special:MIMESearch]].\n\nStrings on the page:\n* {{msg-mw|Mimesearch|page title, legend of input form, link in special pages}}\n* {{msg-mw|Mimesearch-summary|page summary}}\n* {{msg-mw|Mimetype|label for input box}}\n* {{msg-mw|Ilsubmit|search button}}\n\nCheck [[mw:Manual:MIME_type_detection]] for MIME types.\n\n{{Identical|Search}}",
        "bydate": "{{Identical|Date}}",
        "sp-newimages-showfrom": "This is a link on [[Special:NewImages]] which takes you to a gallery of the newest files.\n* $1 is a date (example: ''19 March 2008'')\n* $2 is a time (example: ''12:15'')",
        "video-dims": "{{optional}}\nParameters:\n* $1 - ...\n* $2 - width\n* $3 - height",
index bb89a09..86abce6 100644 (file)
        "notextmatches": "Manam ima p'anqakunap qillqankunapipas tarisqachu",
        "prevn": "{{PLURAL:$1|$1}} ñawpaq",
        "nextn": "{{PLURAL:$1|$1}} qatiq",
+       "prev-page": "ñawpaqnin p'anqa",
+       "next-page": "qatiqnin p'anqa",
        "prevn-title": "Ñawpaq $1 {{PLURAL:$1|taripasqa|taripasqakuna}}",
        "nextn-title": "Qatiq $1 {{PLURAL:$1|taripasqa|taripasqakuna}}",
        "shown-title": "Huk p'anqapi $1 {{PLURAL:$1|taripasqata|taripasqakunata}} rikuchiy",
        "activeusers-intro": "Kay qatiqpiqa ruraqkunatam rikunki, qhipaq $1 {{PLURAL:$1|p'unchawpi|p'unchawkunapi}} kay wikipi imatapas ruraq.",
        "activeusers-count": "$1 {{PLURAL:$1|llamk'apusqa|llamk'apusqakuna}} ñaqha {{PLURAL:$3|p'unchawpi|$3 p'unchawkunapi}}",
        "activeusers-from": "Ruraqkunata rikuchiy, kaywan qallarispa:",
-       "activeusers-hidebots": "Rurana antachakunata pakay",
-       "activeusers-hidesysops": "Kamachiqkunata pakay",
        "activeusers-noresult": "Ruraqkunataqa manam tarinichu.",
        "listgrouprights": "Ruraq huñup hayñinkuna",
        "listgrouprights-summary": "Kay qatiq sutisuyupiqa kay wikipi sut'ichasqa ruraq huñukunatam, kikinpa chayamuna hayñinkunatawan rikunki.\nChay kikinkunap hayñinkunamanta astawan ñawirinaykipaqqa [[{{MediaWiki:Listgrouprights-helppage}}|kaypi qhaway]].",
        "htmlform-chosen-placeholder": "Akllanata akllay",
        "htmlform-cloner-create": "Astawan yapay",
        "htmlform-cloner-delete": "Qichuy",
-       "sqlite-has-fts": "$1 hunt'a qillqa maskana yanapawan",
-       "sqlite-no-fts": "$1 mana hunt'a qillqa maskana yanapawan",
        "logentry-delete-delete": "{{GENDER:$2|}}$1 sutiyuq ruraqqa $3 nisqa p'anqatam qullun",
        "logentry-delete-restore": "{{GENDER:$2|}}$1 sutiyuq ruraqqa $3 nisqa p'anqatam qullusqamanta paqarichin",
        "logentry-delete-event": "{{GENDER:$2|}}$1 sutiyuq ruraqqa {{PLURAL:$5|huk hallch'ay|$5 hallch'ay}} ruraypa rikunalla kayninta wakinchan $3 p'anqapi: $4",
index a9db650..ad4e913 100644 (file)
@@ -34,7 +34,7 @@
        "tog-enotifminoredits": "Manneme 'na mail quanne onne state fatte cangiaminde stuèdeche sus a le pàggene",
        "tog-enotifrevealaddr": "Fa vedè l'indirizze e-mail jndr'à le e-mail de notifiche",
        "tog-shownumberswatching": "Fa vedè 'u numere de le utinde ca uardene",
-       "tog-oldsig": "Firme esistende:",
+       "tog-oldsig": "'A firma toje:",
        "tog-fancysig": "Firma grezze cumme a 'nu teste de Uicchi (senza collegamende automatiche)",
        "tog-uselivepreview": "Ause l'andeprime da 'u vive",
        "tog-forceeditsummary": "Ciércame conferme quanne stoche a 'nzerische 'nu riepighe vianghe",
        "yourpasswordagain": "Scrive 'a passuord notra vote:",
        "createacct-yourpasswordagain": "Conferme 'a passuord",
        "createacct-yourpasswordagain-ph": "Mitte arrete 'a passuord",
-       "remembermypassword": "Arrencuerdete 'u nome mije sus a stu combiuter (pe 'nu massime de $1 {{PLURAL:$1|sciurne|sciurne}})",
        "userlogin-remembermypassword": "Arrecuèrdeme",
        "userlogin-signwithsecure": "Ause 'na connessione secure",
+       "cannotlogin-title": "Non ge puè trasé",
        "yourdomainname": "'U nome d'u dominie tue:",
        "password-change-forbidden": "Non ge puè cangià le passuord sus a sta uicchi.",
        "externaldberror": "Vide bbuene, o stè 'n'errore de autendicazione a 'u database oppure tu non ge puè aggiorna 'u cunde tue esterne.",
        "newarticle": "(Nuève)",
        "newarticletext": "Tu ste segue 'nu collegamende a pàgene ca angore non g'esiste.\nPe ccrejà 'a pàgene, accuminze a scrivere jndr'à 'u scatole de sotte (vide 'a [$1 pàggene d'ajute] pe avè cchiù 'mbormaziune).\nCe tu te iacche aqquà e manghe tu 'u se purcè, allore cazze 'u buttone '''back''' d'u brauser.",
        "anontalkpagetext": "----''Queste jè 'na pàgene de 'ngazzaminde pe 'n'utende anonime, ca non ge vò ccu ccreje angore 'nu cunde utende, o de ce non g'u use.\nNuje auseme 'n'indirizze IP (ca jè numereche) pe identificarle.\nE' normale ca essende 'n'indirizze IP pò essere ausete pure da otre utinde ca 'u pigghiene.\nCe tu non ge si 'n'utende anonime e pinze ca le commende ca so revolte a te sonde studecarije, pe piacere [[Special:CreateAccount|ccreje 'nu cunde utende]] o [[Special:UserLogin|tràse]] pe no fà confusione jndr'à 'u future cu otre utinde anoneme.''",
-       "noarticletext": "Non ge stè scritte ninde jndr'à sta pàgene.\nTu puè [[Special:Search/{{PAGENAME}}|cercà pe quiste titele]] jndr'à otre pàggene, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}}] oppure [{{fullurl:{{FULLPAGENAME}}|action=edit}} cange sta pàgene]</span>.",
+       "noarticletext": "Non ge stè scritte ninde jndr'à sta pàgene.\nTu puè [[Special:Search/{{PAGENAME}}|cercà pe quiste titole]] jndr'à otre pàggene, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} cirche l'archivije sue] o [{{fullurl:{{FULLPAGENAME}}|action=edit}} ccreje sta pàgene]</span>.",
        "noarticletext-nopermission": "Pe mò non ge stè teste jndr'à sta pàgene.\nTu puè [[Special:Search/{{PAGENAME}}|cercà pe stu titole]] jndr'à otre pàggene,\no <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} cirche jndr'à l'archivije cullegate]</span>, ma non ge tìne le permesse pe ccrejà sta pàgene.",
        "missing-revision": "'A revisione #$1 d'a pàgene chiamate \"{{FULLPAGENAME}}\" non g'esiste.\n\nQuiste succede normalmende purcé 'u cunde jè collegate a 'na pàgene ca ha state scangellate.\nLe dettaglie le puè acchià jndr'à l'[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} archivije de le scangellaziune].",
        "userpage-userdoesnotexist": "'U cunde utende \"<nowiki>$1</nowiki>\" non g'è reggistrete.\nPe piacere, condrolle ce tu vuè cu ccreje/cange sta pàgene.",
        "searchprofile-advanced-tooltip": "Cirche jndr'à le namespace personalizzete",
        "search-result-size": "$1 ({{PLURAL:$2|1 parole|$2 parole}})",
        "search-result-category-size": "{{PLURAL:$1|1 membre|$1 membre}} ({{PLURAL:$2|1 sottecategorije|$2 sottecategorije}}, {{PLURAL:$3|1 file|$3 file}})",
-       "search-redirect": "(Redirette $1)",
+       "search-redirect": "(Redirette da $1)",
        "search-section": "(sezione $1)",
        "search-category": "(categorije $1)",
        "search-file-match": "(combronde 'u condenute d'u file)",
        "activeusers-intro": "Queste jè 'n'elenghe de utinde ca avene fatte certe tipe de attività fine a l'urteme $1 {{PLURAL:$1|sciurne|sciurne}}.",
        "activeusers-count": "$1 {{PLURAL:$1|cangiamende|cangiaminde}} jndr'à l'urteme {{PLURAL:$3|sciurne}}",
        "activeusers-from": "Fà vedè l'utinde partenne da:",
-       "activeusers-hidebots": "Scunne le bot",
-       "activeusers-hidesysops": "Scunne le amministrature",
        "activeusers-noresult": "Nisciune utende acchiate.",
        "listgrouprights": "Deritte de le gruppe utinde",
        "listgrouprights-summary": "'A liste ca ste vide ète 'na liste de le gruppe utinde ccreiate sus a sta Uicchi, cu le lore deritte d'accesse associate.\nPonne stà [[{{MediaWiki:Listgrouprights-helppage}}|'mbormaziune de cchiù]] sus a le deritte individuale.",
        "contributions": "Condrebbute de l'{{GENDER:$1|utende}}",
        "contributions-title": "Condrebbute de l'utende pe $1",
        "mycontris": "Condrebbute mie",
+       "anoncontribs": "Condrebbute",
        "contribsub2": "Pe {{GENDER:$3|$1}} ($2)",
        "contributions-userdoesnotexist": "'U cunde utende \"$1\" non g'è reggistrate.",
        "nocontribs": "Nisciune cangiamende ha state acchiate cu ste criterie.",
        "javascripttest": "Test de JavaScript",
        "javascripttest-pagetext-unknownaction": "Aziona scanusciute \"$1\"",
        "javascripttest-qunit-intro": "Vide 'a [$1 documendazione d'u test] sus a mediawiki.org.",
-       "tooltip-pt-userpage": "'A pàgene utende meje",
+       "tooltip-pt-userpage": "'A pàgene {{GENDER:|utende}} meje",
        "tooltip-pt-anonuserpage": "'A pàgene utende pe l'IP ca tu ste cange cumme",
-       "tooltip-pt-mytalk": "'Ngazzaminde mie",
+       "tooltip-pt-mytalk": "'Ngazzaminde {{GENDER:|mie}}",
        "tooltip-pt-anontalk": "'Ngazzamende sus a le cangiaminde da stu indirizze IP",
-       "tooltip-pt-preferences": "Me piece accussì",
+       "tooltip-pt-preferences": "{{GENDER:|Me piace}} accussì",
        "tooltip-pt-watchlist": "'A liste de le pàggene ca ste condrolle pe le camgiaminde",
-       "tooltip-pt-mycontris": "Liste de le condrebbute mie",
+       "tooltip-pt-mycontris": "Liste de le condrebbute {{GENDER:|mie}}",
        "tooltip-pt-login": "Tu si 'ncoraggiete a cullegarte, jidde non g'è 'n'obblighe.",
        "tooltip-pt-logout": "Isse",
        "tooltip-pt-createaccount": "Te ste 'ngoragge pe ccrejà 'nu cunde e trasè; comungue, non g'è obbligatorie",
        "tooltip-t-recentchangeslinked": "Cangiaminde recende jndr'à le pàggene appundete da sta pàgene",
        "tooltip-feed-rss": "RSS feed pe sta pàgene",
        "tooltip-feed-atom": "Atom feed pe sta pàgene",
-       "tooltip-t-contributions": "Vide 'a liste de le condrebbute de quiste utende",
+       "tooltip-t-contributions": "Vide l'elenghe de le condrebbute de {{GENDER:$1|stu utende}}",
        "tooltip-t-emailuser": "Manne n'e-mail a stu utende",
        "tooltip-t-info": "Cchiù 'mbormaziune sus a sta pàgene",
        "tooltip-t-upload": "Careche le file",
        "htmlform-title-not-exists": "$1 non g'esiste.",
        "htmlform-user-not-exists": "<strong>$1</strong> non g'esiste.",
        "htmlform-user-not-valid": "<strong>$1</strong> non g'è 'nu nome utende valide.",
-       "sqlite-has-fts": "$1 cu 'u supporte d'a ricerche full-text",
-       "sqlite-no-fts": "$1 senze 'u supporte d'a ricerche full-text",
        "logentry-delete-delete": "$1 pàgena {{GENDER:$2|scangellate}} $3",
        "logentry-delete-restore": "$1 pàgena {{GENDER:$2|repristinate}} $3",
        "logentry-delete-event": "$1 {{GENDER:$2|cangiate}} 'a vesibbilità {{PLURAL:$5|de l'archivije de le fatte|$5 de l'archivije de le fatte}} sus 'a $3: $4",
        "feedback-external-bug-report-button": "Memorizze 'nu combite tecniche",
        "feedback-dialog-title": "Conferme 'a segnalazione",
        "feedback-dialog-intro": "Tu puè ausà 'u module facile facile aqquà sotte pe confermà 'a segnalaziona toje. 'U commende tune avène aggiunde sus 'a pàgene \"$1\", affianghe a 'u nome utende tune.",
-       "feedback-error-title": "Errore",
        "feedback-error1": "Errore: resultate inaspettate da l'API",
        "feedback-error2": "Errore: Cangiamende fallite",
        "feedback-error3": "Errore: Nisciuna resposte da l'API",
        "feedback-thanks": "Grazie! 'A segnalaziona toje ha state mannate a 'a pàgene \"[$2 $1]\".",
        "feedback-thanks-title": "Grazie 'mbà!",
        "feedback-useragent": "Utende agente:",
-       "searchsuggest-search": "Cirche",
+       "searchsuggest-search": "Cirche {{SITENAME}}",
        "searchsuggest-containing": "tène...",
        "api-error-badaccess-groups": "Tu non ge puè carecà file sus a sta Uicchi.",
        "api-error-badtoken": "Errore inderne: Gettone errate.",
index 9a10860..78169e2 100644 (file)
@@ -94,7 +94,9 @@
                        "Jdforrester",
                        "Jack who built the house",
                        "Cat1987",
-                       "SergeyButkov"
+                       "SergeyButkov",
+                       "Irus",
+                       "Kareyac"
                ]
        },
        "tog-underline": "Подчёркивание ссылок:",
        "virus-badscanner": "Ошибка настройки. Неизвестный сканер вирусов: ''$1''",
        "virus-scanfailed": "ошибка сканирования (код $1)",
        "virus-unknownscanner": "неизвестный антивирус:",
-       "logouttext": "'''Вы завершили сеанс работы.'''\n\nНекоторые страницы могут продолжать отображаться в том виде, как будто вы всё ещё представлены системе. Для борьбы с этим явлением обновите кэш браузера.",
+       "logouttext": "<strong>Вы завершили сеанс работы.</strong>\n\nНекоторые страницы могут продолжать отображаться в том виде, как будто вы всё ещё представлены системе. Для борьбы с этим явлением обновите кэш браузера.",
        "cannotlogoutnow-title": "Невозможно выйти прямо сейчас",
        "cannotlogoutnow-text": "Нельзя выйти во время использования $1.",
        "welcomeuser": "Добро пожаловать, $1!",
        "botpasswords-label-delete": "Удалить",
        "botpasswords-label-resetpassword": "Сбросить пароль",
        "botpasswords-label-grants": "Применимые разрешения:",
-       "botpasswords-help-grants": "Ð\9aаждое Ñ\80азÑ\80еÑ\88ение Ð´Ð°Ñ\91Ñ\82 Ð´Ð¾Ñ\81Ñ\82Ñ\83п Ðº Ð¿ÐµÑ\80еÑ\87иÑ\81леннÑ\8bм Ð¿Ñ\80авам Ñ\83Ñ\87аÑ\81Ñ\82ника, ÐºÐ¾Ñ\82оÑ\80Ñ\8bе Ñ\83же ÐµÑ\81Ñ\82Ñ\8c Ñ\83 Ñ\83Ñ\87Ñ\91Ñ\82ной Ð·Ð°Ð¿Ð¸Ñ\81и Ñ\83Ñ\87аÑ\81Ñ\82ника. Ð¡Ð¼. [[Special:ListGrants|Ñ\82аблиÑ\86Ñ\83 Ñ\80азÑ\80еÑ\88ений]] для получения дополнительной информации.",
+       "botpasswords-help-grants": "Ð\93Ñ\80анÑ\82Ñ\8b Ñ\80азÑ\80еÑ\88иÑ\82Ñ\8c Ð´Ð¾Ñ\81Ñ\82Ñ\83п Ðº Ð¿Ñ\80авам, ÐºÐ¾Ñ\82оÑ\80Ñ\8bми Ñ\83же Ð²Ð»Ð°Ð´ÐµÐµÑ\82 Ð\92аÑ\88ей Ñ\83Ñ\87еÑ\82ной Ð·Ð°Ð¿Ð¸Ñ\81и Ð¿Ð¾Ð»Ñ\8cзоваÑ\82елÑ\8f. Ð\92клÑ\8eÑ\87ение Ð\93Ñ\80анÑ\82 Ð·Ð´ÐµÑ\81Ñ\8c Ð½Ðµ Ð¿Ñ\80едоÑ\81Ñ\82авлÑ\8fеÑ\82 Ð´Ð¾Ñ\81Ñ\82Ñ\83п Ðº Ð»Ñ\8eбÑ\8bм Ð¿Ñ\80авам, Ñ\87Ñ\82о Ð²Ð°Ñ\88а Ñ\83Ñ\87еÑ\82наÑ\8f Ð·Ð°Ð¿Ð¸Ñ\81Ñ\8c Ð\9fолÑ\8cзоваÑ\82елÑ\8f Ð½Ðµ Ð±Ñ\83деÑ\82 Ð² Ð¿Ñ\80оÑ\82ивном Ñ\81лÑ\83Ñ\87ае. Ð¡Ð¼ [[Special:ListGrants|ТаблиÑ\86а Ð³Ñ\80анÑ\82ов]] для получения дополнительной информации.",
        "botpasswords-label-grants-column": "Разрешено",
        "botpasswords-bad-appid": "Имя бота «$1» является недопустимым.",
        "botpasswords-insert-failed": "Не удалось добавить бота с именем «$1». Возможно, он был уже добавлен?",
        "undo-failure": "Правка не может быть отменена из-за несовместимости промежуточных изменений.",
        "undo-norev": "Правка не может быть отменена, так как её не существует или она была удалена.",
        "undo-nochange": "Правка, похоже, уже была отменена.",
-       "undo-summary": "Отмена правки $1, сделанной {{GENDER:$2|участником|участницей}} [[Special:Contribs/$2|$2]] ([[User talk:$2|обс.]])",
+       "undo-summary": "Отмена правки $1, сделанной {{GENDER:$2|участником|участницей}} [[Special:Contributions/$2|$2]] ([[User talk:$2|обс.]])",
        "undo-summary-username-hidden": "Отмена правки $1, сделанной участником, чьё имя скрыто",
        "cantcreateaccount-text": "Создание учётных записей с этого IP-адреса ('''$1''') было заблокировано {{GENDER:$3|участником|участницей|}} [[User:$3|$3]].\n\n$3 {{GENDER:$3|указал|указала}} следующую причину: ''$2''.",
        "cantcreateaccount-range-text": "{{GENDER:$3|Участник|Участница}} [[User:$3|$3]] {{GENDER:$3|установил|установила}} запрет на создание учётных записей из диапазона IP-адресов <strong>$1</strong>, включающего ваш IP-адрес (<strong>$4</strong>). \n\nБыла указана следующая причина: $2.",
        "grant-basic": "Основные права",
        "grant-viewdeleted": "Просмотр удалённых файлов и страниц",
        "grant-viewmywatchlist": "Просмотр вашего списка наблюдения",
+       "grant-viewrestrictedlogs": "Смотреть записи журнала с ограниченным доступом",
        "newuserlogpage": "Журнал регистрации участников",
        "newuserlogpagetext": "Список недавно зарегистрировавшихся участников",
        "rightslog": "Журнал прав участника",
        "booksources-search": "Найти",
        "booksources-text": "На этой странице приведён список ссылок на сайты, где вы, возможно, найдёте дополнительную информацию о книге. Это интернет-магазины и системы поиска в библиотечных каталогах.",
        "booksources-invalid-isbn": "Указанный номер ISBN, судя по всему, содержит ошибку. Пожалуйста, проверьте, что при переносе номера из первоисточника не возникло искажений.",
+       "magiclink-tracking-rfc": "Страницы, использующие волшебные ссылки RFC",
+       "magiclink-tracking-rfc-desc": "Эта страница использует волшебные ссылки RFC. См. [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] о том, как осуществить перенос.",
+       "magiclink-tracking-pmid": "Страницы, использующие волшебные ссылки PMID",
+       "magiclink-tracking-pmid-desc": "Эта страница использует волшебные ссылки PMID. См. [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] о том, как осуществить перенос.",
+       "magiclink-tracking-isbn": "Страницы, использующие волшебные ссылки ISBN",
+       "magiclink-tracking-isbn-desc": "Эта страница использует волшебные ссылки ISBN. См. [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] о том, как осуществить перенос.",
        "specialloguserlabel": "Исполнитель:",
        "speciallogtitlelabel": "Цель (название или {{ns:user}}:имя участника):",
        "log": "Журналы",
        "activeusers-intro": "Это список участников, совершавших какие-либо действия за {{PLURAL:$1|последний $1 день|последние $1 дня|последние $1 дней|1=последний день}}.",
        "activeusers-count": "$1 {{PLURAL:$1|правка|правки|правок}} за {{PLURAL:$3|$3 последний день|последние $3 дня|последние $3 дней|1=последний день}}",
        "activeusers-from": "Показать участников, начиная с:",
-       "activeusers-hidebots": "Скрыть ботов",
-       "activeusers-hidesysops": "Скрыть администраторов",
+       "activeusers-groups": "Отображать пользователей, принадлежащих к группам:",
        "activeusers-noresult": "Не найдено участников.",
        "activeusers-submit": "Показать активных участников",
        "listgrouprights": "Права групп участников",
        "alreadyrolled": "Невозможно откатить последние изменения страницы «[[:$1]]», совершённые [[User:$2|$2]] ([[User talk:$2|обсуждение]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]),\nпоскольку кто-то другой уже успел откатить эти правки или отредактировать страницу.\n\nПоследние изменения {{GENDER:$3|внёс|внесла}} [[User:$3|$3]] ([[User talk:$3|обсуждение]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "Было дано описание изменения: <em>$1</em>.",
        "revertpage": "Откат правок [[Special:Contributions/$2|$2]] ([[User talk:$2|обсуждение]]) к версии [[User:$1|$1]]",
-       "revertpage-nouser": "Ð\9fÑ\80авки (имÑ\8f Ñ\83Ñ\87аÑ\81Ñ\82ника Ñ\81кÑ\80Ñ\8bÑ\82о) Ð¾Ñ\82каÑ\87енÑ\8b к версии {{GENDER:$1|[[User:$1|$1]]}}",
+       "revertpage-nouser": "Ð\9eÑ\82каÑ\82 Ð¿Ñ\80авок (имÑ\8f Ñ\83Ñ\87аÑ\81Ñ\82ника Ñ\81кÑ\80Ñ\8bÑ\82о) к версии {{GENDER:$1|[[User:$1|$1]]}}",
        "rollback-success": "Откачены правки $1; возврат к версии $2.",
        "rollback-success-notify": "Откачены правки $1; возврат к последней версии $2. [$3 Показать изменения]",
        "sessionfailure-title": "Ошибка сеанса",
        "modifiedarticleprotection": "изменён уровень защиты страницы «[[$1]]»",
        "unprotectedarticle": "снята защита с «[[$1]]»",
        "movedarticleprotection": "перенёс настройки защиты с «[[$2]]» на «[[$1]]»",
+       "protectedarticle-comment": "Защитил{{GENDER:$2||а}} «[[$1]]»",
+       "modifiedarticleprotection-comment": "Изменил{{GENDER:$2||а}} уровень защиты «[[$1]]»",
+       "unprotectedarticle-comment": "Убрал{{GENDER:$2||а}} защиту с «[[$1]]»",
        "protect-title": "Установка уровня защиты для «$1»",
        "protect-title-notallowed": "Просмотр уровня защиты «$1»",
        "prot_1movedto2": "[[$1]] переименована в [[$2]]",
index 598e10d..184a3a0 100644 (file)
        "searchprofile-advanced-tooltip": "Этиллибит аат далларыгар көрдөөһүн",
        "search-result-size": "$1 ({{PLURAL:$2|1 тыл|$2 тыл}})",
        "search-result-category-size": "{{PLURAL:$1|$1 элэмиэн|$1 элэмиэннэр}} ({{PLURAL:$2|$2 субкатегория|$2 субкатегориялар}}, {{PLURAL:$3|$3 билэ|$3 билэлэр}})",
-       "search-redirect": "(утаарыы $1)",
+       "search-redirect": "(мантан $1 утаарылынна)",
        "search-section": "($1 сиэксийэ)",
        "search-category": "(категория $1)",
        "search-file-match": "(билэ иһинээҕитин кытта сөп түбэһэр)",
        "activeusers-intro": "Бу кэлиҥҥи $1 {{PLURAL:$1|күҥҥэ|күннэргэ}} тугу эмэ гыммыт кыттааччылар тиһиктэрэ.",
        "activeusers-count": "Кэнники $3 күҥҥэ саҥа $1 көннөрүү киирбит",
        "activeusers-from": "Мантан саҕалаан кыттааччылары көрүү:",
-       "activeusers-hidebots": "Руобаттары көрдөрүмэ",
-       "activeusers-hidesysops": "Дьаһабыллары көрдөрүмэ",
        "activeusers-noresult": "Кыттааччылар көстүбэтилэр.",
        "activeusers-submit": "Көхтөөх кыттааччылары көрдөр",
        "listgrouprights": "Кыттааччылар бөлөхтөрүн бырааптара",
        "feedback-external-bug-report-button": "Тех. садаанньаны ыытыы",
        "feedback-dialog-title": "Санааҕын ыыт",
        "feedback-dialog-intro": "Санааҕын этэргэ аллара баар судургу форманы туһаныаххын сөп. Оччоҕо Эн аатыҥ уонна этииҥ «$1» сирэйгэ эбиллиэ.",
-       "feedback-error-title": "Алҕас",
        "feedback-error1": "Алҕас: API биллибэт түмүгэ",
        "feedback-error2": "Алҕас: Көннөрүү сатаммата",
        "feedback-error3": "Алҕас: API хоруйдаабата",
        "feedback-thanks": "Махтал! Эн санааҥ бу сирэйгэ \"[$2 $1]\" сурулунна.",
        "feedback-thanks-title": "Махтал!",
        "feedback-useragent": "Браузерым:",
-       "searchsuggest-search": "Көрдөөһүн",
+       "searchsuggest-search": "{{SITENAME}} иһигэр көрдөөһүн",
        "searchsuggest-containing": "тыл баар ыстатыйалара...",
        "api-error-badaccess-groups": "Эн бу биикигэ билэ киллэрэриҥ хааччахтаммыт.",
        "api-error-badtoken": "Ис алҕас: Омсолоох токен.",
index 3f5890a..807dbfc 100644 (file)
        "tog-watchlisthidebots": "Ammuccia li canciamenti dî bot ntâ lista taliata",
        "tog-watchlisthideminor": "Ammuccia li canciamenti nichi ntâ lista taliata",
        "tog-watchlisthideliu": "Ammuccia li canciamenti di l'utilizzatura riggistrati ntâ lista taliata",
+       "tog-watchlistreloadautomatically": "Ricarica automaticamenti l'elencu di l'ussirvati spiciali ogni vota ca si cancia nu filtru (addumanna JavaScript)",
        "tog-watchlisthideanons": "Ammuccia li canciamenti di l'utilizzatura anònimi ntâ lista taliata",
        "tog-watchlisthidepatrolled": "Ammuccia li canciamenti virificati ntâ lista taliata",
+       "tog-watchlisthidecategorization": "Ammuccia la catigurizzazioni dî pàggini",
        "tog-ccmeonemails": "Mànnami na copia dî missaggi spiduti a l'àutri utenti",
        "tog-diffonly": "Nun ammustrari lu cuntinutu dî pàggini sutta dî cunfrunti tra virsioni",
        "tog-showhiddencats": "Ammustra li catigurìi ammucciati",
        "tog-norollbackdiff": "Nun ammustrari lu cunfruntu tra virsioni doppu aviri fattu nu canciu n'arreri",
        "tog-useeditwarning": "Avvèrtimi quannu mi nni vaiu di na pàggina cu canciamenti nun sarvati",
-       "tog-prefershttps": "Adòpira sempri na cunnissioni sicura quannu trasisti",
+       "tog-prefershttps": "Adòpirati sempri na cunnissioni sicura quannu trasiti",
        "underline-always": "Sempri",
        "underline-never": "Mai",
        "underline-default": "Mpustazzioni pridifinuta dâ peddi o dû browser",
        "october-date": "$1 di uttùviru",
        "november-date": "$1 di nuvèmmiru",
        "december-date": "$1 di dicèmmiru",
+       "period-am": "di matina",
        "pagecategories": "{{PLURAL:$1|Catigurìa|Catigurìi}}",
        "category_header": "Pàggini ntâ catigurìa \"$1\"",
        "subcategories": "Suttacatigurìi",
        "newwindow": "(grapi na finestra nova)",
        "cancel": "Annulla",
        "moredotdotdot": "Àutru...",
-       "morenotlisted": "Sta lista è ncumpreta",
+       "morenotlisted": "Sta lista putissi siri ncumpreta",
        "mypage": "Pàggina",
        "mytalk": "La mè pàggina di discussioni",
-       "anontalk": "Discussioni di stu nnirizzu IP",
+       "anontalk": "Discussioni",
        "navigation": "Navigazzioni",
        "and": "&#32;e",
        "qbfind": "Attrova",
        "yourpasswordagain": "Scrivi la password n'àutra vota",
        "createacct-yourpasswordagain": "Cunfirma la password",
        "createacct-yourpasswordagain-ph": "Nzirisci la password attorna",
-       "remembermypassword": "Arricorda la password supra stu computer (pi ô massimu $1 {{PLURAL:$1|jornu|jorna}})",
        "userlogin-remembermypassword": "Mantènimi culligatu",
        "userlogin-signwithsecure": "Adòpira na cunnissioni sicura",
        "yourdomainname": "Lu tò duminiu:",
        "passwordreset-emailtext-user": "L'utenti $1 supra a {{SITENAME}} fici n'addumannata pi l'azziramentu dâ tò password pi {{SITENAME}} ($4). {{PLURAL:$3|Lu cuntu utenti siguenti è assuciatu|Li cunti utenti siguenti sù assuciati}} cu stu nnirizzu di posta elittrònica:\n\n$2\n\n{{PLURAL:$3|Sta password timpurània|Sti password timpurànii}} scàdinu tra {{PLURAL:$5|un jornu|$5 jorna}}.\nOra tu avissi a tràsiri e scègghiri na password nova. Si fu quarchidun'àutru a fari st'addumannata e nun tu, o si t'arricurdasti la tò password origginali e nun la voi canciari cchiù, poi gnurari stu missaggiu e cuntinuari a adupirari la tò password vecchia.",
        "passwordreset-emailelement": "Nomu utenti: \n$1\n\nPassword timpurània: \n$2",
        "passwordreset-emailsentemail": "Nu missaggiu di posta elittrònica d'azziramentu dâ password fu mannatu.",
-       "passwordreset-emailsent-capture": "Nu missaggiu di posta elittrònica d'azziramentu dâ password fu mannatu, cû cuntinutu chi si pò taliari ccassutta.",
-       "passwordreset-emailerror-capture": "Nu missaggiu di posta elittrònica d'azziramentu dâ password fu cumpilatu, cû cuntinutu chi si pò taliari ccassutta, pirò la sò spidizzioni a l'utenti {{GENDER:$2|user}} nun arriniscìu: $1",
        "changeemail": "Canciu dû nnirizzu di posta elittrònica",
        "changeemail-header": "Jinchi stu mòdulu pi canciari lu tò nnirizzu di posta elittrònica. Hai a nziriri la tò password pi cunfirmari stu canciamentu.",
        "changeemail-no-info": "Hai a aviri trasutu p'aviri accessu direttu a sta pàggina.",
        "undo-nochange": "Pari chi lu canciamentu già fu annullatu.",
        "undo-summary": "Annullatu lu canciamentu $1 di [[Special:Contributions/$2|$2]] ([[User talk:$2|discussioni]])",
        "undo-summary-username-hidden": "Annullata la virsioni $1 fatta di n'utenti ammucciatu",
-       "cantcreateaccounttitle": "Mpussìbbili criari un cuntu",
        "cantcreateaccount-text": "La criazzioni di cunti a pàrtiri di stu nnirizzu IP (<strong>$1</strong>), fu bluccata di [[User:$3|$3]].\n\nLa spigazzioni data di $3 è <em>$2</em>",
        "cantcreateaccount-range-text": "La criazzioni di cunti a pàrtiri dî nnirizzi IP ntô ntervallu <strong>$1</strong>, chi cumprenni lu tò nnirizzu IP (<strong>$4</strong>), fu bluccata di [[User:$3|$3]].\n\nLa spigazzioni data di $3 è <em>$2</em>",
        "viewpagelogs": "Talìa li riggistri di sta pàggina",
        "activeusers-intro": "Chista è na lista di l'utenti chi fìciru na quarchi attività {{PLURAL:$1|nta l'ùrtimu jornu|nta l'ùrtimi $1 jorna}}.",
        "activeusers-count": "$1 {{PLURAL:$1|azzioni}} nta {{PLURAL:$3|l'ùrtimu jornu|l'ùrtimi $3 jorna}}",
        "activeusers-from": "Ammustra l'utenti a pàrtiri di:",
-       "activeusers-hidebots": "Ammuccia li bot",
-       "activeusers-hidesysops": "Ammuccia l'amministratura",
        "activeusers-noresult": "Nuddu utenti attruvatu.",
        "listgrouprights": "Dritti di gruppa d'utenti",
        "listgrouprights-summary": "Ccà sutta sunnu elincati li gruppa d'utenti difinuti nta sta wiki, cu li sò dritti d'accessu.\nCi ponnu èssiri [[{{MediaWiki:Listgrouprights-helppage}}|àutri nfurmazzioni]] a prupòsitu d'ognidunu drittu.",
        "htmlform-title-not-exists": "$1 nun esisti.",
        "htmlform-user-not-exists": "<strong>$1</strong> nun esisti.",
        "htmlform-user-not-valid": "<strong>$1</strong> nun è vàlidu comu nomu utenti.",
-       "sqlite-has-fts": "$1 cu capacità d'arricerca a tuttu testu",
-       "sqlite-no-fts": "$1 senza capacità d'arricerca a tuttu testu",
        "logentry-delete-delete": "$1 {{GENDER:$2|cancillau}} la pàggina $3",
        "logentry-delete-restore": "$1 {{GENDER:$2|ripristinau}} la pàggina $3",
        "logentry-delete-event": "$1 {{GENDER:$2|canciau}} la visibbilità di {{PLURAL:$5|n'eventu dû riggistru|$5 eventi dû riggistru}} di $3: $4",
        "feedback-external-bug-report-button": "Signala nu prubblema tècnicu",
        "feedback-dialog-title": "Lassa nu cummentu",
        "feedback-dialog-intro": "Poi adupirari stu mòdulu facili ccassutta pi lassari lu tò cummentu. Stu cummentu è agghiunciutu â pàggina «$1», nzèmmula ô tò nomu utenti.",
-       "feedback-error-title": "Erruri",
        "feedback-error1": "Erruri: Risurtatu di l'API nun arricanusciutu",
        "feedback-error2": "Erruri: Lu canciamentu nun arriniscìu",
        "feedback-error3": "Erruri: Nudda arrispunnuta di l'API",
index 273c8a6..5bd2832 100644 (file)
@@ -48,7 +48,7 @@
        "tog-showhiddencats": "Ruodītė pakavuotas kateguorėjės",
        "tog-norollbackdiff": "Nekrēptė diemesė i skėrtoma atlėkus atmetėma",
        "tog-useeditwarning": "Monėi dout žėnuot, kāp ėšēno ėš poslapė anon naėšsauguojis",
-       "tog-prefershttps": "Vėsūmet nauduotė saugu rīši kāp būno prėsijongė̄s",
+       "tog-prefershttps": "Vėsūmet nauduotė saugu rīši kap būno prisijongė̄s",
        "underline-always": "Vėsūmet",
        "underline-never": "Nikūmet",
        "underline-default": "Vagol naršīklės nustatīmus",
        "laggedslavemode": "Atėduos: Poslapie gal' nesmatītė vielībiausiu pakeitėmu.",
        "readonly": "Doumenū bazė ožrakėnta",
        "enterlockreason": "Iveskėt ožrakėnėma prižasti, tēpuogi kumet daugmaž bus atrokėnta",
-       "readonlytext": "Doumenū bazė daba īr ožrakėnta naujėm irašam a kėtėm keitėmam,\nmažo doumenū bazės techninē pruofilaktėkā,\npuo tuo vėsks griš i sava viežes.\nOžrakėnusiuojo admėnėstratuoriaus pateikts rakėnima paaiškėnims: $1",
+       "readonlytext": "Doumenū bazė daba īr ožrakinta naujėm irašam a kėtėm keitėmam,\nmažo doumenū bazės techninē pruofilaktėkā,\npu tuo viskos grīš i sava viežės.\nOžrakėnosė admėnėstratuorė douts rakėnėma paaiškėnėms: $1",
        "missing-article": "Doumenū bazė nerada poslapė teksta, katra ana torietu rastė, pavadėnta „$1“ $2.\n\nPaprastā tas būn dielē pasenosės skėrtoma vuo istuorėjės nūruodas i poslapi, katros bova ėštrėnts.\n\nJēgo tas nie šėts varėjants, Tamsta mažo raduot klaida pruogramėnė ironguo.\nPrašuom aple šėtā paskelbtė [[Special:ListUsers/sysop|adminėstratoriō]], nepamėršdamė nuruodītė nūruoda.",
        "missingarticle-rev": "(atmains nr. $1)",
        "missingarticle-diff": "(Skėrt.: $1, $2)",
        "yourpasswordagain": "Pakartuoket slaptažuodė:",
        "createacct-yourpasswordagain": "Čīstā tuokis slaptažuodis?",
        "createacct-yourpasswordagain-ph": "Apent ožrašīkat slaptažuodi",
-       "remembermypassword": "Atmintė prisėjongėma infuormacėjė šėtom kuompioteri (daugiausē $1 {{PLURAL:$1|dėina|dėinė|dėinas}})",
        "userlogin-remembermypassword": "Ka liktō prisėjongis",
        "userlogin-signwithsecure": "Apsauguots rīšīs",
        "cannotloginnow-title": "Nēn prėsijongtė",
        "eauthentsent": "Patvėrtėnėma gruomata bova nusiōsta i paskėrta el. pašta adresa.\nPrīš ėšsiontiant kėta gruomata i Tamstas diežote, Tamsta torėt vīkdītė nuruodīmus gruomatuo, kū patvėrtėntomiet, kū diežotė tėkrā īr Tamstas.",
        "throttled-mailpassword": "Slaptažuodžė priminims jau bova ėšsiōsts, par paskotėnės {{PLURAL:$1|adīna|$1 adīnas}}. Nuorint apsėsauguotė nū pėktnaudēvėma, slaptažuodė priminėms gal būt ėšsiōsts tėk kas {{PLURAL:$1|adīna|$1 adīnas}}.",
        "mailerror": "Bieda siontiont gromata: $1",
-       "acct_creation_throttle_hit": "Ton pruojekta lankītuojē, katrėi nauduo Tamstas IP adresa, padėrba {{PLURAL:$1|$1 paskīra|$1 paskīras|$1 paskīrū}} par paskotėnta dėina, a tas īr dėdliausis leidams skaitlios par ta čiesa.\nTudie šėton čieso lankītuojē, katrėi nauduo ta IP adresa, daugiau paskīrū dėrbt negal.",
+       "acct_creation_throttle_hit": "Ton pruojekta lankītuojē, katrėi nauduo Tamstas IP adresa, padėrba {{PLURAL:$1|$1 paskīra|$1 paskīras|$1 paskīrū}} par paskotėnta dėina, a tas īr dėdliausis leidams skaitlios par ta čiesa.\nTudie šėton čieso lankītuojē, katrėi nauduo tou IP adresa, daugiau paskīrū dėrbtė nagal.",
        "emailauthenticated": "Tamstas el. pašta adresos bova ožtvirtėnts $2 d. $3.",
        "emailnotauthenticated": "Tamstas el. pašta adresos da nier patvėrtėnts. Anėjuokės gruomatas\nnebus siontamas ni vėinam žemiau ėšvardėntam puoslaugiō.",
        "noemailprefs": "Nuruodėkīt el. pašta adresa, kū vėiktu šėtos funkcėjės.",
        "userpage-userdoesnotexist-view": "Nie nauduotuojė vardo „$1“",
        "blocked-notice-logextract": "Nauduotuos ožgints īr.\nApatiuo paruodīta kas ė kāpː",
        "clearyourcache": "'''Diemesė:''' ėšsauguojus Tamstā gal prireiktė ėšvalītė Tamstas naršīklės rėnktovė, kū paveizėtomėt pakeitėmus. '''Mozilla / Safari / Konqueror:''' laikīdami ''Shift'' pasėrinkėt ''Atsiōstė ėš nauja'', a paspauskėt ''Ctrl-Shift-R'' (sėstemuo Apple Mac ''Cmd-Shift-R''); '''IE:''' laikīdamė ''Ctrl'' paspauskėt ''Atnaujėntė'', o paspauskėt ''Ctrl-F5''; '''Konqueror:''' paprastiausē paspauskėt ''Perkrautė'' mīgtoka, o paspauskėt ''F5''; '''Opera''' nauduotuojam gal prireiktė pėlnā ėšvalītė anū rėnktovė ''Rakondā→Nustatīmā''.",
-       "usercssyoucanpreview": "'''Patarėms:''' Nauduokit „Ruodītė parvaiza“ mīgtoka, kū ėšmiegintomiet sava naujaji CSS priš ėšsaugont.",
-       "userjsyoucanpreview": "'''Patarėms:''' Nauduokit „Ruodītė parvaiza“ mīgtoka, kū ėšmiegintomiet sava naujaji JS priš ėšsaugont.",
+       "usercssyoucanpreview": "'''Patarėms:''' Nauduokat „{{int:showpreview}}“ mīgtoka, kū ėšmiegintomiet sava naujaji CSS prīš anou ėšsaugont.",
+       "userjsyoucanpreview": "'''Patarėms:''' Nauduokat „{{int:showpreview}}“ mīgtoka, kū ėšmiegintomiet sava naujaji JS prīš anou ėšsaugont.",
        "usercsspreview": "'''Napamirškėt, kū Tamsta tėk parveizėt sava nauduotoja CSS, ans da nabova ėšsauguots!'''",
        "userjspreview": "'''Nepamirškėt, kū Tamsta tėk testoujat/parvaizėt sava nauduotoja ''JavaScript'', ans da nabova ėšsauguots!'''",
        "userinvalidcssjstitle": "'''Diemesė:''' Nė juokės ėšruodos „$1“. Napamirškėt, kū sava .css ėr .js poslapē nauduo pavadėnėma mažuosiomės raidiemis, pvz., Nauduotuos:Foo/vector.css, o ne Nauduotuos:Foo/Vector.css.",
        "updated": "(Atnaujėnta)",
        "note": "'''Žėniuo:'''",
-       "previewnote": "'''Nepamėrškėt, kū tas tėktās pervaiza, pakeitėmā da nier ėšsauguotė!'''",
-       "continue-editing": "Dėrbtė tuoliau",
+       "previewnote": "'''Napamirškat, kū tas tėktās tier parvaiza, pakeitėmā da nier ėšsauguoti!'''",
+       "continue-editing": "Dėrbtė tūliaus",
        "previewconflict": "Šėta parvaiza paruod teksta ėš vėršotinėjė teksta redagavėma lauka tēp, kāp ans bus ruodoms, jei pasirinksėt anū ėšsauguotė.",
-       "session_fail_preview": "'''Atsiprašuom! Mes nagalėm vīkdītė Tamstas keitėma diel sesėjės doumenū praradima.\nPrašuom pamiegintė vielēk. Jei šėtā napaded, pamieginkėt atsėjongtė ėr prėsėjongtė atgal.'''",
-       "session_fail_preview_html": "'''Atsėprašuom! Mes nagalėm apdoroutė Tamstas keitėma diel sesėjės doumenū praradėma.'''\n''Kadaogi šėtom pruojekte grīnasės HTML īr ijongts, parveiza īr pasliepta kāp atsargoma prėimonė priš JavaScript atakas.''\n'''Jei tā teisiets keitėma bandīms, prašuom pamiegint viel. Jei šėtā napaded, pamieginkėt atsėjongtė ėr prėsėjongtė atgal.'''",
+       "session_fail_preview": "'''Atsiprašuom! Mes nagalam ožrašītė Tamstas keitėma diel sesėjės doumenū praradima.\nPrašuom pamiegintė vielek. Jeb tas namacīj, pamieginkat atsijongtė ė prisijongtė apent.'''",
+       "session_fail_preview_html": "'''Atsiprašuom! Mes nagalam apdirbtė Tamstas keitėma diel sesėjės doumenū praradėma.'''\n''Ka tamė pruojektė grīnasis HTML īr ijongts, parveiza īr pakavuota kap atsargoms prīš JavaScript poulėmus.''\n'''Je tā teisiets keitėma miegėnėms, prašuom pamiegintė apent. Je tas namacīj, pamieginkėt atsijongtė ė prisijongtė apent.'''",
        "editing": "Taisuoms straipsnis - $1",
        "creating": "Dėrbama $1",
        "editingsection": "Keitams $1 (skėrsnelis)",
        "editingold": "'''Atėdės: Tamsta keitat ne vielībiausi poslapė atmaina.\nJēgo ėšsauguosat sava pakeitėmus, īkondin darītė pakeitėmā prapols.'''",
        "yourdiff": "Skėrtomā",
        "copyrightwarning": "Žėnuokat, ka vėsks, kas patenk i {{SITENAME}}, īr laikuoma pavėišėnto vagol $2 (platiau - $1). Jēgo nenuorat, ka Tamstas duovis būtom ba gailesė keitams ė skleidams, nerašīkat čė.<br />\nTamsta tēpuogi pasėžadat, ka tas īr Tamstas patėis rašīts torėnīs aba parrašīts nug vėišū aba panašiū liousū vėitu.\n'''NEDIEKAT AUTUORĖNIEM TEISIEM APSERGIETU DARBŪ BA LEIDĖMA!'''",
-       "copyrightwarning2": "Žėnuokat, ka vėsks, kas patenk i {{SITENAME}}, gal būtė keitama ė trėnama. Jēgo nenuorat, ka Tamstas duovis būtom ba gailesė keitams ė skleidams, nerašīkat čė.<br />\nTamsta tēpuogi pasėžadat, ka tas īr Tamstas patėis rašīts torėnīs aba parrašīts nug vėišū aba panašiū liousū vėitu.\n'''NEDIEKAT AUTUORĖNIEM TEISIEM APSERGIETU DARBŪ BA LEIDĖMA!'''",
+       "copyrightwarning2": "Žėnuokat, ka vėskos, kas pakliūn i {{SITENAME}}, gal būtė keitama ė trėnama. Jēgo nenuorat, ka Tamstas duovis būtom ba gailesė keitams ė skleidams, nerašīkat čė.<br />\nTamsta tepuogė pasižadat, ka tas īr Tamstas patėis rašīts torėnīs aba parrašīts nug vėišū aba panašiū liousū vėitu.\n'''NEDIEKAT AUTUORĖNIEM TEISIEM APSERGIETU DARBŪ BA LEIDĖMA!'''",
        "readonlywarning": "'''DIEMESĖ: Doumenū bazė bova ožrakėnta teknėnē pruofilaktėkā,\ntudie negaliesėt ėšsauguotė sava pakeitėmu daba. Tamsta galėt nosėkopėjoutė teksta i tekstėni faila\nė paskum ikeltė ana čė.'''",
        "protectedpagewarning": "'''DIEMESĖ: Šėts poslapis īr ožrakints ėr anū redagoutė gal tėk admėnėstratuorė teises torėntīs prietelē.'''",
        "semiprotectedpagewarning": "'''Pastebiejėms:''' Šėts poslapis bova ožrakėnts ėr anuo gal redagoutė tėk regėstroutė nauduotojā.",
        "listusers-noresult": "Nerast anėjuokiū nauduotuoju.",
        "listusers-blocked": "(ožgints)",
        "activeusers": "Vēkōs nauduotuojē",
-       "activeusers-hidebots": "Kavuotė robuotus",
-       "activeusers-hidesysops": "Kavuotė admėnėstratorius",
        "activeusers-noresult": "Nerast anėjuokiu nauduotuoju.",
        "listgrouprights": "Nauduotuoju gropiu teisės",
        "listgrouprights-group": "Gropė",
index 24230f6..7843dc1 100644 (file)
        "activeusers-intro": "Toto je zoznam používateľov, ktorí $1 {{PLURAL:$1|za posledný 1 deň|za posledné $1 dni|za posledných $1 dní}} vykonali nejakú aktivitu.",
        "activeusers-count": "$1 {{PLURAL:$1|operácia|operácie|operácií}} za {{PLURAL:$3|posledný deň|posledné $3 dni|posledných $3 dní}}",
        "activeusers-from": "Zobraziť používateľov počínajúc:",
-       "activeusers-hidebots": "Skryť robotov",
-       "activeusers-hidesysops": "Skryť správcov",
        "activeusers-noresult": "Neboli nájdení žiadni používatelia.",
        "activeusers-submit": "Zobraziť aktívnych používateľov",
        "listgrouprights": "Práva skupiny používateľov",
        "feedback-thanks": "Ďakujeme. Váš komentár bol odoslaný na stránku „[$2 $1]“.",
        "feedback-thanks-title": "Ďakujeme",
        "feedback-useragent": "Prehliadač:",
-       "searchsuggest-search": "Hľadať {{SITENAME}}",
+       "searchsuggest-search": "Hľadať",
        "searchsuggest-containing": "obsahuje...",
        "api-error-autoblocked": "Vaše IP adresa bola automaticky zablokovaná, pretože ju používal zablokovaný používateľ.",
        "api-error-badaccess-groups": "Nemáte oprávnenie nahrávať súbory na tejto wiki.",
index 877e048..e51eee1 100644 (file)
        "botpasswords-label-delete": "Izbriši",
        "botpasswords-label-resetpassword": "Ponastavi geslo",
        "botpasswords-label-grants": "Veljavne pravice:",
-       "botpasswords-help-grants": "Vsaka pravica dodeli dostop do navedenih uporabniških pravic, ki jih uporabniški račun že ima. Za več informacij si oglejte [[Special:ListGrants|tabelo pravic]].",
+       "botpasswords-help-grants": "Pravice omogočajo dostop do pravic, ki jih vaš uporabniški račun že ima. Tukajšnja omogočitev pravice ne podeli dostopa do katere koli pravice, ki je vaš uporabniški račun drugače še nima. Za več informacij si oglejte [[Special:ListGrants|tabelo pravic]].",
        "botpasswords-label-grants-column": "Odobreno",
        "botpasswords-bad-appid": "Ime bota »$1« ni veljavno.",
        "botpasswords-insert-failed": "Dodajanje imena bota »$1« ni uspelo. Ste ga že dodali?",
        "grant-basic": "Osnovne pravice",
        "grant-viewdeleted": "Ogled izbrisanih datotek in strani",
        "grant-viewmywatchlist": "Ogled svojega spiska nadzorov",
+       "grant-viewrestrictedlogs": "Ogled omejenih dnevniških vnosov",
        "newuserlogpage": "Dnevnik registracij uporabnikov",
        "newuserlogpagetext": "Prikazan je dnevnik nedavnih registracij novih uporabnikov.",
        "rightslog": "Dnevnik uporabniških pravic",
        "booksources-search": "Išči",
        "booksources-text": "Sledi seznam povezav do drugi spletnih strani, ki prodajajo nove in rabljene knjige, in imajo morda nadaljnje informacije o knjigah, ki jih iščete:",
        "booksources-invalid-isbn": "Za dani ISBN se ne zdi, da je veljaven; preverite za morebitne napake pri kopiranju iz prvotnega vira.",
+       "magiclink-tracking-rfc": "Strani, ki uporabljajo čarobne povezave RFC",
+       "magiclink-tracking-rfc-desc": "Stran uporablja čarobne povezave RFC. Oglejte si [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] za navodila glede selitve.",
+       "magiclink-tracking-pmid": "Strani, ki uporabljajo čarobne povezave PMID",
+       "magiclink-tracking-pmid-desc": "Stran uporablja čarobne povezave PMID. Oglejte si [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] za navodila glede selitve.",
+       "magiclink-tracking-isbn": "Strani, ki uporabljajo čarobne povezave ISBN",
+       "magiclink-tracking-isbn-desc": "Stran uporablja čarobne povezave ISBN. Oglejte si [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] za navodila glede selitve.",
        "specialloguserlabel": "Izvajalec:",
        "speciallogtitlelabel": "Cilj (naslov ali {{ns:user}}:uporabniškoime za uporabnika):",
        "log": "Dnevniki",
        "activeusers-intro": "Seznam uporabnikov, ki so bili kakorkoli aktivni v {{PLURAL:$1|zadnjem $1 dnevu|zadnjih $1 dneh}}.",
        "activeusers-count": "$1 {{PLURAL:$1|dejanje|dejanji|dejanja|dejanj}} v {{PLURAL:$3|preteklem dnevu|preteklih $3 dneh}}",
        "activeusers-from": "Prikaži uporabnike začenši z:",
-       "activeusers-hidebots": "Skrij bote",
-       "activeusers-hidesysops": "Skrij administratorje",
+       "activeusers-groups": "Prikaži uporabnike, ki pripadajo skupinam:",
        "activeusers-noresult": "Noben uporabnik ni bil najden.",
        "activeusers-submit": "Prikaži dejavne uporabnike",
        "listgrouprights": "Pravice uporabniških skupin",
        "modifiedarticleprotection": "spremenjena stopnja zaščite »[[$1]]«",
        "unprotectedarticle": "odstranil(-a) zaščito »[[$1]]«",
        "movedarticleprotection": "nastavitve zaščite so prestavljene iz »[[$2]]« na »[[$1]]«",
+       "protectedarticle-comment": "{{GENDER:$2|Zaščitil|Zaščitila|Zaščitil(-a)}} »[[$1]]«",
+       "modifiedarticleprotection-comment": "{{GENDER:$2|Spremenil|Spremenila|Spremenil(-a)}} stopnjo zaščite »[[$1]]«",
+       "unprotectedarticle-comment": "{{GENDER:$2|Odstranil|Odstranil|Odstranil(-a)}} zaščito »[[$1]]«",
        "protect-title": "Zaščita strani »$1«",
        "protect-title-notallowed": "Ogled stopnje zaščite »$1«",
        "prot_1movedto2": "je prestavil(-a) [[$1]] na [[$2]]",
        "authmanager-authn-autocreate-failed": "Samodejno ustvarjanje lokalnega računa je spodletelo: $1",
        "authmanager-change-not-supported": "Navedenih poverilnic nismo mogli spremeniti, saj jih ne bi nič uporabljalo.",
        "authmanager-create-disabled": "Ustvarjanje računov je onemogočeno.",
-       "authmanager-create-from-login": "Da ustvarite svoj račun, prosimo, izpolnite spodnja polja.",
+       "authmanager-create-from-login": "Da ustvarite svoj račun, prosimo, izpolnite polja.",
        "authmanager-create-not-in-progress": "Ustvarjanje računa ni v teku ali pa smo izgubili podatke seje. Prosimo, pričnite znova od začetka.",
        "authmanager-create-no-primary": "Navedenih poverilnic ne moremo uporabiti za ustvarjanje računa.",
        "authmanager-link-no-primary": "Navedenih poverilnic ne moremo uporabiti za povezovanje računa.",
index f13dab3..fe210a8 100644 (file)
        "resetpass_submit": "Постави лозинку и пријави ме",
        "changepassword-success": "Ваша лозинка је успешно промењена!",
        "changepassword-throttled": "Превише пута сте покушали да се пријавите.\nМолимо вас да сачекате $1 пре него што покушате поново.",
+       "botpasswords": "Лозинке ботова",
+       "botpasswords-label-appid": "Име бота:",
        "botpasswords-label-create": "Направи",
+       "botpasswords-label-update": "Ажурирај",
        "botpasswords-label-cancel": "Откажи",
        "botpasswords-label-delete": "Обриши",
+       "botpasswords-label-grants-column": "Одобрено",
        "resetpass_forbidden": "Лозинка не може бити промењена",
        "resetpass-no-info": "Морате бити пријављени да бисте приступили овој страници.",
        "resetpass-submit-loggedin": "Промени лозинку",
        "action-managechangetags": "прављење и (де)активирање ознака",
        "action-applychangetags": "додавање ознака на ваше измене",
        "action-changetags": "додавање и уклањање разних ознака на појединачним изменама и уносима у дневницима",
+       "action-purge": "чишћење привремене меморије ове странице",
        "nchanges": "$1 {{PLURAL:$1|измена|измене|измена}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|измена од ваше последње посете}}",
        "enhancedrc-history": "историја",
        "activeusers-intro": "Ово је списак корисника који су били активни {{PLURAL:$1|1=претходни дан|у последња $1 дана|у последњих $1 дана}}.",
        "activeusers-count": "$1 {{PLURAL:$1|радња|радње|радњи}} {{PLURAL:$3|претходни дан|у последња $3 дана|у последњих $3 дана}}",
        "activeusers-from": "Прикажи кориснике почев од:",
-       "activeusers-hidebots": "Сакриј ботове",
-       "activeusers-hidesysops": "Сакриј администраторе",
        "activeusers-noresult": "Корисник није пронађен.",
        "activeusers-submit": "Прикажи активне кориснике",
        "listgrouprights": "Права корисничких група",
        "modifiedarticleprotection": "промењен степен заштите за „[[$1]]“",
        "unprotectedarticle": "је скинуо заштиту са странице „[[$1]]“",
        "movedarticleprotection": "је преместио подешавања заштите са „[[$2]]“ на „[[$1]]“",
+       "protectedarticle-comment": "{{GENDER:$2|Заштићена}} страница [[$1]]",
+       "modifiedarticleprotection-comment": "{{GENDER:$2|Промењен}} ниво заштите [[$1]]",
+       "unprotectedarticle-comment": "{{GENDER:$2|Скинута}} заштита са [[$1]]",
        "protect-title": "Степен заштите за „$1“",
        "protect-title-notallowed": "Преглед степена заштите за „$1“",
        "prot_1movedto2": "је преместио [[$1]] на [[$2]]",
        "restriction-edit": "уређивање",
        "restriction-move": "премештање",
        "restriction-create": "прављење",
-       "restriction-upload": "Ð\9eтпремање",
+       "restriction-upload": "отпремање",
        "restriction-level-sysop": "потпуно заштићено",
        "restriction-level-autoconfirmed": "полузаштићено",
        "restriction-level-all": "сви нивои",
        "undeletedrevisions": "{{PLURAL:$1|измена враћено}} $1",
        "undeletedrevisions-files": "$1 {{PLURAL:$1|измена|измене|измена}} и $2 {{PLURAL:$2|датотека је враћена|датотеке су враћене|датотека је враћено}}",
        "undeletedfiles": "{{PLURAL:$1|датотека враћено}} $1",
-       "cannotundelete": "Враћање није успело:\n$1",
+       "cannotundelete": "Враћање једне или свих ставник није успјело:\n$1",
        "undeletedpage": "<strong>Страница $1 је враћена</strong>\n\nПогледајте [[Special:Log/delete|дневник брисања]] за записе о скорашњим брисањима и враћањима.",
        "undelete-header": "Погледајте [[Special:Log/delete|историјат брисања]] за недавно обрисане странице.",
        "undelete-search-title": "Претрага обрисаних страница",
        "tooltip-search": "Претрага",
        "tooltip-search-go": "Идите на страницу с овим именом, ако постоји",
        "tooltip-search-fulltext": "Претражите странице с овим текстом",
-       "tooltip-p-logo": "Ð\9fоÑ\81еÑ\82иÑ\82е Ð½Ð°Ñ\81ловну страну",
-       "tooltip-n-mainpage": "Ð\9fоÑ\81еÑ\82иÑ\82е Ð½Ð°Ñ\81ловну страну",
-       "tooltip-n-mainpage-description": "Ð\9fоÑ\81еÑ\82иÑ\82е Ð½Ð°Ñ\81ловну страну",
+       "tooltip-p-logo": "Ð\9fоÑ\81еÑ\82иÑ\82е Ð³Ð»Ð°вну страну",
+       "tooltip-n-mainpage": "Ð\9fоÑ\81еÑ\82иÑ\82е Ð³Ð»Ð°вну страну",
+       "tooltip-n-mainpage-description": "Ð\9fоÑ\81еÑ\82иÑ\82е Ð³Ð»Ð°вну страну",
        "tooltip-n-portal": "О пројекту, шта можете да радите и где да пронађете ствари",
        "tooltip-n-currentevents": "Сазнајте више о текућим догађајима",
        "tooltip-n-recentchanges": "Списак скорашњих измена на викију",
        "pageinfo-robot-index": "Дозвољено",
        "pageinfo-robot-noindex": "Није дозвољено",
        "pageinfo-watchers": "Број надгледача странице",
+       "pageinfo-visiting-watchers": "Број надгледача странице који су посјетили скорашње измјене",
        "pageinfo-few-watchers": "Мање од $1 {{PLURAL:$1|пратиоца|пратилаца}}",
        "pageinfo-redirects-name": "Број преусмерења на ову страницу",
        "pageinfo-subpages-name": "Подстранице ове странице",
        "pageinfo-protect-cascading-yes": "Да",
        "pageinfo-protect-cascading-from": "Странице са преносивом заштитом од",
        "pageinfo-category-info": "Информације о категорији",
+       "pageinfo-category-total": "Укупно",
        "pageinfo-category-pages": "Број страница",
        "pageinfo-category-subcats": "Број поткатегорија",
        "pageinfo-category-files": "Број датотека",
        "mediastatistics-header-total": "Све датотеке",
        "json-error-syntax": "Грешка у синтакси",
        "headline-anchor-title": "Веза до овог одељка",
-       "special-characters-group-latin": "латиница",
+       "special-characters-group-latin": "Ð\9bатиница",
        "special-characters-group-latinextended": "проширена латиница",
        "special-characters-group-ipa": "ИПА",
        "special-characters-group-symbols": "симболи",
        "log-action-filter-upload-upload": "Ново отпремање",
        "log-action-filter-upload-overwrite": "промена постојећег",
        "authmanager-email-label": "Имејл",
-       "authmanager-email-help": "Имејл адреса"
+       "authmanager-email-help": "Имејл адреса",
+       "changecredentials": "Промјена акредитива"
 }
index 35adfeb..6bdd3b5 100644 (file)
        "resetpass_submit": "Postavi lozinku i prijavi me",
        "changepassword-success": "Vaša lozinka je uspešno promenjena.",
        "changepassword-throttled": "Previše puta ste pokušali da se prijavite.\nMolimo vas da sačekate $1 pre nego što pokušate ponovo.",
+       "botpasswords": "Lozinke botova",
        "botpasswords-label-cancel": "Otkaži",
        "botpasswords-label-delete": "Obriši",
        "resetpass_forbidden": "Lozinka ne može biti promenjena",
        "nopagetext": "Tražena stranica ne postoji.",
        "pager-newer-n": "{{PLURAL:$1|noviji 1|novija $1|novijih $1}}",
        "pager-older-n": "{{PLURAL:$1|stariji 1|starijih $1}}",
-       "suppress": "Nadzor",
+       "suppress": "Revizija",
        "querypage-disabled": "Ova posebna stranica je onemogućena radi poboljšanja performansi.",
        "apihelp": "API pomoć",
        "apihelp-no-such-module": "Modul „$1“ nije pronađen.",
        "activeusers-intro": "Ovo je spisak korisnika koji su bili aktivni {{PLURAL:$1|1=prethodni dan|u poslednja $1 dana|u poslednjih $1 dana}}.",
        "activeusers-count": "$1 {{PLURAL:$1|radnja|radnje|radnji}} {{PLURAL:$3|prethodni dan|u poslednja $3 dana|u poslednjih $3 dana}}",
        "activeusers-from": "Prikaži korisnike počev od:",
-       "activeusers-hidebots": "Sakrij botove",
-       "activeusers-hidesysops": "Sakrij administratore",
        "activeusers-noresult": "Korisnik nije pronađen.",
        "activeusers-submit": "Prikaži aktivne korisnike",
        "listgrouprights": "Prava korisničkih grupa",
        "restriction-edit": "uređivanje",
        "restriction-move": "premeštanje",
        "restriction-create": "pravljenje",
-       "restriction-upload": "Otpremanje",
+       "restriction-upload": "otpremanje",
        "restriction-level-sysop": "potpuno zaštićeno",
        "restriction-level-autoconfirmed": "poluzaštićeno",
        "restriction-level-all": "svi nivoi",
        "tooltip-search": "Pretraga",
        "tooltip-search-go": "Idite na stranicu s ovim imenom, ako postoji",
        "tooltip-search-fulltext": "Pretražite stranice s ovim tekstom",
-       "tooltip-p-logo": "Posetite naslovnu stranu",
-       "tooltip-n-mainpage": "Posetite naslovnu stranu",
-       "tooltip-n-mainpage-description": "Posetite naslovnu stranu",
+       "tooltip-p-logo": "Posetite glavnu stranu",
+       "tooltip-n-mainpage": "Posetite glavnu stranu",
+       "tooltip-n-mainpage-description": "Posetite glavnu stranu",
        "tooltip-n-portal": "O projektu, šta možete da radite i gde da pronađete stvari",
        "tooltip-n-currentevents": "Saznajte više o tekućim događajima",
        "tooltip-n-recentchanges": "Spisak skorašnjih izmena na vikiju",
        "pageinfo-robot-index": "Dozvoljeno",
        "pageinfo-robot-noindex": "Nije dozvoljeno",
        "pageinfo-watchers": "Broj nadgledača stranicе",
+       "pageinfo-visiting-watchers": "Broj nadgledača stranice koji su posjetili skorašnje izmjene",
        "pageinfo-few-watchers": "Manje od $1 {{PLURAL:$1|pratioca|pratilaca}}",
        "pageinfo-redirects-name": "Broj preusmerenja na ovu stranicu",
        "pageinfo-subpages-name": "Podstranice ove stranice",
        "mediastatistics-header-total": "Sve datoteke",
        "json-error-syntax": "Greška u sintaksi",
        "headline-anchor-title": "Veza do ovog odeljka",
-       "special-characters-group-latin": "latinica",
+       "special-characters-group-latin": "Latinica",
        "special-characters-group-latinextended": "proširena latinica",
        "special-characters-group-ipa": "IPA",
        "special-characters-group-symbols": "Simboli",
        "randomrootpage": "Slučajna korenska stranica",
        "log-action-filter-upload-upload": "Novo otpremanje",
        "authmanager-email-label": "Imejl",
-       "authmanager-email-help": "Imejl adresa"
+       "authmanager-email-help": "Imejl adresa",
+       "changecredentials": "Promjena akreditiva"
 }
index f54faad..333ab9f 100644 (file)
        "grant-basic": "Grundläggande rättigheter",
        "grant-viewdeleted": "Visa raderade filer och sidor",
        "grant-viewmywatchlist": "Visa din bevakningslista",
+       "grant-viewrestrictedlogs": "Visa begränsade loggposter",
        "newuserlogpage": "Logg över nya användare",
        "newuserlogpagetext": "Detta är en logg över nya användarkonton.",
        "rightslog": "Användarrättighetslogg",
        "booksources-search": "Sök",
        "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.",
+       "magiclink-tracking-rfc": "Sidor som använder magiska RFC-länkar",
+       "magiclink-tracking-rfc-desc": "Denna sida använder magiska RFC-länkar. Se [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] om hur man migrerar.",
+       "magiclink-tracking-pmid": "Sidor som använder magiska PMID-länkar",
+       "magiclink-tracking-pmid-desc": "Denna sida använder magiska PMID-länkar. Se [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] om hur man migrerar.",
+       "magiclink-tracking-isbn": "Sidor som använder magiska ISBN-länkar",
+       "magiclink-tracking-isbn-desc": "Denna sida använder magiska ISBN-länkar. Se [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] om hur man migrerar.",
        "specialloguserlabel": "Utförare:",
        "speciallogtitlelabel": "Mål (titel eller {{ns:user}}:användarnamn för användare):",
        "log": "Loggar",
        "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": "Dölj botar",
-       "activeusers-hidesysops": "Dölj administratörer",
+       "activeusers-groups": "Visa användare som tillhör grupper:",
        "activeusers-noresult": "Inga användare funna.",
        "activeusers-submit": "Visa aktiva användare",
        "listgrouprights": "Behörigheter för användargrupper",
        "modifiedarticleprotection": "ändrade skyddsnivån för \"[[$1]]\"",
        "unprotectedarticle": "tog bort skrivskydd från \"[[$1]]\"",
        "movedarticleprotection": "flyttade skrivskyddsinställningar från \"[[$2]]\" till \"[[$1]]\"",
+       "protectedarticle-comment": "{{GENDER:$2|Skyddad}} \"[[$1]]\"",
+       "modifiedarticleprotection-comment": "{{GENDER:$2|Ändrade skyddsnivå}} för \"[[$1]]\"",
+       "unprotectedarticle-comment": "{{GENDER:$2|Tog bort skydd}} från \"[[$1]]\"",
        "protect-title": "Ändra skrivskyddsnivå för \"$1\"",
        "protect-title-notallowed": "Visa skyddsnivån för \"$1\"",
        "prot_1movedto2": "[[$1]] flyttades till [[$2]]",
index 3685734..70344cf 100644 (file)
        "yourpasswordagain": "Naszkryflej ausdruk zaś",
        "createacct-yourpasswordagain": "Potwjyrdź hasło",
        "createacct-yourpasswordagain-ph": "Wszkryflej hasło jeszcze roz",
-       "remembermypassword": "Pamjyntej můj ausdruk na tym kůmputrze (nojdalij bez $1 {{PLURAL:$1|dźyń|dńůw}})",
        "userlogin-remembermypassword": "Ńy wylogůwywuj mje",
        "userlogin-signwithsecure": "Użyj bezpjecznygo połůnczyńa",
        "yourdomainname": "Twoja domyna",
        "listusersfrom": "Pokaž užytkowńikůw začynojůnc uod:",
        "listusers-submit": "Uobejrzij",
        "listusers-noresult": "Ńy znejdźůno žodnygo užytkowńika.",
-       "activeusers-hidebots": "Schrůń boty",
-       "activeusers-hidesysops": "Schrůń adminy",
        "activeusers-noresult": "Niy szło znŏjść żŏdnych używŏczōw",
        "listgrouprights": "Uprawńyńo grup użytkowńikůw",
        "listgrouprights-summary": "Půńiży znojdowo śe spis grup użytkowńikůw zdefińjowanych na tyj wiki, s wyszczygůlńyńym przidźelůnych im prow dostympu.\nSprowdź zajta [[{{MediaWiki:Listgrouprights-helppage}}|s dodatkowymi informacjami]] uo uprowńyńach użytkowńikůw.",
        "logentry-upload-upload": "$1 {{GENDER:$2|posłoł|posłała}} $3",
        "rightsnone": "podstawowo",
        "revdelete-summary": "uopis pomjyńań",
-       "searchsuggest-search": "Sznupej",
+       "searchsuggest-search": "Sznupej we {{SITENAME}}",
        "expand_templates_ok": "OK"
 }
index b75ade0..3ec4110 100644 (file)
@@ -24,7 +24,8 @@
                        "아라",
                        "Macofe",
                        "Matma Rex",
-                       "WP MANIKHANTA"
+                       "WP MANIKHANTA",
+                       "SrihariThalla"
                ]
        },
        "tog-underline": "లంకె క్రీగీత:",
        "badsig": "సంతకం చెల్లనిది.\nHTML ట్యాగులను ఒకసారి సరిచూసుకోండి.",
        "badsiglength": "మీ సంతకం చాలా పెద్దగా ఉంది.\nఇది తప్పనిసరిగా $1 {{PLURAL:$1|అక్షరం|అక్షరాల}} లోపులోనే ఉండాలి.",
        "yourgender": "మిమ్మల్ని మీరు ఎలా వర్ణించుకుంటారు?",
-       "gender-unknown": "సాఫà±\8dà°\9fà±\81à°µà±\87à°°à±\81 à°®à°¿à°®à±\8dమలà±\8dని à°¸à°\82à°¬à±\8bధిà°\82à°\9aà±\87à°ªà±\8dà°ªà±\81à°¡à±\81, à°µà±\80à°²à±\88à°¨à°\82తవరà°\95à±\81 à°²à°¿à°\82à°\97 à°¤à°\9fà°¸à±\8dథతనà±\81 à°\85వలà°\82à°¬ిస్తుంది",
+       "gender-unknown": "సాఫà±\8dà°\9fà±\81à°µà±\87à°°à±\81 à°®à°¿à°®à±\8dమలà±\8dని à°¸à°\82à°¬à±\8bధిà°\82à°\9aà±\87à°\9fà°ªà±\8dà°ªà±\81à°¡à±\81, à°µà±\80à°²à±\88à°¨à°\82తవరà°\95à±\81 à°²à°¿à°\82à°\97 à°¤à°\9fà°¸à±\8dథతనà±\81 à°ªà°¾à°\9fిస్తుంది",
        "gender-male": "అతను వికీ పేజీలను సరిదిద్దుతాడు",
        "gender-female": "ఆమె వికీ పేజీలను సరిదిద్దుతుంది",
        "prefs-help-gender": "ఈ అభిరుచిని అమర్చుకోవడం ఐచ్చికం.\nమిమ్మల్ని సంబోధించేప్పుడూ మిమ్మల్ని పేర్కొనేప్పుడూ వ్యాకరణపరంగా సరైన లింగాన్ని  వాడటానికి ఈ విలువ ఉపయోగపడుతుంది.\nఈ సమాచారం బహిరంగం.",
        "activeusers-intro": "ఇది గత $1 {{PLURAL:$1|రోజులో|రోజులలో}} ఏదైనా కార్యకలాపం చేసిన వాడుకరుల జాబితా.",
        "activeusers-count": "గడచిన {{PLURAL:$3|ఒక రోజు|$3 రోజుల}}లో $1 {{PLURAL:$1|చర్య|చర్యలు}}",
        "activeusers-from": "వాడుకరులను ఇక్కడ నుండి చూపించు:",
-       "activeusers-hidebots": "బాట్లను దాచు",
-       "activeusers-hidesysops": "నిర్వాహకులను దాచు",
        "activeusers-noresult": "వాడుకరులెవరూ లేరు.",
        "activeusers-submit": "చేతనంగా ఉన్న వాడుకరులను చూపించు",
        "listgrouprights": "వాడుకరి గుంపుల హక్కులు",
index b3fc2ca..d8af709 100644 (file)
@@ -45,7 +45,7 @@
        "tog-enotifminoredits": "Padalhan din ako ng e-liham para sa mga maliliit na mga pagbabago ng mga pahina at mga talaksan",
        "tog-enotifrevealaddr": "Ipakita ang aking direksiyong e-liham sa loob ng mga e-liham ng pagpapahayag",
        "tog-shownumberswatching": "Ipakita ang bilang ng mga nagbabantay na tagagamit",
-       "tog-oldsig": "Umiiral na lagda:",
+       "tog-oldsig": "Ang iyong umiiral na lagda:",
        "tog-fancysig": "Ituring ang lagda bilang teksto ng wiki (walang automatikong pagkawing)",
        "tog-uselivepreview": "Gamitin ang buhay na paunang tingin",
        "tog-forceeditsummary": "Pagsabihan ako kapag nagpapasok ng walang-lamang buod ng pagbabago",
        "resetpass_submit": "Itakda ang password at mag-login",
        "changepassword-success": "Matagumpay na nabago ang iyong password!",
        "changepassword-throttled": "Masyadong madami ang kamakailan lamang mong pagsubok sa pag-login.\nMaghintay po muna ng $1 bago subukan uli.",
+       "botpasswords-label-delete": "Burahin",
+       "botpasswords-label-resetpassword": "Itakdang-muli/baguhin ang hudyat (password)",
+       "botpasswords-label-grants-column": "Ipinagkaloob na",
        "resetpass_forbidden": "Hindi mababago ang mga password",
        "resetpass-no-info": "Nakalagda ka dapat para tuwirang mapuntahan ang pahina ito.",
        "resetpass-submit-loggedin": "Baguhin ang password",
        "activeusers-intro": "Isa itong talaan ng mga tagagamit na nagkaroon ng ilang uri ng galaw sa loob ng huling $1 {{PLURAL:$1|araw|mga araw}}.",
        "activeusers-count": "$1 {{PLURAL:$1|pagbabago|mga pagbabago}} sa loob ng huling {{PLURAL:$3|araw|$3 mga araw}}",
        "activeusers-from": "Ipakita ang mga tagagamit simula sa:",
-       "activeusers-hidebots": "Itago ang mga bots",
-       "activeusers-hidesysops": "Itago ang mga tagapangasiwa",
        "activeusers-noresult": "Walang natagpuang mga tagagamit.",
        "listgrouprights": "Mga uri ng tagagamit",
        "listgrouprights-summary": "Ang sumusunod ay isang talaan ng mga pangkat ng tagagamit na binigyang kahulugang sa wiking ito, kasama ang kanilang mga kaugnay na mga karapatan.\nMaaaring may mga [[{{MediaWiki:Listgrouprights-helppage}}|karagdagang kabatiran]] tungkol sa bawat isang mga karapatan sa [[{{MediaWiki:Listgrouprights-helppage}}]].",
index 7b76fa7..735038a 100644 (file)
@@ -95,7 +95,7 @@
        "tog-hideminor": "Son değişiklikler sayfasında küçük değişiklikleri gizle",
        "tog-hidepatrolled": "Son değişikliklerde devriye görmüş değişiklikleri gizle",
        "tog-newpageshidepatrolled": "Yeni sayfalar listesinde, devriye görmüş sayfaları gizle",
-       "tog-hidecategorization": "Sayfa kategorilendirmesni gizle",
+       "tog-hidecategorization": "Sayfa kategorilendirmesini gizle",
        "tog-extendwatchlist": "İzleme listesini sadece en son değil, tüm değişiklikleri göstermek üzere genişlet",
        "tog-usenewrc": "Son değişiklikler sayfasındaki ve izleme listesindeki değişiklikleri sayfalara gruplandır",
        "tog-numberheadings": "Başlıkları otomatik numaralandır",
        "tog-watchlistreloadautomatically": "Filtre değiştiğinde izleme listesini otomatik yenile (JavaScript gerekir)",
        "tog-watchlisthideanons": "İzleme listemde, anonim kullanıcılar tarafından yapılan değişiklikleri gizle",
        "tog-watchlisthidepatrolled": "İzleme listesinde, devriye görmüş değişiklikleri gizle",
-       "tog-watchlisthidecategorization": "Sayfa kategorilendirmesni gizle",
+       "tog-watchlisthidecategorization": "Sayfa kategorilendirmesini gizle",
        "tog-ccmeonemails": "Diğer kullanıcılara gönderdiğim e-postaların bir kopyasını bana da gönder",
        "tog-diffonly": "Sayfa içeriğini, sürüm farklarının altında gösterme",
        "tog-showhiddencats": "Gizli kategorileri göster",
        "activeusers-intro": "Bu, son $1 {{PLURAL:$1|günde|günde}} bir çeşit etkinlik göstermiş kullanıcıların listesidir.",
        "activeusers-count": "Son {{PLURAL:$3|günde|$3 günde}} $1 {{PLURAL:$1|eylem|eylem}}",
        "activeusers-from": "Şununla başlayan kullanıcıları görüntüle:",
-       "activeusers-hidebots": "Botları gizle",
-       "activeusers-hidesysops": "Yöneticileri gizle",
        "activeusers-noresult": "Kullanıcı bulunamadı.",
        "listgrouprights": "Kullanıcı grubu hakları",
        "listgrouprights-summary": "Aşağıdaki bu vikide tanımlanan kullanıcı gruplarının, ilgili erişim haklarıyla birlikte listesidir.\nBireysel haklarla ilgili [[{{MediaWiki:Listgrouprights-helppage}}|daha fazla bilgi]] olabilir.",
index 7bff7f2..5ced470 100644 (file)
@@ -6,26 +6,46 @@
                        "Udmwiki",
                        "ОйЛ",
                        "לערי ריינהארט",
-                       "TMg"
+                       "TMg",
+                       "AlnashPiyash2",
+                       "Irus",
+                       "Shklyaev",
+                       "Wadorgurt"
                ]
        },
-       "tog-underline": "Линкъёс ултӥз гожен сызоно",
-       "tog-hideminor": "Берпуметӥ тупатонъёслэн списоксэс ичи воштонъёстэк возьматыны",
-       "tog-hidepatrolled": "Берпуметӥ тупатонъёслэн списоксэс партрулировать каремын воштонъёстэк возьматыны",
-       "tog-newpageshidepatrolled": "Выль бамъёслэн списоксэс партрулировать каремын бамъёстэк возьматыны",
+       "tog-underline": "Чӧлсконъёсыз ултӥз гожен сызоно",
+       "tog-hideminor": "Выль тупатонъёслэн списоксэс ичи воштонъёстэк возьматыны",
+       "tog-hidepatrolled": "Выль тупатонъёслэн списоксэс эскерем воштонъёстэк возьматыны",
+       "tog-newpageshidepatrolled": "Выль бамъёслэн списоксэс эскерем бамъёстэк возьматыны",
+       "tog-hidecategorization": "Бамъёслэсь категоризацизэс ватыны",
        "tog-extendwatchlist": "Чаклан списокын вань тупатонъёсты возьматыны (озьытэк берпуметӥоссэс гинэ)",
        "tog-usenewrc": "Выль тупатонъёслэсь списоксэс умояллям сямен возьматыны (JavsScript кулэ)",
        "tog-numberheadings": "Заголовокъёсты автоматически нумеровать карыны",
-       "tog-showtoolbar": "Тупатон тӥрлыкъёслэн панельзэс возьматыны (JavaScript кулэ)",
+       "tog-showtoolbar": "Тупатон тӥрлыкъёслэн панельзэс возьматыны",
        "tog-editondblclick": "Бамъёсты шырлэсь зӥбонзэ кык пол зӥбыса тупатыны (JavaScript кулэ)",
        "tog-editsectiononrightclick": "Cекциолэсь заголовок вылазы шырлэн бур кнопкаеныз зӥбыса тупатонзэс лэзьыны (JavaScript кулэ)",
        "tog-watchcreations": "Мынэсьтым кылдытэм бамъёсме но ӝуткам файлъёсме чаклан списокам пыртыны",
        "tog-watchdefault": "Мынэсьтым тупатэм бамъёсме но файлъёсме чаклан списокам пыртыны",
        "tog-watchmoves": "Мынэсьтым мукет интые выжтэм бамъёсме но файлъёсме чаклан списокам пыртыны",
        "tog-watchdeletion": "Мынэсьтым ӵушыса быдтэм бамъёсме но файлъёсме чаклан списоке пыртыны",
+       "tog-watchuploads": "Мынам загрузить карем файлъёсме чаклан списоке пыртыны",
+       "tog-watchrollback": "Чаклан списоке пыртыны бамъёсыз, кудъёсаз мон откат лэсьтӥ",
        "tog-minordefault": "Вань воштонъёсты «ичи воштон» пусэн пусйыны",
        "tog-previewontop": "Утён азьвыл учконлэсь укнозэ тупатон укнолэсь азьвылгес возьматыны",
-       "tog-previewonfirst": "Бам нырысьсэ утиськыкуз уётн азьвыл учконэз возьматыны",
+       "tog-previewonfirst": "Тупатыны кутскыку возьматыны предпросмотрез",
+       "tog-enotifwatchlistpages": "Чаклан списокысь бамъёсыз но файлъёсыз тупатэм сярысь ивортыны электронной почта пыр",
+       "tog-enotifusertalkpages": "Вераськон бамез тупатон сярысь ивортыны электронной почта пыр",
+       "tog-enotifminoredits": "Ивортыны соку но, куке бамын яке файлын ичи воштон лэсьтэмын",
+       "tog-enotifrevealaddr": "Мынэсьтым почта адресме возьматыны ивортӥсь сообщениосын",
+       "tog-shownumberswatching": "Возьматыны викиавторъёслэсь лыдзэс, кудъёсыз бамез чаклан списоке пыртӥзы",
+       "tog-fancysig": "Подписьлэн аслам вики-разметкае (автоматической ӵӧлсконтэк)",
+       "tog-watchlisthideown": "Мынэсьтым тупатонъёсме чаклан списокысь ватыны",
+       "tog-watchlisthidebots": "Чаклан списокысь ватоно ботъёслэсь тупатэмзэс",
+       "tog-watchlisthideminor": "Чаклан списокысь ватоно ичи воштонъёсыз",
+       "tog-watchlisthideliu": "Авторизированной викиавторъёслэсь тупатэмъёссэс чаклан списокысь ватыны",
+       "tog-watchlisthidepatrolled": "Эскерем тупатонъёсыз чаклан списокысь ватыны",
+       "tog-watchlisthidecategorization": "Бамъёслэсь категоризацизэс ватыны",
+       "tog-showhiddencats": "Возьматоно ватэм категориосыз",
        "underline-always": "Котьку",
        "underline-never": "Ноку",
        "underline-default": "Браузерлэсь настройкаоссэ уже кутоно",
@@ -71,7 +91,7 @@
        "september-gen": "куарусёнэ",
        "october-gen": "коньывуонэ",
        "november-gen": "шуркынмонэ",
-       "december-gen": "толсурэ",
+       "december-gen": "толсуре",
        "jan": "тшт",
        "feb": "тпт",
        "mar": "южт",
        "oct": "квт",
        "nov": "шкт",
        "dec": "тст",
+       "january-date": "Толшор $1",
+       "february-date": "Тулыспал $1",
+       "march-date": "Южтолэзь $1",
+       "april-date": "Ожтолэзь $1",
+       "may-date": "Куартолэзь $1",
+       "june-date": "Инвожо $1",
+       "july-date": "Пӧсьтолэзь $1",
+       "august-date": "Гудырикошкон $1",
+       "september-date": "Куарусён $1",
+       "october-date": "Коньывуон $1",
+       "november-date": "Шуркынмон $1",
+       "december-date": "Толсур $1",
        "pagecategories": "{{PLURAL:$1|1=Категория|Категориос}}",
        "category_header": "«$1» категориысь бамъёс",
        "subcategories": "Подкатегориос",
        "category-empty": "''Та категориын али бамъёс но, файлъёс но ӧвӧл.''",
        "hidden-categories": "{{PLURAL:$1|1=Ватэм категория|Ватэм категориос}}",
        "hidden-category-category": "Ватэм категориос",
-       "category-subcat-count": "{{PLURAL:$2|1=Со категориын одӥг подкатегория гинэ.|Возьматэмын $1 подкатегория $2 пӧлысь.}}",
-       "category-subcat-count-limited": "Со категориын $1 подкатегория.",
-       "category-article-count": "{{PLURAL:$2|1=Со категориын одӥг бам гинэ.|Возьматэмын $1 бам $2 пӧлысь.}}",
-       "category-article-count-limited": "Со категориын $1 бам.",
-       "category-file-count": "{{PLURAL:$2|1=Со категориын одӥг файл гинэ.|Возьматэмын $1 файл $2 пӧлысь.}}",
-       "category-file-count-limited": "Со категориын $1 файл.",
+       "category-subcat-count": "{{PLURAL:$2|1=Со категориын одӥг подкатегория гинэ.|Возьматэмын $1 {{PLURAL:$1|подкатегория|подкатегориос}} $2 пӧлысь.}}",
+       "category-subcat-count-limited": "Со категориын {{PLURAL:$1|$1 подкатегория}}.",
+       "category-article-count": "{{PLURAL:$2|1=Со категориын одӥг бам гинэ.|Возьматэмын {{PLURAL:$1|$1 бам}} $2 пӧлысь.}}",
+       "category-article-count-limited": "Со категориын {{PLURAL:$1|$1 бам}}.",
+       "category-file-count": "{{PLURAL:$2|1=Со категориын одӥг файл гинэ.|Возьматэмын {{PLURAL:$1|$1 файл}} $2 пӧлысь.}}",
+       "category-file-count-limited": "Со категориын {{PLURAL:$1|$1 файл}}.",
        "listingcontinuesabbrev": "азьлань",
        "index-category": "Индексировать кароно бамъёс",
        "noindex-category": "Индексировать каронтэм бамъёс",
        "about": "Та сярысь",
        "article": "Статья",
-       "mypage": "Ас бам",
+       "cancel": "Берытсконо",
+       "mypage": "Бам",
        "mytalk": "Викиавтор сярысь вераськон",
-       "anontalk": "Со IP-адрес сярысь вераськон",
+       "anontalk": "Сярысь вераськон",
        "navigation": "Навигация",
+       "and": "&#32;но",
+       "qbfind": "Утчан",
+       "qbbrowse": "Учкыны",
+       "qbedit": "Тупатыны",
        "qbpageoptions": "Бамлэн настройкаосыз",
        "faq": "Юан-веран",
        "faqpage": "Project:Юан-веран",
+       "variants": "Вариантъёс",
+       "navigation-heading": "Навигация",
        "errorpagetitle": "Янгыш",
+       "returnto": "Берыктон борды бам $1.",
        "tagline": "{{SITENAME}}-ысь материал",
        "help": "Валэктонъёс",
        "search": "Утчан",
        "searchbutton": "Утчано",
+       "go": "Мыноно",
        "searcharticle": "Мыноно",
        "history": "Бамлэн историез",
        "history_short": "история",
+       "updatedmarker": "воштӥськемын мынам берпуметӥ пыраме бере",
        "printableversion": "Печатламон версия",
        "permalink": "Ӵапак та версиезлы линк",
        "print": "Печатлано",
+       "view": "Учкон",
+       "view-foreign": "$1 сайтын учконы",
        "edit": "тупатыны",
+       "create": "Кылдытоно",
+       "editthispage": "Та бамез тупатыны",
+       "create-this-page": "Та бамез кылдытыны",
        "delete": "Быдтыны",
+       "deletethispage": "Та бамез быдтыны",
+       "undeletethispage": "Та бамез быдтыны",
        "protect": "Утьыны",
+       "protect_change": "воштыны",
+       "protectthispage": "Та бамез утьыны",
+       "unprotect": "Утемез воштыны",
+       "unprotectthispage": "Та бамлэсь утемзэ воштыны",
+       "newpage": "Выль бам",
+       "talkpage": "Та бам сярысь вераськыны",
        "talkpagelinktext": "Вераськон",
+       "specialpage": "Ваньмыз панель",
+       "personaltools": "Нимаз тӥрлыке",
+       "articlepage": "Статьяез учкыны",
        "talk": "Вераськон",
+       "views": "Учконъёс",
        "toolbox": "Тӥрлык",
+       "userpage": "Викиавторлэсь бамзэ учкыны",
+       "templatepage": "Шаблонлэсь бамзэ учкыны",
+       "categorypage": "Категорилэсь бамзэ учкыны",
+       "viewtalkpage": "Вераськонэз учкыны",
+       "otherlanguages": "Мукет кылъёсын",
+       "redirectedfrom": "(Перенаправлять $1)",
+       "redirectpagesub": "Выжытон бам",
+       "redirectto": "Выжытон:",
+       "lastmodifiedat": "Та бамлэн берпуметӥ воштонэз: $2, $1.",
+       "protectedpage": "Утем бам",
+       "jumpto": "Выжон:",
        "jumptonavigation": "навигация",
        "jumptosearch": "утчан",
+       "pool-errorunknown": "Тодмотэм янгыш",
+       "aboutsite": "{{SITENAME}} сярысь",
+       "aboutpage": "Project:Описание",
+       "copyright": "Пуштрос $1 лицензияя луэ ярамон (мукетыз валэктэмын ӧвӧл дыръя).",
+       "copyrightpage": "{{ns:project}}:Автор праваос",
        "currentevents": "Выль иворъёс",
        "currentevents-url": "Project:Выль иворъёс",
+       "disclaimers": "Кыл кутыны пумит луон",
+       "disclaimerpage": "Project:Кыл кутыны пумит луон",
+       "helppage-top-gethelp": "Юрттэт",
        "mainpage": "Кутскон бам",
        "mainpage-description": "Кутскон бам",
        "portal": "Сообщество",
        "portal-url": "Project:Портал сообщества",
+       "privacy": "Конфиденциальностья политика",
+       "privacypage": "Project:Конфиденциальностья политика",
+       "badaccess": "Янгышъёс юаське",
+       "badaccess-group0": "Быдэстэм ужез тонэ уг лэзьы, кин тонэ курозы.",
+       "badaccess-groups": "Ужъёсын но, кудаз тӥледыз курисько поциент {{PLURAL:$2|туркым|группа одӥг}}: $1.",
+       "versionrequired": "MediaWiki доллар кулэ версия $1",
+       "ok": "OK",
        "retrievedfrom": "«$1»-лэсь басьтэмын",
        "editsection": "тупатыны",
+       "editold": "тупатыны",
+       "viewsourceold": "кодзэ учкыны",
+       "editlink": "тупатыны",
+       "viewsourcelink": "кодзэ учкыны",
        "editsectionhint": "$1 секциез тупатоно",
+       "toc": "Пуштрос",
        "showtoc": "возьматоно",
        "hidetoc": "ватоно",
+       "collapsible-collapse": "ватоно",
+       "collapsible-expand": "возьматоно",
+       "confirmable-yes": "Мед",
+       "confirmable-no": "Ӧвӧл",
+       "viewdeleted": "Учкыны $1",
        "site-rss-feed": "$1 — RSS-лента",
        "site-atom-feed": "$1 — Atom-лента",
+       "page-atom-feed": "«$1» Атом-лента",
        "red-link-title": "$1 (со бам ӧвӧл на)",
+       "nstab-main": "Бам",
        "nstab-user": "Викиавтор",
+       "nstab-media": "Мультимедиа",
+       "nstab-special": "Ваньмыз панель",
+       "nstab-project": "Проект сярысь",
+       "nstab-image": "Файл",
        "nstab-mediawiki": "Ивортон",
+       "nstab-template": "Шаблон",
+       "nstab-help": "Валэктон",
+       "nstab-category": "Категория",
+       "mainpage-nstab": "Кутскон бам",
+       "error": "Янгыш",
+       "databaseerror-query": "Курон: $1",
+       "databaseerror-function": "Функция: $1",
+       "databaseerror-error": "Янгыш: $1",
        "viewsource": "Кодзэ учкыны",
-       "login": "Пырон",
+       "viewsource-title": "Кодзэ учкыны бам $1",
+       "actionthrottled": "Кекатыны ужъёс",
+       "actionthrottledtext": "Ужрадлэн ӟечлыкез злоупотребление-нюръяськон, та ужрад тӥ понна укыр трос поллы сюбегамын быдэстон вакчи дыр кусыпъёс, лимитъёс, та тӥляд но тубе.\nПожалуйста, кӧня ке минут ортчыса, нош ик утчасько.",
+       "protectedpagetext": "Та бамез утьыны луэ шуыса, яке мукет уже предотвращать редактировать карон.",
+       "viewsourcetext": "Та бамез учкыны быгатӥськоды тӥ но потон кӧчыро.",
+       "viewyourtext": "Ошмес но, тонэ учкыны быгатӥськоды кӧчырыны <strong>тон шонертон</strong> та бамам.",
+       "protectedinterface": "Та текст бам вайытиськом, та программаын вики интерфейсъёс, но дурбасьтэ, мед злоупотребление предотвращать.\nВика ватсаса, ваньзэ воштыны яке берыктон понна, пожалуйста, [https://translatewiki.net/ translatewiki.net] MediaWiki локализация проект.",
+       "editinginterface": "<strong>Юа:</strong> редактировать карыны бамзэ тон, программное обеспечение понна со интерфейс текстовые кылдытон понна кутыны.\nТа викилэн мукет бамаз луись туссэ воштон понна та интерфейсэз пользователь пользовательский педпал быгатонлыкъёссэс.",
+       "namespaceprotected": "Тон дорын редактировать карыны бам ӧвӧл юаське <кужмо>$1</strong> инты нимъёс.",
+       "exception-nologin": "Тон эн тусбуяськыны сӧзнэтэз",
+       "logouttext": "<strong>Тон али потэ.</strong>\n\nУчком, мар быгатозы бам куд-ог сямъёсты тӥледыз кадь возьматӥсько ке луысал, азьвыл сямен азьвыл системая пыртэмын, тон ӧд сузя, дыр кеш браузер.",
+       "welcomeuser": "Гажаса-а, $1!",
+       "welcomecreation-msg": "Тӥляд гожъямъёсты учётной кылдытэмын вал.\nТӥ быгатӥськоды воштэ {{SITENAME}} [[Special:Preferences|параметръёсты]] ке потэ тӥледлы.",
+       "yourname": "Пырон ним:",
+       "userlogin-yourname": "Пырон ним:",
+       "createacct-another-username-ph": "Учётной книга нимъёс пыртэмын",
+       "yourpassword": "Лушкемкыл:",
+       "userlogin-yourpassword": "Лушкемкыл",
+       "createacct-yourpasswordagain": "Пароль юнматэ",
+       "userlogin-remembermypassword": "Кылем сӧзнэтэз",
+       "cannotcreateaccount-title": "Уг быгатиськы гожъян кылдӥз учётной",
+       "yourdomainname": "Тӥ доменэн:",
+       "login": "Пырыны",
        "nav-login-createaccount": "Нимдэс вераны / Регистрациез ортчытыны",
-       "userlogin": "РегиÑ\81Ñ\82Ñ\80аÑ\86иез Ð¾Ñ\80Ñ\82Ñ\87Ñ\8bÑ\82Ñ\8bнÑ\8b Ñ\8fке Ð\92икипедие Ð¿Ñ\8bÑ\80ыны",
-       "userloginnocreate": "Пырон",
+       "userlogin": "Ð\9dимдÑ\8dÑ\81 Ð²ÐµÑ\80анÑ\8b / Ð ÐµÐ³Ð¸Ñ\81Ñ\82Ñ\80аÑ\86иез Ð¾Ñ\80Ñ\82Ñ\87Ñ\8bÑ\82ыны",
+       "userloginnocreate": "Пырыны",
        "logout": "Кошкыны",
-       "userlogout": "Кошкыны",
+       "userlogout": "Потыны",
+       "notloggedin": "Тон эн тусбуяськыны сӧзнэтэз",
+       "nologin": "Учётной книга ӧвӧл-а? $1.",
+       "nologinlink": "Выль вики-авторлэн регистрациез",
        "createaccount": "выль вики-авторлэн регистрациез",
+       "gotaccountlink": "Пырыны",
+       "userlogin-resetpassword-link": "Тӥлесьтыд парольдэс куштыны?",
+       "userlogin-helplink2": "Пыронъя юрттэт",
+       "createacct-emailrequired": "Электронной почталэн адресэз",
+       "createacct-emailoptional": "Электронной почтаезлэн адресэз (необязательное)",
+       "createaccountmail": "Адрес электронной почта огдырлы кутӥ вылын возьматэм образъёсыныз но соослэн случайной сгенерировать пароль ыстыны",
+       "createacct-submit": "Выль вики-авторлэн регистрациез",
+       "createacct-another-submit": "Выль вики-авторлэн регистрациез",
+       "loginerror": "Янгышъёс пырон",
+       "createacct-error": "Янгышъёс бордын учётной книга кылдытыны",
+       "createaccounterror": "Уг быгатиськы гожъян учётной кылдоз: $1",
+       "nocookiesnew": "Книга кылдытыны учётной пользователь вал, нош система тон уд пыры.\n{{SITENAME}} пользователь cookies пырон понна кутыны.\nDisconnect cookies тонэ дорам.\nПожалуйста, со гожтӥське, нош собере выльысь пырыны логин но пароль.",
+       "nocookieslogin": "{{SITENAME}} пользователь cookies пырон понна кутыны.\nDisconnect cookies тонэ дорам.\nПожалуйста, соосты утчано, выльысь гожтыны.",
+       "blocked-mailpassword": "Тон IP-адрес заблокировать-ысь редактировать карон. Злоупотребление предотвращение понна, та понна кутыны ӧз лэзиське пароль-ысь восстановление IP-адрес.",
+       "loginlanguagelabel": "Кыл: $1",
+       "pt-login": "Пырыны",
+       "pt-login-button": "Пырыны",
+       "pt-createaccount": "Выль вики-авторлэн регистрациез",
+       "pt-userlogout": "Потыны",
+       "oldpassword": "Вуж лушкемкыл:",
+       "newpassword": "Выль лушкемкыл:",
+       "passwordreset-username": "Пырон ним:",
        "summary": "Мар но малы тупатэмын? (вакчияк):",
        "minoredit": "Ичи воштон",
-       "noarticletext": "В настоящий момент текст на данной странице отсутствует.\nВы можете [[Special:Search/{{PAGENAME}}|найти упоминание данного названия]] на других страницах,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} найти соответствующие записи журналов],\nили '''[{{fullurl:{{FULLPAGENAME}}|action=edit}} создать страницу с таким названием]'''</span>.",
+       "watchthis": "Та бамез чаклан списоке пыртыны",
+       "savearticle": "Бамез гожтоно",
+       "preview": "Бамез эскерон",
+       "showpreview": "Бамез эскерон",
+       "showdiff": "Пыртэм воштонъёс",
+       "blockedtitle": "Заблокировать пыриськисьёс",
+       "blockedtext": "<strong>Книгае яке учётной IP-адрес заблокирован.</strong>\n\nБлокировка администратор потӥз $1.\nВозьмалэ вуоно мугез: \"\"$2\"\".\n\n* Кутскон блокировка: $8\n* Блокировка ортчиз: $6\n* Блокировка меретъёсыз: $7\n\nБыгатӥськод-а тон герӟаськемын $1 яке мукет котькудӥныз [[{{MediaWiki:Grouppage-sysop}}|администраторъёс]], блокировка мед эскерозы.\nУчком, мар кутыны уг быгато функцизэс \"гожтэт\", ас ке [[Special:Preferences|настройка персональной]] зуркатӥсь яке электронной почтаезлэн адресэз эн чуртна уг корректный, яке гожтӥськод ке, гожтэт ыстон укшась блокировка алон.\nТон IP-адрес — $3, блокировка идентификаторлэн — $5.\nПожалуйста, аслэсьтым тодон-та вазиськонэз котьку возьмано.",
+       "autoblockedtext": "Тон IP-адрес, герӟет автоматически заблокирован а со, мар солэн кутыны луоно азьвыл кин ке но пырисьёс пӧлысь, заблокирован {{GENDER:$4|участник|куакеч}} $1. \nБлокировка возьмано луоз вуоно мугез:\n\n: \"$2\" - лы.\n\n* Кутскон блокировка: $8\n* Блокировка ортчиз: $6\n* Блокировка меретъёсыз: $7\n\nБыгатӥськод-а тон герӟаськемын $1 яке мукет котькудӥныз [[{{MediaWiki:Grouppage-sysop}}|администраторъёс]], блокировка мед эскерозы.\n\nУчком, мар кутыны уг быгато функцизэс \"гожтэт\", ас ке [[Special:Preferences|настройка персональной]] зуркатӥсь яке электронной почтаезлэн адресэз эн чуртна уг корректный, яке гожтӥськод ке, гожтэт ыстон укшась блокировка алон.\n\nТон IP-адрес — $3, блокировка идентификаторлэн — #$5.\nПожалуйста, аслэсьтым тодон-та вазиськонэз котьку возьмано.",
+       "blockednoreason": "мугезлы эн возьмалэ",
+       "whitelistedittext": "Тон кулэ $1 бам воштон понна.",
+       "loginreqtitle": "Авторизация кулэ",
+       "loginreqlink": "пырыны",
+       "loginreqpagetext": "Тон кулэ $1-ысь, сое мукет бамез учкыны шуыса.",
+       "newarticletext": "Тон бам ссылкаос вылэ выжыса, со кема уз улы.\nСоос мед кылдозы, текст бичась укноос, улазы интыяськемын (умой-умой см. [$1 бам справочной]).\nЯнгыш-а тон татын луысалыд ке, кнопказэ зӥбиз гинэ <strong>берлань</strong> асьтэлэсь браузеръёстэс.",
+       "noarticletext": "Али дыре та бамын текст ӧвӧл. \nТӥ быгатоды [[Special:Search/{{PAGENAME}}|шедьтыны со сярысь кыӵе ке ивор]] мукет бамъёсысь,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} шедьтыны журналъёсысь гожъямъёсыз], \nяке [{{fullurl:{{FULLPAGENAME}}|action=edit}} сыӵе нимын бам кылдытыны]</span>.",
+       "noarticletext-nopermission": "Али дыре та бам вылын кылкуэт ӧвӧл.\nТон быгатӥськод [[Special:Search/{{PAGENAME}}|сётэм йыръянъёс шедьто упоминание]] мукет бам вылын,\nяке <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} соответствующий журнал книгаез шедьтыны].</span> Тӥ дорын сётӥське юаськыны кылдӥз бам ӧвӧл.",
+       "blocked-notice-logextract": "Пользователь заблокирован сётӥз та учырлы.\nСправка понна радъяськылӥсь журнал блокировка лапег берпуметӥ гожтэт:",
+       "continue-editing": "Тупатъянэз азьланьтоно",
+       "editing": "Тупатон: $1",
+       "editingsection": "Тупатон: $1 (люкет)",
+       "template-protected": "(утемын)",
+       "template-semiprotected": "(полузащищенный)",
+       "nocreatetext": "Та сайтлэн бамаз выль сюбегатэм луонлыкъёсын кылдытон.\nТон улыса, берлань вуэ быгатэ бам отредактировать, [[Special:UserLogin|тусбуяськыны книгае яке выль система кылдыто учётной]].",
+       "nocreate-loggedin": "Тон доразы юаськыны кылдӥз выль бам ӧвӧл.",
+       "permissionserrors": "Янгышъёс юаське",
+       "permissionserrorstext": "Тон дорын разрешенизы ӧвӧлэн, тазэ лэсьтом шуыса, со понна вуоно {{PLURAL:$1|мугез}}:",
+       "permissionserrorstext-withaction": "Правоез ӧвӧл, тон дорын $2 тӥ {{PLURAL:$1/1=мугез вуоно|мугез вуоно}}:",
+       "content-model-wikitext": "викитекст",
+       "undo-summary": "Шонертон вошъян $1, лэсьтӥзы {{GENDER:$2|участник|куакеч}} [[Special:Contributions/$2|$2]] ([[User talk:$2|обс.]])",
+       "cantcreateaccount-text": "Та книгаез кылдытонлы учётной IP-адрес (<strong>$1</strong>) заблокировать луизы [[User:$3|$3]].\n\nМугез, вайиз $3 возьматэ <em>$2</em>",
+       "cantcreateaccount-range-text": "Учётной кылдытон - гожъян IP-адрес диапазонын <strong>$1</strong>, Тон пыриське со IP-адрес (<strong>$4</strong>), заблокировать луизы [[User:$3|$3]].\n\nМугез, вайиз $3 возьматэ <em>$2</em>",
+       "viewpagelogs": "Та бамлы журналъёсыз возьматыны",
+       "revisionasof": "Версия $1",
+       "previousrevision": "← Вужгем",
+       "cur": "али",
+       "last": "азьв.",
+       "history-show-deleted": "Ӵушылэмъёссэ гинэ",
+       "rev-showdeleted": "возьматоно",
+       "revdelete-show-file-submit": "да",
        "revdelete-radio-set": "Ватэм",
        "revdelete-radio-unset": "Адӟымон",
+       "revdelete-reason-dropdown": "*Вӧлскем палэнскон мугъёсты\n** Авторской правоосты тӥян\n** Яке кулэтэм информациез личной комментарий\n** Логин несоответствовать\n** Курла информациез Потенциально",
+       "history-title": "$1 — воштонъёслэн историзы",
+       "lineno": "$1-тӥ чур:",
+       "compareselectedversions": "Быръем версиосыз ӵошатыны",
+       "showhideselectedversions": "Возьматыны/ватыны быръем версиосыз",
+       "editundo": "берытсконо",
        "searchresults": "Шедьтэмын",
-       "search-result-size": "$1 кыл({{PLURAL:$2|1=1 word|$2 words}})",
+       "searchresults-title": "утчан \"$1\"",
+       "prevn": "{{PLURAL:$1|$1-лы}} берлань",
+       "nextn": "{{PLURAL:$1|$1-лы}} азьлань",
+       "shown-title": "Адӟытылоно $1 {{PLURAL:$1|шедьтэмез}} бамлы быдэ",
+       "viewprevnext": "Учкыны ($1 {{int:pipe-separator}} $2) ($3)",
+       "searchprofile-articles": "Валтӥсь бамъёс",
+       "searchprofile-images": "Мультимедиа",
+       "searchprofile-everything": "Котькытын",
+       "searchprofile-advanced": "Паськытатэм",
+       "searchprofile-articles-tooltip": "$1 пушкын утчан",
+       "searchprofile-images-tooltip": "Файлъёсты утчан",
+       "searchprofile-everything-tooltip": "Вань бамъёсэтӥ утчан (вераськон бамъёсты пыртыса)",
+       "search-result-size": "$1 ({{PLURAL:$2|$2 кыл}})",
+       "search-redirect": "($1 бамысь ыстон)",
+       "search-interwiki-more": "(эшшо)",
+       "searchall": "Ваньзэ",
+       "search-nonefound": "Запрослы кельшись шедьтэмъёс ӧвӧл.",
+       "powersearch-toggleall": "Ваньзэ",
+       "powersearch-togglenone": "Номыре",
        "preferences": "настройкаос",
        "mypreferences": "Настройкаос",
        "prefs-watchlist": "Чаклан список",
+       "prefs-editing": "Тупатон",
+       "yourlanguage": "Интерфейслэн кылыз:",
+       "prefs-preview": "Бамез эскерон",
+       "editusergroup": "Группае {{GENDER:$1|пырись}} мукет",
+       "group-autoconfirmed": "Автоподтвержденный пыриськисьёс",
+       "group-bot": "Боты",
+       "group-sysop": "Администраторъёс",
+       "group-all": "(ваньзэ)",
+       "right-read": "лыдӟыны бам",
+       "right-edit": "правка бам",
+       "right-createpage": "бам кылдытон-а, уг-возьматэмзэ эскерон",
+       "right-createtalk": "создание бамлэн обсуждениосаз",
+       "right-createaccount": "выль книга кылдытон пыриськизы учётной",
+       "right-writeapi": "гожтэтъёсты кутон понна API",
+       "right-block": "мукет пыриськисьёслэсь курон-косон вылэ установкаосты редактировать",
+       "newuserlogpage": "Викиавторъёсыз регистрациосын журнал",
+       "action-read": "та лыдӟонъёс бам",
+       "action-edit": "та бамез редактировать",
+       "action-block": "пыриськисьёс та понна луонлыкъёссы сюбегам редактировать",
+       "enhancedrc-history": "история",
        "recentchanges": "Выль тупатонъёс",
+       "recentchanges-legend": "Выль тупатонъёслы настройкаос",
+       "recentchanges-label-newpage": "Та тупатонэн выль бам кылдӥз",
+       "recentchanges-label-minor": "Пичи воштон",
+       "recentchanges-label-bot": "Та тупатонэз кариз бот",
+       "recentchanges-label-unpatrolled": "Та тупатонэз нокин но ӧз эскеры на",
+       "recentchanges-label-plusminus": "Бамлэн быдӟалаез сомында байтъёслы воштӥськиз",
+       "recentchanges-legend-heading": "<strong>Легенда:</strong>",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (озьы ик учке [[Special:NewPages|выль бамъёслы список]])",
+       "recentchanges-submit": "Возьматыны",
+       "rclistfrom": "$3 $2 но табере лэсьтэм воштонъёсыз возьматыны",
+       "rcshowhideminor": "$1 пичи тупатонъёсыз",
+       "rcshowhideminor-show": "Возьматыны",
+       "rcshowhideminor-hide": "Ватыны",
+       "rcshowhidebots": "$1 ботъёсыз",
+       "rcshowhidebots-show": "Возьматыны",
+       "rcshowhideliu": "$1 пырем викиавторъёсыз",
+       "rcshowhideliu-show": "Возьматыны",
+       "rcshowhideliu-hide": "Ватыны",
+       "rcshowhideanons": "$1 пырымтэ викиавторъёсыз",
+       "rcshowhideanons-show": "Возьматыны",
+       "rcshowhideanons-hide": "Ватыны",
+       "rcshowhidepatr-show": "Возьматыны",
+       "rcshowhidemine": "$1 аслэсьтым тупатонъёсме",
+       "rcshowhidemine-show": "Возьматыны",
+       "rcshowhidemine-hide": "Ватыны",
+       "rcshowhidecategorization-show": "Возьматыны",
+       "rcshowhidecategorization-hide": "Ватыны",
+       "rclinks": "Возьматыны $1 берло воштонэз $2 нуналскын<br />$3",
+       "diff": "пӧрт.",
        "hist": "история",
+       "hide": "Ватыны",
+       "show": "Возьматыны",
+       "minoreditletter": "п",
+       "newpageletter": "В",
+       "boteditletter": "б",
+       "rc-change-size-new": "Воштон бере быдӟала: $1 {{PLURAL:$1|байт}}",
+       "newsectionsummary": "/* $1 */ выль тема",
        "recentchangeslinked": "Герӟаськем тупатонъёс",
        "recentchangeslinked-feed": "Герӟаськем тупатонъёс",
        "recentchangeslinked-toolbox": "Герӟаськем тупатонъёс",
+       "recentchangeslinked-summary": "Татын алигес воштэм бамъёс адӟытэмын, кудъёссэ пусъем бам чӧлске (яке кудъёсыз пусъем категорие пыро).\n[[Special:Watchlist|Чаклан списокысьтыды]] бамъёс <strong>адӟиськытэмын</strong>.",
        "upload": "Файл поныны",
+       "uploadnologin": "Тон эн тусбуяськыны сӧзнэтэз",
+       "uploadnologintext": "Тон кулэ $1, медаз загрузка файл сервер.",
+       "uploaddisabled": "Загрузка алӥзы",
+       "copyuploaddisabled": "Загрузка URL disconnect.",
+       "uploaddisabledtext": "Загрузка файл disconnect.",
+       "upload-dialog-button-cancel": "Берытсконо",
+       "nolicense": "Ӧвӧл",
+       "file-anchor-link": "Файл",
+       "filehist": "Файллэн историез",
+       "filehist-help": "Зӥбе дата/дыр шоры, кызьы файл со дырын адӟиськемез учкыны вылысь.",
+       "filehist-current": "алиез",
+       "filehist-datetime": "Дата/дыр",
+       "filehist-thumb": "Миниатюра",
+       "filehist-user": "Викиавтор",
+       "filehist-dimensions": "Быдӟала",
+       "filehist-comment": "Валэктон",
+       "imagelinks": "Файлэз уже кутон",
+       "linkstoimage": "{{PLURAL:$1|$1 бам}} та файлэз чӧлске:",
        "sharedupload": "Та файл — $1-ысь, сое мукет проектъёсын но уже кутыны луэ.",
+       "sharedupload-desc-here": "Та файл — $1-ысь, сое мукет проектъёсын но уже кутыны луэ.\n[$2 Файл гожъясь бамысьтыз] информация адӟытэмын улын.",
        "randompage": "Олокыӵе статья",
-       "nbytes": "$1 байт",
-       "move": "Мукет интые выжтыны",
+       "withoutinterwiki-submit": "Возьматыны",
+       "nbytes": "{{PLURAL:$1|$1 байт}}",
+       "prefixindex-submit": "Возьматыны",
+       "newpages": "Выль бамъёс",
+       "newpages-submit": "Возьматыны",
+       "move": "Нимзэ воштыны",
+       "log": "Журналъёс",
+       "logeventslist-submit": "Возьматыны",
+       "showhideselectedlogentries": "Возьматыны/ватыны быръем журналъёсысь гожъямъёсыз",
+       "checkbox-select": "Бырйыны: $1",
+       "checkbox-all": "Ваньзэ",
+       "checkbox-none": "Номыре",
+       "checkbox-invert": "Воштыны интыен",
+       "allpagessubmit": "Быдэстоно",
+       "categories-submit": "Возьматыны",
+       "sp-deletedcontributions-contribs": "тупатонъёсыз",
+       "listusers-submit": "Возьматыны",
+       "listusers-blocked": "(заблокировать{{GENDER:$1||а}})",
+       "listgrouprights": "Право группае пыриськисьёс",
+       "listgrouprights-summary": "Та группае пырисьёс возьматыны кулэ вики список улӥзы, право соответствующийгес солы возьматоно кариськиз. Оло, ас кожазы ватсаса ивортодэт улыны эрикрадэз сярысь.",
+       "listgrouprights-members": "(список пыриськисьёс)",
+       "emailuser": "Викиавторлы гожтэт",
        "emailmessage": "Ивортон:",
-       "watchlist": "Чаклано статьяос",
+       "watchlist": "Чаклан список",
        "mywatchlist": "Чаклан список",
        "watch": "Чаклано",
        "unwatch": "Чакламысь дугдыны",
-       "mycontris": "Мынам гожтэмъёсы",
-       "whatlinkshere": "Татчы линкъёс",
-       "movearticle": "Статьяез мукет интые выжтыны",
-       "move-watch": "Та бамез чаклан списоке пыртыны",
-       "delete_and_move": "Быдтыны но мукет интые выжтыны",
+       "watchlist-details": "Тӥляд чаклан списокады {{PLURAL:$1|$1 бам}}, вераськон бамъёсыз лыдӟытэк.",
+       "watchlist-submit": "Возьматыны",
+       "watchlist-options": "Чаклан списокез тупатыны",
+       "enotif_reset": "Вань бамъёсыз лыдӟем пусйыны",
+       "historyaction-submit": "Возьматыны",
+       "deletionlog": "палэнэ журнал",
+       "rollbacklink": "ӝог берыктыны",
+       "revertpage": "Откат шонертон [[Special:Contributions/$2|$2]] ([[User talk:$2|обсуждение]]) доры версия [[User:$1|$1]]",
+       "revertpage-nouser": "Откат шонертон (пыриськисьёс ватэм нимъёссы) доры версия {{GENDER:$1|[[User:$1|$1]]}}",
+       "restriction-edit": "Тупатон",
+       "undeletehistory": "Выльысь ке тон бамъёстэ, выльысь историяз луэм воштӥськонъёс вань.\nБӧрысь кылдӥзы выль бамъёс палэнэ кошконо луэ ке, сыӵе ик нимыз, историяз вошъяськонъёс предшествующий выльысь кылдозы.",
+       "undeletehistorynoadmin": "Статьяос палэнтэмын вал. Мугез но палэнэ список пыриды, со статьяе редактировать-озь палэнэгес, зӧк возьматэ. Текст статьяез удаленный администраторъёс гинэ учкыны быгатод.",
+       "invert": "Ватыны быръемез",
+       "blanknamespace": "(Валтӥсез)",
+       "contributions": "{{GENDER:$1|Викиавтор}} гожтэмъёсы",
+       "contributions-title": "$1 викиавтор гожтэмъёсы",
+       "mycontris": "Гожтэмъёс",
+       "nocontribs": "Критерии нокыӵе воштӥськонъёс та соответствующий шедьтыны уг луы.",
+       "sp-contributions-blocklog": "блокировка",
+       "sp-contributions-deleted": "шонертон палэнтыны {{GENDER:$1|участник|куакеч}}",
+       "sp-contributions-blocked-notice": "Пользователь заблокирован сётӥз та учырлы. Справка понна радъяськылӥсь журнал блокировка лапег берпуметӥ гожтэт:",
+       "sp-contributions-blocked-notice-anon": "Со ip-адрес вие заблокировать сётӥзы. Блокировка журналъёсты вайытэк улӥзы берпуметӥ книгаысь:",
+       "whatlinkshere": "Татчы чӧлсконъёс",
+       "block": "Блокировка пыриськисьёс",
+       "blockip": "Заблокировать пыриськисьёс",
+       "ipbreason-dropdown": "* Блокировка мугез кабес\n** Полы информациез оскизы\n** Вордскем палэнэ бам\n** Спам-сайтъя педпал чӧлскон\n** Текстлэсь визьем ватсан/жуг-жаг\n** Кышкытлыклэсь, пыриськыны уйиськон\n** Злоупотребление кӧня ке книга учётной\n** Пыриськисьёслэн нимъёссы пыриськисьёс",
+       "ipboptions": "2 час:2 hours,1 нуналлы:1 day,3 нуналлы:3 days,1 арняезлы:1 week,2 арняяз:2 weeks,1 толэзь:1 month,3 толэзь:3 months,6 толэзь:6 months,1 арлэн:1 year,бессрочно:infinite",
+       "unblocked": "$1 разблокировать",
+       "unblocked-id": "Блокировка $1 басьтоно луиз",
+       "blocklist-target": "Ужпумъёс",
+       "blocklist-reason": "Мугез",
+       "infiniteblock": "бессрочно",
+       "expiringblock": "йылпумъяськиз $1-ысь $2",
+       "anononlyblock": "аноним гинэ",
+       "noautoblockblock": "disconnect автоблокировка",
+       "createaccountblock": "гожъямъёстэс лэзьыны кылдытон учётной",
+       "emailblock": "лэзьымтэ гожтэт ыстон",
+       "blocklist-nousertalk": "тупатъяны ачиз уггес быгаты бамлэн обсуждениосаз",
+       "blocklink": "блокировать карыны",
+       "unblocklink": "разблокировать",
+       "change-blocklink": "блокировка воштыны",
+       "contribslink": "тупатонъёсыз",
+       "autoblocker": "Автоблокировка-со понна, мае тӥ IP-адрес кутыны али \"[[User:$1|$1]]\". \nБлокировка мугез $1: \"$2\"",
+       "blocklogentry": "заблокировать [[$1]] дыр $2 $3",
+       "reblock-logentry": "блокировка воштӥз [[$1]] дыр $2 $3",
+       "blocklogtext": "Блокировка но та журналлэн ужезлы разблокирование пользователь.\nЗаблокировать Автоматически IP-адрес уг возьма.\nПроизведениосыз печатласько эстониын [[Special:BlockList|сьӧд списокын]], бан список блокъёс лэсьтыны.",
+       "unblocklogentry": "разблокировать $1",
+       "block-log-flags-anononly": "пользователь гинэ нимтултэм",
+       "block-log-flags-nocreate": "регистрация учётной книгая ужъёсты быдэстон",
+       "block-log-flags-noemail": "лэзьымтэ гожтэт ыстон",
+       "block-log-flags-nousertalk": "тупатъяны ачиз уггес быгаты бамлэн обсуждениосаз",
+       "range_block_disabled": "Администратор диапазонэз блокировать али.",
+       "move-watch": "Чаклан списоке пыртоно инъет но валтӥсь бамъёсыз",
        "allmessagesname": "Ивортон",
+       "allmessages-filter-all": "Ваньзэ",
+       "thumbnail-more": "Будэтоно",
+       "tooltip-pt-login": "Татын системае пырыны луоно, нош одно ик ӧвӧл",
+       "tooltip-pt-createaccount": "Татын учётной записез лэсьтыны но системае пырыны луоно, нош одно ик ӧвӧл",
        "tooltip-ca-talk": "Бамлэн контентэз сярысь вераськон",
+       "tooltip-ca-edit": "Та бамез тупатъяно",
+       "tooltip-ca-addsection": "Выль люкет кылдытоно",
+       "tooltip-ca-viewsource": "Та бам воштонъёслэсь утемын.\nТӥ быгатӥськоды инъет текстсэ учкыны но кӧчырыны",
+       "tooltip-ca-history": "Бамлэн воштонъёсыныз журнал",
+       "tooltip-ca-watch": "Та бамез чаклан списокады пыртоно",
        "tooltip-search": "Утчано {{SITENAME}}",
+       "tooltip-search-go": "Выжоно сыӵе ик нимын баме",
+       "tooltip-search-fulltext": "Шедьтоно бамъёсыз, кудъёсаз пумиське пусъем текст",
+       "tooltip-p-logo": "Кутскон баме мыноно",
        "tooltip-n-mainpage": "Кутскон баме мыноно",
        "tooltip-n-mainpage-description": "Кутскон баме мыноно",
        "tooltip-n-portal": "Проект сярысь, мар карыны быгатоды, ужлы кулэ луэмзэ кытысь шедьтоно",
+       "tooltip-n-currentevents": "Выль иворъёс сярысь веранъёс",
        "tooltip-n-recentchanges": "Берпуметӥ тупатонъёслэн списоксы",
        "tooltip-n-randompage": "Олокыӵе бамез учконо",
+       "tooltip-n-help": "Юрттэт басьтымон инты",
        "tooltip-t-whatlinkshere": "Ваньмыз бамъёс, кудъёсаз та бамлы линксы вань",
+       "tooltip-t-recentchangeslinked": "Выль тупатонъёс бамъёсын, кудъёссэ та бам чӧлске",
+       "tooltip-feed-atom": "Та бамлэн Atom-е трансляциез",
+       "tooltip-t-upload": "Файл поныны",
        "tooltip-t-specialpages": "Специальной бамъёслэн списоксы",
+       "tooltip-t-print": "Та бамысь печатламон версия",
+       "tooltip-t-permalink": "Бамлэн та версияз ялан чӧлскон",
+       "tooltip-ca-nstab-main": "Валтӥсь бамез учконо",
+       "tooltip-ca-nstab-user": "Викиавторлэн бамез",
+       "tooltip-ca-nstab-special": "Та бам нимысьтыз, сое тупатон луонтэм",
+       "tooltip-ca-nstab-image": "Файллэн бамез",
+       "tooltip-ca-nstab-category": "Категорилэн бамез",
+       "tooltip-rollback": "Берло викиавторен лэсьтэм воштонъёсыз одӥг зӥбонэн палэнтыны",
+       "pageinfo-header-edits": "Воштонъёслэн историзы",
        "pageinfo-toolboxlink": "Бам сярысь тодэтъёс",
-       "specialpages": "Ваньмыз панельёс"
+       "file-info-size": "$1 × $2 пиксель, файллэн быдӟалаез: $3, MIME-тип: $4",
+       "show-big-image": "Инъет файл",
+       "show-big-image-preview": "Быдӟалаез та бамын: $1.",
+       "show-big-image-other": "Мукет {{PLURAL:$2|быдӟалаез|быдӟалаосыз}}: $1.",
+       "show-big-image-size": "$1 × $2 пиксель",
+       "metadata": "Метаданнойёс",
+       "metadata-help": "Файл пушкын информация вань на, кудзэ лыдпусо камераос яке сканеръёс файлэз кылдытыку огшоры ватсалляло.\nКылдытон бере файл воштӥськиз ке, куд-огез параметръёс воштэм суредлы ярантэм луыны быгато.",
+       "metadata-fields": "Суредысь метаданнойёслэн та списоке пыртэм полеоссы адӟытӥськозы суред бам вылын, метаданнойёслэн таблицазы бинемын дыръя.\nМукет полеоссы ватскозы.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
+       "exif-disclaimer": "Кыл кутыны пумит луон",
+       "namespacesall": "ваньзэ",
+       "monthsall": "ваньзэ",
+       "confirmrecreate-noreason": "{{GENDER:$1|Участник|Куакеч|}}&nbsp;[[User:$1|$1]] ([[User talk:$1|обс]]) {{GENDER:$1|палэнтыны|палэнтыны}} таиз бере бам, кызьы тон сое редактировать карыны кутскиз. Пожалуйста, подтвердите, мар тон малпаськод та бамез зэм но выльысь кылдозы.",
+       "confirm-watch-top": "Та бамез чаклан списокады пыртоно?",
+       "autosumm-new": "Выль бам: «$1»",
+       "version": "Версия",
+       "specialpages": "Ваньмыз панельёс",
+       "specialpages-group-login": "Тусбуяськыны / Гожтӥськоно",
+       "specialpages-group-users": "Пыриськисьёслэсь правооссэс но",
+       "tag-filter": "[[Special:Tags|Тэгъёсыз]] фильтр:",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|1=Метка|Меткаос}}]]: $2)",
+       "tags-title": "Меткаос",
+       "logentry-delete-delete": "$1 {{GENDER:$2|палэнтыны|палэнтыны}} бам $3",
+       "logentry-delete-restore": "$1 {{GENDER:$2|выльысь}} бам $3",
+       "logentry-newusers-create": "$1 нимо учётной запись {{GENDER:$2|кылдытэмын}} вал",
+       "searchsuggest-search": "Утчано {{SITENAME}}",
+       "searchsuggest-containing": "кудъёсаз вань...",
+       "api-error-autoblocked": "Тон IP-адрес заблокировать эрказ луи, малы ке шуоно со заблокировать пользователь кутыны луоз.",
+       "api-error-blocked": "Редактирование заблокировать вал тӥлесьтыд.",
+       "expand_templates_preview": "Эскерон",
+       "log-action-filter-all": "Ваньзэ"
 }
index cccd0bf..1cdc62c 100644 (file)
        "activeusers-intro": "Це список користувачів, які здійснювали які-небудь дії за {{PLURAL:$1|останній $1 день|останні $1 дні|останні $1 днів}}.",
        "activeusers-count": "$1 {{PLURAL:$1|дія|дії|дій}} за {{PLURAL:$3|останній $3 день|останні $3 дні|останні $3 днів}}",
        "activeusers-from": "Показувати користувачів, починаючи з:",
-       "activeusers-hidebots": "Приховати ботів",
-       "activeusers-hidesysops": "Приховати адміністраторів",
        "activeusers-noresult": "Не знайдено користувачів.",
        "activeusers-submit": "Показати активних користувачів",
        "listgrouprights": "Права груп користувачів",
        "feedback-thanks": "Дякуємо! Ваші відгук розміщено на сторінці \"[$2 $1]\".",
        "feedback-thanks-title": "Дякуємо!",
        "feedback-useragent": "User Agent:",
-       "searchsuggest-search": "Пошук у {{grammar:prepositional|{{SITENAME}}}}",
+       "searchsuggest-search": "Пошук {{GRAMMAR:locative|{{SITENAME}}}}",
        "searchsuggest-containing": "що містять...",
        "api-error-autoblocked": "Вашу IP-адресу було заблоковано автоматично, тому що її використовував заблокований користувач.",
        "api-error-badaccess-groups": "Вам не дозволено завантажувати файли до цього вікіпроекту.",
index 64accfa..1fcff99 100644 (file)
        "talk": "تبادلہٴ خیال",
        "views": "مشاہدات",
        "toolbox": "آلات",
-       "tool-link-userrights": "{{GENDER:$1|صارف}} کے گروہوں میں تبدیلی کریں",
+       "tool-link-userrights": "حلقہ ہائے {{GENDER:$1|صارف}} میں تبدیلی",
        "tool-link-emailuser": "اس {{GENDER:$1|صارف}} کو برقی خط لکھیں",
        "userpage": "صارف کا صفحہ دیکھیے",
        "projectpage": "منصوبہ کا صفحہ دیکھیے",
        "prefswarning-warning": "ترجیحات میں آپ کی جانب سے کی جانے والی تبدیلیاں ابھی محفوظ نہیں ہوئی ہیں۔\nاگر آپ «$1» پر کلک کیے بغیر اس صفحہ کو چھوڑ دیں تو آپ کی تبدیلیاں محفوظ نہیں ہوگی۔",
        "prefs-tabs-navigation-hint": "نکتہ: مختلف خانوں میں جانے کے لیے آپ دائیں اور بائیں کی جہت نما کلیدیں استعمال کر سکتے ہیں۔",
        "userrights": "حقوقِ صارف کی نظامت",
-       "userrights-lookup-user": "گروہائے صارف کا انتظام",
+       "userrights-lookup-user": "حلقہ ہائے صارف کا انتظام",
        "userrights-user-editname": "کوئی اسم‌صارف داخل کیجئے:",
-       "editusergroup": "{{GENDER:$1|صارف}} کے گروہوں میں ترمیم کریں",
+       "editusergroup": "حلقہ ہائے {{GENDER:$1|صارف}} میں ترمیم کریں",
        "editinguser": "{{GENDER:$1|صارف}} <strong>[[User:$1|$1]]</strong> $2 کے اختیارات میں تبدیلی",
-       "userrights-editusergroup": "ترÙ\85Û\8cÙ\85 Ú¯Ø±Ù\88Û\81ائÛ\92 ØµØ§Ø±Ù\81",
-       "saveusergroups": "{{GENDER:$1|صارف}} کے گروہوں کو محفوظ کریں",
+       "userrights-editusergroup": "Ø­Ù\84Ù\82Û\81 Û\81ائÛ\92 ØµØ§Ø±Ù\81 Ù\85Û\8cÚº ØªØ±Ù\85Û\8cÙ\85 Ú©Ø±Û\8cÚº",
+       "saveusergroups": "حلقہ ہائے {{GENDER:$1|صارف}} کو محفوظ کریں",
        "userrights-groupsmember": "رکنِ:",
        "userrights-groupsmember-auto": "اعتباری صارف در",
-       "userrights-groups-help": "آپ ان گروہان میں تبدیلی کرسکتے ہیں جن سے صارف متعلق ہے: \n* نشان زد خانہ کا مطلب یہ ہے کہ صارف کا تعلق اس گروہ سے ہے۔ \n* غیر نشان زد خانہ کا مطلب یہ ہے کہ صارف کا تعلق اس گروہ سے نہیں ہے۔ \n* یہ * علامت اس بات کا اشارہ ہے کہ آپ اس گروہ کو نہیں ہٹا سکتے جسے ایک مرتبہ آپ نے شامل کردیا ہو، یا اس کے بر عکس۔",
+       "userrights-groups-help": "آپ ان حلقوں میں تبدیلی کرسکتے ہیں جن سے صارف متعلق ہے: \n* نشان زد خانہ کا مطلب یہ ہے کہ صارف کا تعلق اس گروہ سے ہے۔ \n* غیر نشان زد خانہ کا مطلب یہ ہے کہ صارف کا تعلق اس گروہ سے نہیں ہے۔ \n* یہ * علامت اس بات کا اشارہ ہے کہ آپ اس گروہ کو نہیں ہٹا سکتے جسے ایک مرتبہ آپ نے شامل کردیا ہو، یا اس کے بر عکس۔",
        "userrights-reason": "وجہ:",
        "userrights-no-interwiki": "دوسرے ویکیوں پر حقوقِ صارف میں ترمیم کی آپ کو اجازت نہیں ہے.",
        "userrights-nodatabase": "ڈیٹابیس $1 موجود نہیں یا مقامی نہیں۔",
        "userrights-unchangeable-col": "مجموعات جو آپ تبدیل نہیں کرسکتے",
        "userrights-conflict": "اختیارات کی تبدیلی میں تنازعہ! براہ کرم نظر ثانی کریں اور اپنی تبدیلیوں کی تصدیق کریں۔",
        "userrights-removed-self": "آپ نے اپنے اختیارات ختم کر لیے ہیں، چنانچہ اب یہ صفحہ آپ کی دسترس سے باہر ہو گیا ہے۔",
-       "group": "گروہ:",
+       "group": "حلقہ:",
        "group-user": "صارفین",
        "group-autoconfirmed": "خود توثیق شدہ صارفین",
        "group-bot": "روبالات",
        "activeusers-intro": "ذیل میں ان صارفین کی فہرست ہے جو گزشتہ $1 {{PLURAL:$1|دن|دنوں}} میں کسی بھی قسم کی سرگرمی میں شریک رہے ہوں۔",
        "activeusers-count": "گزشتہ {{PLURAL:$3|دن|$3 دنوں}} میں $1 {{PLURAL:$1|اقدام|اقدامات}}",
        "activeusers-from": "اس حرف سے شروع ہونے والے صارفین کے نام دکھائیں:",
-       "activeusers-hidebots": "خودکار صارفین کو چھپائیں",
-       "activeusers-hidesysops": "منتظمین کو چھپائیں",
        "activeusers-noresult": "یہ صارف نہیں مل سکا",
        "activeusers-submit": "فعال صارفین دکھائیں",
-       "listgrouprights": "صارÙ\81 Ú¯Ø±Ù\88Û\81Ù\88Úº کے اختیارات",
-       "listgrouprights-summary": "ذیل میں اس ویکی پر موجود صارف گروہوں کی فہرست درج ہے۔ اس میں دائیں جانب گروہ کا نام اور بائیں جانب متعلقہ گروہ کو حاصل شدہ اختیارات کی تفصیل بیان کی گئی ہے۔\nانفرادی اختیارات کے متعلق [[{{MediaWiki:Listgrouprights-helppage}}|اضافی معلومات یہاں]] دیکھی جا سکتی ہیں۔",
+       "listgrouprights": "Ø­Ù\84Ù\82Û\81 ØµØ§Ø±Ù\81Û\8cÙ\86 کے اختیارات",
+       "listgrouprights-summary": "ذیل میں اس ویکی پر موجود صارف حلقوں کی فہرست درج ہے۔ اس میں دائیں جانب حلقے کا نام اور بائیں جانب متعلقہ حلقے کو حاصل شدہ اختیارات کی تفصیل بیان کی گئی ہے۔\nانفرادی اختیارات کے متعلق [[{{MediaWiki:Listgrouprights-helppage}}|اضافی معلومات یہاں]] دیکھی جا سکتی ہیں۔",
        "listgrouprights-key": "عنوان:\n* <span class=\"listgrouprights-granted\">تفویض کردہ اختیارات</span>\n* <span class=\"listgrouprights-revoked\">منسوخ کردہ اختیارات</span>",
-       "listgrouprights-group": "گروہ",
+       "listgrouprights-group": "حلقہ",
        "listgrouprights-rights": "اختیارات",
-       "listgrouprights-helppage": "Help:اختیاراتِ گروہ",
+       "listgrouprights-helppage": "Help:اختیاراتِ حلقہ",
        "listgrouprights-members": "(اراکین کی فہرست)",
-       "listgrouprights-addgroup": "{{PLURAL:$2|اس گروہ|ان گروہوں}} میں شامل کرنے کا اختیار ہے: \n\n$1",
-       "listgrouprights-removegroup": "{{PLURAL:$2|اس گروہ|ان گروہوں}} سے ہٹانے کا اختیار ہے: \n\n$1",
-       "listgrouprights-addgroup-all": "تمام گروہوں کا ا ضافہ کریں",
-       "listgrouprights-removegroup-all": "تمام گروہوں کو ہٹانے کا اختیار ہے",
-       "listgrouprights-addgroup-self": "{{PLURAL:$2|اس گروہ|ان گروہوں}} میں از خود شامل ہونے کا اختیار ہے: \n\n$1",
-       "listgrouprights-removegroup-self": "{{PLURAL:$2|اس گروہ|ان گروہوں}} سے از خود نکلنے کا اختیار ہے: \n\n$1",
-       "listgrouprights-addgroup-self-all": "تمام گروہوں میں از خود شامل ہونے کا اختیار ہے",
-       "listgrouprights-removegroup-self-all": "تمام گروہوں سے از خود نکلنے کا اختیار ہے",
+       "listgrouprights-addgroup": "{{PLURAL:$2|اس حلقہ|ان حلقوں}} میں شامل کرنے کا اختیار ہے: \n\n$1",
+       "listgrouprights-removegroup": "{{PLURAL:$2|اس حلقہ|ان حلقوں}} سے ہٹانے کا اختیار ہے: \n\n$1",
+       "listgrouprights-addgroup-all": "تمام حلقوں کا ا ضافہ کریں",
+       "listgrouprights-removegroup-all": "تمام حلقوں کو ہٹانے کا اختیار ہے",
+       "listgrouprights-addgroup-self": "{{PLURAL:$2|اس حلقہ|ان حلقوں}} میں از خود شامل ہونے کا اختیار ہے: \n\n$1",
+       "listgrouprights-removegroup-self": "{{PLURAL:$2|اس حلقہ|ان حلقوں}} سے از خود نکلنے کا اختیار ہے: \n\n$1",
+       "listgrouprights-addgroup-self-all": "تمام حلقوں میں از خود شامل ہونے کا اختیار ہے",
+       "listgrouprights-removegroup-self-all": "تمام حلقوں سے از خود نکلنے کا اختیار ہے",
        "listgrouprights-namespaceprotection-header": "نام فضا پابندیاں",
        "listgrouprights-namespaceprotection-namespace": "فضائے نام",
        "listgrouprights-namespaceprotection-restrictedto": "ترمیم کی اجازت دینے والے اختیار(ات)",
        "logentry-protect-protect-cascade": "$1 نے $3 کو {{GENDER:$2|محفوظ کیا}} $4 [آبشاری]",
        "logentry-protect-modify": "$1 نے $3 کا درجۂ حفاظت {{GENDER:$2|تبدیل کیا}} $4",
        "logentry-protect-modify-cascade": "$1 نے $3 کا درجہ حفاظت {{GENDER:$2|تبدیل کیا}} $4 [آبشاری]",
-       "logentry-rights-rights": "$1 نے {{GENDER:$6|$3}} کی گروہی رکنیت از $4 تا $5 {{GENDER:$2|تبدیل کی}}",
-       "logentry-rights-rights-legacy": "$1 Ù\86Û\92 $3 Ú©Û\8c Ú¯Ø±Ù\88Û\81Û\8c Ø±Ù\88Ú©Ù\86Û\8cت کو {{GENDER:$2|تبدیل کیا}}",
+       "logentry-rights-rights": "$1 نے {{GENDER:$6|$3}} کا حلقہ صارف از $4 تا $5 {{GENDER:$2|تبدیل کی}}",
+       "logentry-rights-rights-legacy": "$1 Ù\86Û\92 $3 Ú©Û\92 Ø­Ù\84Ù\82Û\81 ØµØ§Ø±Ù\81 کو {{GENDER:$2|تبدیل کیا}}",
        "logentry-rights-autopromote": "$1 کو خودکار طور پر $4 سے $5 پر {{GENDER:$2|ترقی مل گئی}}",
        "logentry-upload-upload": "$1 {{GENDER:$2|اپلوڈ}} $3",
        "logentry-upload-overwrite": "$1 نے $3 کا نیا نسخہ {{GENDER:$2|اپلوڈ کیا}}",
index 429f979..9446b05 100644 (file)
        "newarticle": "(Novo)",
        "newarticletext": "Te ghe sì 'ndà drio a un colegamento a na pagina che no esiste gnancora.\nSe te voli crear sta pagina, taca scrìvar el testo in te la casèla qua soto\n(varda le [$1 pagine de ajuto] par saverghene de pì).\nSe te sì rivà qua par sbajo, basta che te struchi '''Indrìo''' sul to browser.",
        "anontalkpagetext": "----''Sta qua la xe la pagina de discussion de un utente anonimo che no'l se gà gnancora registrà o che no'l xe entrà col so nome utente.\nDe conseguenza xè necessario identificarlo tramite l'indirizo IP numerico.\nSto indirizo el pode èssar doparà da tanti utenti.\nSe te sì un utente anonimo e te ghè ricevù dei messagi che te secondo ti i gera par qualchedun altro, te podi [[Special:CreateAccount|registrarte]] o [[Special:UserLogin|entrar col to nome utente]] par evitar confusion con altri utenti anonimi in futuro.''",
-       "noarticletext": "In sto momento no ghe xe nissun testo su sta pagina.\nTe pol [[Special:Search/{{PAGENAME}}|sercar el titolo de sta pagina]] in altre pagine,\no <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} sercar in tei registri ligà a sta pagina] o se nò [{{fullurl:{{FULLPAGENAME}}|action=edit}} canbiar la pagina]</span>.",
+       "noarticletext": "In sto momento no ghe xe nissun testo su sta pagina.\nTe pol [[Special:Search/{{PAGENAME}}|sercar el titolo de sta pagina]] in altre pagine,\no <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} sercar in tei registri ligà a sta pagina] o se nò [{{fullurl:{{FULLPAGENAME}}|action=edit}} creàr la pagina]</span>.",
        "noarticletext-nopermission": "In sto momento no ghe xe nissun testo su sta pagina.\nTe pol [[Special:Search/{{PAGENAME}}|sercar sto titolo de pagina]] in altre pagine,\no <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} sercar in tei registri ligà a sta pagina]</span>, ma no te ghè el parmesso de crear sta pagina.",
        "missing-revision": "Ła revixion #$1 de ła pàjina \"{{FULLPAGENAME}}\" nó ła existe.",
        "userpage-userdoesnotexist": "L'account \"<nowiki>$1</nowiki>\" no'l corisponde mìa a un utente registrà. Verifica se te voli dal bon crear o modificar sta pagina.",
        "searchprofile-advanced-tooltip": "Serca nei namespace personalixài",
        "search-result-size": "$1 ({{PLURAL:$2|na parola|$2 parole}})",
        "search-result-category-size": "{{PLURAL:$1|1 utente|$1 utenti}} ({{PLURAL:$2|1 sotocategoria|$2 sotocategorie}}, {{PLURAL:$3|1 file|$3 file}})",
-       "search-redirect": "(redirect $1)",
+       "search-redirect": "(rimando da $1)",
        "search-section": "(sesion $1)",
        "search-category": "(categoria $1)",
        "search-suggest": "Sercavito forsi: $1",
        "activeusers-intro": "Sta qua xe la lista dei utenti che ga fato calcossa {{PLURAL:$1|sto ultimo zorno|sti ultimi $1 zorni}}.",
        "activeusers-count": "$1 {{PLURAL:$1|asion}} {{PLURAL:$3|inte'l ultimo xorno|inte i ultimi $3 xorni}}",
        "activeusers-from": "Fà védar i utenti a partir da:",
-       "activeusers-hidebots": "Scondi i bot",
-       "activeusers-hidesysops": "Scondi i aministradori",
        "activeusers-noresult": "Nissun utente catà.",
        "listgrouprights": "Diriti dei grupi utenti",
        "listgrouprights-summary": "Sta qua la xe na lista dei grupi de utenti definìi su sta wiki, coi diriti asocià a ognuno.\nSe pol consultar anca dele altre [[{{MediaWiki:Listgrouprights-helppage}}|informassion in pi]] sui diriti individuali.",
        "whatlinkshere-prev": "{{PLURAL:$1|quel prima|i $1 prima}}",
        "whatlinkshere-next": "{{PLURAL:$1|quel dopo|i $1 dopo}}",
        "whatlinkshere-links": "← colegamenti",
-       "whatlinkshere-hideredirs": "$1 rimandi",
+       "whatlinkshere-hideredirs": "$1 rimandi",
        "whatlinkshere-hidetrans": "$1 inclusion",
        "whatlinkshere-hidelinks": "$1 colegamenti",
        "whatlinkshere-hideimages": "$1 colegamenti da file",
        "feedback-submit": "Manda",
        "feedback-thanks": "Grasie! El to feedback el xe sta publicà a ła pàjina \"[$2 $1]\".",
        "feedback-thanks-title": "Grassie!",
-       "searchsuggest-search": "Serca",
+       "searchsuggest-search": "Serca drento de {{SITENAME}}",
        "searchsuggest-containing": "che contien...",
        "api-error-badaccess-groups": "Nó te si autorixà a cargar documenti so sta wiki.",
        "api-error-badtoken": "Eror interno: token fałà.",
index 575f5a9..dbee858 100644 (file)
        "yourpasswordagain": "Bindaatal sa baatujàll",
        "createacct-yourpasswordagain": "Dëggalal baatujàll bi",
        "createacct-yourpasswordagain-ph": "Duggalaatal baatujàll bi",
-       "remembermypassword": "Denc sama yëgley dukkukaay ci bii joowukaay (lu ëpp nag $1 {{PLURAL:$1|day|days}})",
        "userlogin-remembermypassword": "Wéyal dima jàppe gu dugg",
        "yourdomainname": "Sa barab",
        "externaldberror": "Njuumte judd na ci dàttub njoxe bi, walla day ni rekk amuloo sañ-sañu yeesal sa sàqum biti.",
        "undo-failure": "Neenalug coppite gi defuwul: man naa jur ab jàppante ci coppite yi ci diggante bi",
        "undo-norev": "Coppite gi manoo koo neenal ndaxte nekkul walla dañu koo far",
        "undo-summary": "Neenalug coppite $1 yu [[Special:Contributions/$2|$2]] ([[User talk:$2|waxtaan]])",
-       "cantcreateaccounttitle": "sag mbindu Manu la nekk .",
        "cantcreateaccount-text": "Sosum sàq mu bàyyikoo ci bii màkkaanu IP ('''$1''') dañ kaa téye [[User:$3|$3]].\n\nNgirtey téye gi $3 joxe, mooy ne: ''$2''.",
        "viewpagelogs": "Xool yéenekaayu xët wii",
        "nohistory": "Xët wii amulub jaar-jaar.",
        "searchprofile-everything-tooltip": "Seet fépp (ba ci xëti waxtaanuwaay yi)",
        "searchprofile-advanced-tooltip": "Seet ci barabi tur yi",
        "search-result-size": "$1 ({{PLURAL:$2|1 baat|$2 baat}})",
-       "search-redirect": "(jubluwaat bu jëm $1)",
+       "search-redirect": "(yoonalaat gu jëm $1)",
        "search-section": "(xaaj $1)",
        "search-suggest": "Xéj-na lii nga doon seet: $1",
        "search-interwiki-caption": "Sémbu niroowaale",
index 84ec923..f225126 100644 (file)
@@ -27,7 +27,8 @@
                        "CRCHF",
                        "Shinjiman",
                        "Macofe",
-                       "Jdforrester"
+                       "Jdforrester",
+                       "Tungakl"
                ]
        },
        "tog-underline": "連結加底線:",
        "activeusers-intro": "呢個係響最近$1日之內有一啲動作嘅用戶名單。",
        "activeusers-count": "響{{PLURAL:$3|$3日}}之內嘅$1次{{PLURAL:$1|編輯}}",
        "activeusers-from": "顯示用戶開始於:",
-       "activeusers-hidebots": "隱藏機械人",
-       "activeusers-hidesysops": "隱藏管理員",
        "activeusers-noresult": "搵唔到用戶。",
        "activeusers-submit": "顯示活躍用戶",
        "listgrouprights": "用戶組權限",
        "htmlform-chosen-placeholder": "揀個選項",
        "htmlform-cloner-create": "加多啲",
        "htmlform-cloner-delete": "拎走",
-       "sqlite-has-fts": "$1 有全文搜尋支援",
-       "sqlite-no-fts": "$1 冇全文搜尋支援",
        "logentry-delete-delete": "$1 刪咗頁 $3",
        "revdelete-restricted": "已經應用限制到操作員",
        "revdelete-unrestricted": "已經拎走對於操作員嘅限制",
        "feedback-back": "返轉頭",
        "feedback-cancel": "取消",
        "feedback-close": "搞掂",
-       "feedback-error-title": "出錯",
        "feedback-message": "信息:",
        "feedback-subject": "主旨:",
        "feedback-submit": "遞交",
        "feedback-thanks-title": "多謝!",
-       "searchsuggest-search": "搵",
+       "searchsuggest-search": "搵{{SITENAME}}",
        "searchsuggest-containing": "名單傳送緊...",
        "api-error-unclassified": "發生未知嘅錯誤。",
        "api-error-unknown-code": "未知嘅出錯:$1。",
index b426bce..42f5482 100644 (file)
        "grant-basic": "基本权限",
        "grant-viewdeleted": "查看已删除文件和页面",
        "grant-viewmywatchlist": "查看您的监视列表",
+       "grant-viewrestrictedlogs": "查看受限制的日志记录",
        "newuserlogpage": "用户创建日志",
        "newuserlogpagetext": "这是用户创建的日志。",
        "rightslog": "用户权限日志",
        "booksources-search": "搜索",
        "booksources-text": "下面是销售新书和二手书的其他网站的链接的列表,也可能有关于你正在寻找的图书的更多信息:",
        "booksources-invalid-isbn": "提供的ISBN号码并不正确,请检查原始复制来源号码是否有误。",
+       "magiclink-tracking-rfc": "使用RFC魔术链接的页面",
+       "magiclink-tracking-rfc-desc": "此页面使用RFC魔术链接。参见[https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org]以获取有关如何迁移的信息。",
+       "magiclink-tracking-pmid": "使用PMID魔术链接的页面",
+       "magiclink-tracking-pmid-desc": "此页面使用PMID魔术链接。参见[https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org]以获取有关如何迁移的信息。",
+       "magiclink-tracking-isbn": "使用ISBN魔术链接的页面",
+       "magiclink-tracking-isbn-desc": "此页面使用ISBN魔术链接。参见[https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org]以获取有关如何迁移的信息。",
        "specialloguserlabel": "执行者:",
        "speciallogtitlelabel": "目标(标题,或对于用户使用{{ns:user}}:用户名):",
        "log": "日志",
        "activeusers-intro": "这是在过去$1{{PLURAL:$1|天}}有过某种活动的用户的列表。",
        "activeusers-count": "过去$3天有$1次操作",
        "activeusers-from": "显示用户开始于:",
-       "activeusers-hidebots": "隐藏机器人",
-       "activeusers-hidesysops": "隐藏管理员",
+       "activeusers-groups": "显示属于用户组的用户:",
        "activeusers-noresult": "找不到用户。",
        "activeusers-submit": "显示活跃用户",
        "listgrouprights": "用户组权限",
        "modifiedarticleprotection": "更改“[[$1]]”的保护等级",
        "unprotectedarticle": "移除页面“[[$1]]”的保护",
        "movedarticleprotection": "移动保护设置自“[[$2]]”至“[[$1]]”",
+       "protectedarticle-comment": "{{GENDER:$2|已保护}}“[[$1]]”",
+       "modifiedarticleprotection-comment": "{{GENDER:$2|已更改}}“[[$1]]”的保护等级",
+       "unprotectedarticle-comment": "已从“[[$1]]”{{GENDER:$2|移除保护}}",
        "protect-title": "更改“$1”的保护等级",
        "protect-title-notallowed": "查看“$1”的保护等级",
        "prot_1movedto2": "[[$1]]移动至[[$2]]",
        "viewdeletedpage": "查看被删页面",
        "undeletepagetext": "以下{{PLURAL:$1|页面|$1个页面}}已被删除,但依然在归档中并可以被恢复。归档可能会被定时清理。",
        "undelete-fieldset-title": "还原版本",
-       "undeleteextrahelp": "要恢复该页面的整个历史记录时,不选中任何复选框直接点击'''''{{int:undeletebtn}}'''''。要选择性地恢复部分版本时,请选中相应版本前的复选框再点击'''''{{int:undeletebtn}}'''''。",
+       "undeleteextrahelp": "要恢复该页面的整个历史记录时,不选中任何复选框直接点击<strong><em>{{int:undeletebtn}}</em></strong>。要选择性地恢复部分版本时,请选中相应版本前的复选框再点击<strong><em>{{int:undeletebtn}}</em></strong>。",
        "undeleterevisions": "$1个{{PLURAL:$1|修订版本}}已删除",
        "undeletehistory": "如果您恢复了该页面,所有版本都会被恢复到版本历史中。如果本页删除后有一个同名的新页面建立,被恢复的版本将会出现在先前的历史中。",
        "undeleterevdel": "如果把最新版本部分删除,反删除将会无法进行。如果遇到这种情况,您必须反选或反隐藏最新已删除的版本。",
        "unlockdbtext": "解锁数据库将会恢复所有用户编辑页面、修改参数、编辑监视列表以及其他需要更改数据库的操作。请确认您的决定。",
        "lockconfirm": "是,我的确想要锁定数据库。",
        "unlockconfirm": "是,我的确想要解锁数据库。",
-       "lockbtn": "数据库锁定",
+       "lockbtn": "锁定数据库",
        "unlockbtn": "解锁数据库",
        "locknoconfirm": "您没有勾选确认框。",
        "lockdbsuccesssub": "数据库锁定成功",
        "lockedbyandtime": "(由 {{GENDER:$1|$1}} 于$2 $3执行)",
        "move-page": "移动$1",
        "move-page-legend": "移动页面",
-       "movepagetext": "您可以使用下面的表单来重命名一个页面,同时将其版本历史移动到新页面。同时老的条目将会被重定向到新条目。您可以自动地将指向老的条目的重定向更新为指向新条目。如果您不选择这样做的话,请检查[[Special:DoubleRedirects|双重]]或[[Special:BrokenRedirects|损坏重定向]]链接。您有责任确保链接会被正确指向他们应该被指向的地方。\n\n注意:如果新条目已经有对应页面,此页面将<strong>不会</strong>被移动,除非新页面是重定向页并且无任何修订历史。这意味着您可在误操作后将页面移回原处,同时,您无法覆盖现有页面。\n\n<strong>注意:</strong>对这样一个经常被访问的页面而言这可能是一个重大且唐突的更改;请在行动前先了解您的修改可能带来的一切后果。",
+       "movepagetext": "您可以使用下面的表单来重命名一个页面,同时将其所有版本历史移动到新页面。旧标题将会被重定向到新标题。您可以自动更新链接至原标题的重定向。如果您不选择这样做的话,请检查[[Special:DoubleRedirects|双重]]或[[Special:BrokenRedirects|损坏重定向]]链接。您有责任确保链接会被正确指向他们应该被指向的地方。\n\n注意:如果已存在使用新标题的页面,此页面将<strong>不会</strong>被移动,除非新页面是重定向,并且没有过去的编辑历史。这意味着您可在误操作后将页面移回原处,同时,您无法覆盖现有页面。\n\n<strong>注意:</strong>对这样一个经常被访问的页面而言这可能是一个重大且唐突的更改;请在行动前先了解您的修改可能带来的一切后果。",
        "movepagetext-noredirectfixer": "用下面的表单来重命名一个页面,并将其版本历史同时移动到新页面。老的页面将成为新页面的重定向页。请检查[[Special:DoubleRedirects|双重重定向]]或[[Special:BrokenRedirects|损坏重定向]]链接。您应当负责确定所有链接依然会链到指定的页面。\n\n注意如果新页面已经有内容的话,页面将<strong>不会</strong>被移动,除非新页面无内容或是重定向页,而且没有版本历史。这意味着您再必要时可以在移动到新页面后再移回老的页面,同时您也无法覆盖现有页面。\n\n<strong>注意:</strong>对一个经常被访问的页面而言这可能是一个重大与唐突的更改;请在行动前先确定您了解其所可能带来的后果。",
        "movepagetalktext": "如果您勾选此框,相关联的讨论页将被自动移动到新的标题,除非这里已经有了一个非空讨论页。\n\n在这种情况下,如有需要,您将不得不手动移动或合并页面。",
        "moveuserpage-warning": "'''警告:'''你将移动一个用户页面。请注意,只有该页面会被移动,该用户''不''会被更名。",
        "notificationemail_subject_removed": "{{SITENAME}}注册的电子邮件地址已被移除",
        "notificationemail_body_changed": "来自IP地址$1的人(可能是您)在{{SITENAME}}上更改了账户“$2”的电子邮件地址至“$3”。\n\n如果这不是您,请立即联系一位网站管理员。",
        "notificationemail_body_removed": "来自IP地址$1的人(可能是您)在{{SITENAME}}上移除了账户“$2”的电子邮件地址。\n\n如果这不是您,请立即联系一位网站管理员。",
-       "scarytranscludedisabled": "[跨网站的编码转换不可用]",
+       "scarytranscludedisabled": "[跨wiki嵌入功能被禁用]",
        "scarytranscludefailed": "[提取$1失败]",
        "scarytranscludefailed-httpstatus": "[模板$1读取失败:HTTP $2]",
        "scarytranscludetoolong": "[URL过长]",
        "htmlform-select-badoption": "您指定的值不是有效选项。",
        "htmlform-int-invalid": "您指定的值不是整数。",
        "htmlform-float-invalid": "您指定的值不是数字。",
-       "htmlform-int-toolow": "您指定的值小于最小值$1",
+       "htmlform-int-toolow": "您指定的值小于最小值$1",
        "htmlform-int-toohigh": "您指定的值大于最大值$1",
        "htmlform-required": "本值必填",
        "htmlform-submit": "提交",
        "authmanager-authn-autocreate-failed": "所有账户的自动创建失败:$1",
        "authmanager-change-not-supported": "提供的凭据不能被更改,因为没有东西会使用它们。",
        "authmanager-create-disabled": "账户创建已停用。",
-       "authmanager-create-from-login": "要创建您的账户,请填写下方的字段。",
+       "authmanager-create-from-login": "要创建您的账户,请填写字段。",
        "authmanager-create-not-in-progress": "账户创建尚未进行,或会话数据丢失。请从头重新开始。",
        "authmanager-create-no-primary": "提供的凭据不能用于账户创建。",
        "authmanager-link-no-primary": "提供的证书不能用于账户链接。",
index 694c23d..314f811 100644 (file)
        "grant-basic": "基本權限",
        "grant-viewdeleted": "檢視已刪除的檔案及頁面",
        "grant-viewmywatchlist": "檢視您的監視清單",
+       "grant-viewrestrictedlogs": "檢視已限制的日誌項目",
        "newuserlogpage": "建立使用者日誌",
        "newuserlogpagetext": "此為建立使用者的日誌。",
        "rightslog": "使用者權限日誌",
        "activeusers-intro": "此清單為最近 $1 天有活動的使用者。",
        "activeusers-count": "最近 $3 天內有 $1 次動作",
        "activeusers-from": "顯示使用者開始自:",
-       "activeusers-hidebots": "隱藏機器人",
-       "activeusers-hidesysops": "隱藏管理員",
+       "activeusers-groups": "顯示屬於以下群組的使用者:",
        "activeusers-noresult": "查無使用者。",
        "activeusers-submit": "顯示活動中的使用者",
        "listgrouprights": "使用者群組權限",
        "version-poweredby-translators": " translatewiki.net 翻譯人員",
        "version-credits-summary": "我們感謝以下人士為 [[Special:Version|MediaWiki]] 作出的貢獻。",
        "version-license-info": "MediaWiki 為自由軟體;您可依據自由軟體基金會所發表的 GNU 通用公共授權條款規定,將本程式重新發佈與/或修改;無論您依據的是本授權條款的第二版或 (您可自行選擇) 之後的任何版本。\n\n本程式發佈的目的是希望可以提供幫助,但不負任何擔保責任;亦無隱含對適售性或 特定用途的適用性的情形擔保。詳情請參照 GNU 通用公共授權。\n\n您應已隨本程式收到 [{{SERVER}}{{SCRIPTPATH}}/COPYING GNU 通用公共授權條款的副本];如果沒有,請寄信通知自由軟體基金會,51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA,或 [//www.gnu.org/licenses/old-licenses/gpl-2.0.html 線上閱讀]。",
-       "version-software": "已安裝的軟體",
+       "version-software": "已安裝的軟體",
        "version-software-product": "產品",
        "version-software-version": "版本",
        "version-entrypoints": "入口 URL",
index 2d04f63..40dc198 100644 (file)
@@ -138,6 +138,8 @@ $datePreferenceMigrationMap = [
        'short tdmy',
 ];
 
+$defaultDateFormat = 'dmy';
+
 $dateFormats = [
        /*
        'Default',
index 208cf17..552bec0 100644 (file)
@@ -459,7 +459,6 @@ abstract class Maintenance {
         * Add the default parameters to the scripts
         */
        protected function addDefaultParams() {
-
                # Generic (non script dependant) options:
 
                $this->addOption( 'help', 'Display this help message', false, false, 'h' );
@@ -546,7 +545,6 @@ abstract class Maintenance {
                                . "for this script to run: $joined. Please enable them and then try again.";
                        $this->error( $msg, 1 );
                }
-
        }
 
        /**
@@ -1502,6 +1500,36 @@ abstract class Maintenance {
                return fgets( STDIN, 1024 );
        }
 
+       /**
+        * Get the terminal size as a two-element array where the first element
+        * is the width (number of columns) and the second element is the height
+        * (number of rows).
+        *
+        * @return array
+        */
+       public static function getTermSize() {
+               $default = [ 80, 50 ];
+               if ( wfIsWindows() ) {
+                       return $default;
+               }
+               // It's possible to get the screen size with VT-100 terminal escapes,
+               // but reading the responses is not possible without setting raw mode
+               // (unless you want to require the user to press enter), and that
+               // requires an ioctl(), which we can't do. So we have to shell out to
+               // something that can do the relevant syscalls. There are a few
+               // options. Linux and Mac OS X both have "stty size" which does the
+               // job directly.
+               $retval = false;
+               $size = wfShellExec( 'stty size', $retval );
+               if ( $retval !== 0 ) {
+                       return $default;
+               }
+               if ( !preg_match( '/^(\d+) (\d+)$/', $size, $m ) ) {
+                       return $default;
+               }
+               return [ intval( $m[2] ), intval( $m[1] ) ];
+       }
+
        /**
         * Call this to set up the autoloader to allow classes to be used from the
         * tests directory.
index 87b8c2f..b0f9ece 100644 (file)
@@ -6,12 +6,12 @@ ALTER TABLE /*$wgDBprefix*/image ADD (
   img_media_type ENUM("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE") default NULL,
 
   -- major part of a MIME media type as defined by IANA
-  -- see http://www.iana.org/assignments/media-types/
+  -- see https://www.iana.org/assignments/media-types/
   img_major_mime ENUM("unknown", "application", "audio", "image", "text", "video", "message", "model", "multipart") NOT NULL default "unknown",
 
   -- minor part of a MIME media type as defined by IANA
   -- the minor parts are not required to adher to any standard
   -- but should be consistent throughout the database
-  -- see http://www.iana.org/assignments/media-types/
+  -- see https://www.iana.org/assignments/media-types/
   img_minor_mime varbinary(32) NOT NULL default "unknown"
 );
index 3f0a83d..b504bde 100644 (file)
@@ -60,7 +60,6 @@ class CheckComposerLockUpToDate extends Maintenance {
                        // We couldn't find any out-of-date dependencies, so assume everything is ok!
                        $this->output( "Your composer.lock file is up to date with current dependencies!\n" );
                }
-
        }
 }
 
index f13dd93..388ad8a 100644 (file)
@@ -109,7 +109,6 @@ class GenerateCommonPassword extends Maintenance {
                } catch ( \Cdb\Exception $e ) {
                        $this->error( "Error writing cdb file: " . $e->getMessage(), 2 );
                }
-
        }
 }
 
index cdef7e0..77b0e61 100644 (file)
@@ -1,7 +1,7 @@
 <?php
 /**
  * Router for the php cli-server built-in webserver.
- * http://www.php.net/manual/en/features.commandline.webserver.php
+ * https://secure.php.net/manual/en/features.commandline.webserver.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
index c91d824..f6e65f9 100644 (file)
@@ -8,7 +8,7 @@
  * - hooks names in code are the first parameter of wfRunHooks.
  *
  * if --online option is passed, the script will compare the hooks in the code
- * with the ones at http://www.mediawiki.org/wiki/Manual:Hooks
+ * with the ones at https://www.mediawiki.org/wiki/Manual:Hooks
  *
  * Any instance of wfRunHooks that doesn't meet these parameters will be noted.
  *
index c2c6958..677bfa2 100644 (file)
@@ -23,6 +23,8 @@
 
 require_once __DIR__ . '/Maintenance.php';
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * Maintenance script that displays replication lag times.
  *
@@ -32,27 +34,35 @@ class GetLagTimes extends Maintenance {
        public function __construct() {
                parent::__construct();
                $this->addDescription( 'Dump replication lag times' );
+               $this->addOption( 'report', "Report the lag values to StatsD" );
        }
 
        public function execute() {
-               $lb = wfGetLB();
+               $lbFactory = MediaWikiServices::getInstance()->getDBLoadBalancerFactory();
+               $stats = MediaWikiServices::getInstance()->getStatsdDataFactory();
 
-               if ( $lb->getServerCount() == 1 ) {
-                       $this->error( "This script dumps replication lag times, but you don't seem to have\n"
-                               . "a multi-host db server configuration." );
-               } else {
+               $lbs = $lbFactory->getAllMainLBs() + $lbFactory->getAllExternalLBs();
+               foreach ( $lbs as $cluster => $lb ) {
+                       if ( $lb->getServerCount() <= 1 ) {
+                               continue;
+                       }
                        $lags = $lb->getLagTimes();
-                       foreach ( $lags as $n => $lag ) {
-                               $host = $lb->getServerName( $n );
+                       foreach ( $lags as $serverIndex => $lag ) {
+                               $host = $lb->getServerName( $serverIndex );
                                if ( IP::isValid( $host ) ) {
                                        $ip = $host;
                                        $host = gethostbyaddr( $host );
                                } else {
                                        $ip = gethostbyname( $host );
                                }
+
                                $starLen = min( intval( $lag ), 40 );
                                $stars = str_repeat( '*', $starLen );
                                $this->output( sprintf( "%10s %20s %3d %s\n", $ip, $host, $lag, $stars ) );
+
+                               if ( $this->hasOption( 'report' ) ) {
+                                       $stats->gauge( "loadbalancer.lag.$cluster.$host", $lag );
+                               }
                        }
                }
        }
index 1613111..85b1f92 100644 (file)
@@ -38,6 +38,6 @@
  */
 
 /**
- * Source: <http://api.qunitjs.com/>
+ * Source: <https://api.qunitjs.com/>
  * @class QUnit
  */
index 5bdc8a7..bb1f3d2 100644 (file)
@@ -31,7 +31,7 @@ require_once __DIR__ . '/../Maintenance.php';
 class Digit2Html extends Maintenance {
 
        # A list of unicode numerals is available at:
-       # http://www.fileformat.info/info/unicode/category/Nd/list.htm
+       # https://www.fileformat.info/info/unicode/category/Nd/list.htm
        private $mLangs = [
                'Ar', 'As', 'Bh', 'Bo', 'Dz',
                'Fa', 'Gu', 'Hi', 'Km', 'Kn',
index beb9727..256ee36 100644 (file)
@@ -577,13 +577,13 @@ CREATE TABLE /*_*/image (
   img_media_type varchar(16) default null,
 
   -- major part of a MIME media type as defined by IANA
-  -- see http://www.iana.org/assignments/media-types/
+  -- see https://www.iana.org/assignments/media-types/
   img_major_mime varchar(16) not null default 'unknown',
 
   -- minor part of a MIME media type as defined by IANA
   -- the minor parts are not required to adher to any standard
   -- but should be consistent throughout the database
-  -- see http://www.iana.org/assignments/media-types/
+  -- see https://www.iana.org/assignments/media-types/
   img_minor_mime nvarchar(100) NOT NULL default 'unknown',
 
   -- Description field as entered by the uploader.
index ed63c5c..07aa282 100644 (file)
@@ -5,7 +5,7 @@
  * Should be set in Doxygen INPUT_FILTER as "php mwdoc-filter.php"
  *
  * Based on
- * <http://virtualtee.blogspot.co.uk/2012/03/tip-for-using-doxygen-for-php-code.html>
+ * <https://virtualtee.blogspot.co.uk/2012/03/tip-for-using-doxygen-for-php-code.html>
  *
  * Improved to resolve various bugs and better MediaWiki PHPDoc conventions:
  *
@@ -16,7 +16,7 @@
  * - Strip the text after @var from the output to avoid Doxygen warnings aboug bogus
  *   symbols being documented but not declared or defined.
  *
- * Copyright (C) 2012 Tamas Imrei <tamas.imrei@gmail.com> http://virtualtee.blogspot.com/
+ * Copyright (C) 2012 Tamas Imrei <tamas.imrei@gmail.com> https://virtualtee.blogspot.com/
  * Copyright (C) 2015 Timo Tijhof
  *
  * Permission is hereby granted, free of charge, to any person obtaining
index b9c797d..48602de 100644 (file)
@@ -112,7 +112,7 @@ class RebuildLocalisationCache extends Maintenance {
 
                        if ( $pid === 0 ) {
                                // Child, reseed because there is no bug in PHP:
-                               // http://bugs.php.net/bug.php?id=42465
+                               // https://bugs.php.net/bug.php?id=42465
                                mt_srand( getmypid() );
 
                                $this->doRebuild( $codes, $lc, $force );
index 2a37094..38cdfcf 100644 (file)
@@ -1,6 +1,6 @@
 -- Patch that introduces fulltext search capabilities to SQLite schema
 -- Requires that SQLite must be compiled with FTS3 module (comes with core amalgamation).
--- See http://sqlite.org/fts3.html for details of syntax.
+-- See https://sqlite.org/fts3.html for details of syntax.
 -- Will fail if FTS3 is not present,
 DROP TABLE IF EXISTS /*_*/searchindex;
 CREATE VIRTUAL TABLE /*_*/searchindex USING FTS3(
@@ -15,4 +15,4 @@ CREATE VIRTUAL TABLE /*_*/searchindex USING FTS3(
   si_text
 );
 
-INSERT INTO /*_*/updatelog (ul_key) VALUES ('fts3');
\ No newline at end of file
+INSERT INTO /*_*/updatelog (ul_key) VALUES ('fts3');
index 03ce508..cf60d89 100644 (file)
@@ -861,14 +861,14 @@ CREATE TABLE /*_*/image (
   img_media_type ENUM("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE") default NULL,
 
   -- major part of a MIME media type as defined by IANA
-  -- see http://www.iana.org/assignments/media-types/
+  -- see https://www.iana.org/assignments/media-types/
   -- for "chemical" cf. http://dx.doi.org/10.1021/ci9803233 by the ACS
   img_major_mime ENUM("unknown", "application", "audio", "image", "text", "video", "message", "model", "multipart", "chemical") NOT NULL default "unknown",
 
   -- minor part of a MIME media type as defined by IANA
   -- the minor parts are not required to adher to any standard
   -- but should be consistent throughout the database
-  -- see http://www.iana.org/assignments/media-types/
+  -- see https://www.iana.org/assignments/media-types/
   img_minor_mime varbinary(100) NOT NULL default "unknown",
 
   -- Description field as entered by the uploader.
index 7dd0907..b9baf8c 100644 (file)
@@ -58,7 +58,7 @@ class ValidateRegistrationFile extends Maintenance {
                }
 
                $validator = new Validator;
-               $validator->check( $data, (object) [ '$ref' => 'file://' . $schemaPath ] );
+               $validator->check( $data, (object)[ '$ref' => 'file://' . $schemaPath ] );
                if ( $validator->isValid() && !$licenseError ) {
                        $this->output( "$path validates against the version $version schema!\n" );
                } else {
index e52d6a7..a6106e4 100644 (file)
@@ -97,7 +97,7 @@ function getAccessKeyLabel( element ) {
                return '';
        }
        // use accessKeyLabel if possible
-       // http://www.whatwg.org/specs/web-apps/current-work/multipage/editing.html#dom-accesskeylabel
+       // https://html.spec.whatwg.org/multipage/interaction.html#dom-accesskeylabel
        if ( !useTestPrefix && element.accessKeyLabel ) {
                return element.accessKeyLabel;
        }
index dd71a2b..b1692bb 100644 (file)
                                // maxLength is a strange property. Removing or setting the property to
                                // undefined directly doesn't work. Instead, it can only be unset internally
                                // by the browser when removing the associated attribute (Firefox/Chrome).
-                               // http://code.google.com/p/chromium/issues/detail?id=136004
+                               // https://bugs.chromium.org/p/chromium/issues/detail?id=136004
                                $el.removeAttr( 'maxlength' );
 
                        } else {
                        // changed while text is being entered and keyup/change will not be fired yet
                        // (such as holding down a single key, fires keydown, and after each keydown,
                        // we can trim the previous one).
-                       // See http://www.w3.org/TR/DOM-Level-3-Events/#events-keyboard-event-order for
+                       // See https://www.w3.org/TR/DOM-Level-3-Events/#events-keyboard-event-order for
                        // the order and characteristics of the key events.
                        $el.on( eventKeys, function () {
                                var res = $.trimByteLength(
index 3b19b35..f26c336 100644 (file)
                                        $( '<span>' ).addClass( 'comment' ).html(
                                                // There is no equivalent to rawParams
                                                mw.message( 'parentheses' ).escaped()
-                                                       .replace( '$1', parse.parsedsummary )
+                                                       // .replace() use $ as start of a pattern.
+                                                       // $$ is the pattern for '$'.
+                                                       // The inner .replace() duplicates any $ and
+                                                       // the outer .replace() simplifies the $$.
+                                                       .replace( '$1', parse.parsedsummary.replace( /\$/g, '$$$$' ) )
                                        )
                                );
                        }
index 7ccf59e..4daf77f 100644 (file)
@@ -5,7 +5,7 @@
  */
 
 /* For clarity, explicitly state some recommendations from
- * http://www.w3.org/TR/CSS21/sample.html to make sure the editsection links scale right
+ * https://www.w3.org/TR/CSS21/sample.html to make sure the editsection links scale right
  */
 
 h1 {
index 28ad10a..676ecca 100644 (file)
@@ -50,7 +50,7 @@
 @colorWarningText: #705000;
 
 // UI colors
-@colorFieldBorder: #9aa0a7;
+@colorFieldBorder: #a2a9b1;
 @colorShadow: @colorGray14;
 @colorPlaceholder: @colorGray10;
 @colorNeutral: @colorGray7;
index d9cdf5a..d4c93fd 100644 (file)
@@ -89,7 +89,7 @@ table.toc td {
        display: table-cell;
        /*
        Text decorations are not propagated to the contents of inline blocks and inline tables,
-       according to <http://www.w3.org/TR/css-text-decor-3/#line-decoration>, and 'display: table-cell'
+       according to <https://www.w3.org/TR/css-text-decor-3/#line-decoration>, and 'display: table-cell'
        generates an inline table when used without any parent table-rows and tables.
        */
        text-decoration: inherit;
@@ -99,8 +99,8 @@ table.toc td {
 .tocnumber {
        padding-left: 0;
        padding-right: 0.5em;
+       color: #222;
 }
-
 /* @noflip */
 .mw-content-ltr .tocnumber {
        padding-left: 0;
index a9b5bc3..ed251f2 100644 (file)
                        .addClass( 'mw-widget-dateInputWidget' )
                        .append( this.$handle, this.textInput.$element, this.calendar.$element );
 
+               // config.overlay is the selector to be used for config.$overlay, specified from PHP
+               if ( config.overlay ) {
+                       config.$overlay = $( config.overlay );
+               }
+
                if ( config.$overlay ) {
                        this.calendar.setFloatableContainer( this.$element );
                        config.$overlay.append( this.calendar.$element );
                this.updateUI();
                this.textInput.toggle( false );
                this.calendar.toggle( false );
+
+               // Hide unused <input> from PHP after infusion is done
+               // See InputWidget#reusePreInfuseDOM about config.$input
+               if ( config.$input ) {
+                       config.$input.addClass( 'oo-ui-element-hidden' );
+               }
        };
 
        /* Inheritance */
index 222586f..7ca19df 100644 (file)
@@ -30,7 +30,6 @@
         * @cfg {boolean} [relative=true] If a namespace is set, display titles relative to it
         * @cfg {boolean} [suggestions=true] Display search suggestions
         * @cfg {boolean} [showRedirectTargets=true] Show the targets of redirects
-        * @cfg {boolean} [showRedlink] Show red link to exact match if it doesn't exist
         * @cfg {boolean} [showImages] Show page images
         * @cfg {boolean} [showDescriptions] Show page descriptions
         * @cfg {boolean} [excludeCurrentPage] Exclude the current page from suggestions
@@ -52,7 +51,6 @@
                this.relative = config.relative !== undefined ? config.relative : true;
                this.suggestions = config.suggestions !== undefined ? config.suggestions : true;
                this.showRedirectTargets = config.showRedirectTargets !== false;
-               this.showRedlink = !!config.showRedlink;
                this.showImages = !!config.showImages;
                this.showDescriptions = !!config.showDescriptions;
                this.excludeCurrentPage = !!config.excludeCurrentPage;
                        )
                );
 
-               if ( !pageExists ) {
-                       pageData[ this.getQueryValue() ] = {
-                               missing: true, known: false, redirect: false, disambiguation: false,
-                               description: mw.msg( 'mw-widgets-titleinput-description-new-page' )
-                       };
-               }
-
                if ( this.cache ) {
                        this.cache.set( pageData );
                }
                if ( pageExists && !pageExistsExact ) {
                        titles.unshift( this.getQueryValue() );
                }
-               // Offer the exact text as a new page if the title is valid
-               if ( this.showRedlink && !pageExists && titleObj ) {
-                       titles.push( this.getQueryValue() );
-               }
+
                for ( i = 0, len = titles.length; i < len; i++ ) {
                        page = pageData[ titles[ i ] ] || {};
                        items.push( new mw.widgets.TitleOptionWidget( this.getOptionWidgetData( titles[ i ], page ) ) );
         * @return {Object} Data for option widget
         */
        mw.widgets.TitleWidget.prototype.getOptionWidgetData = function ( title, data ) {
-               var mwTitle = new mw.Title( title );
+               var mwTitle = new mw.Title( title ),
+                       description = data.description;
+               if ( data.missing && !description ) {
+                       description = mw.msg( 'mw-widgets-titleinput-description-new-page' );
+               }
                return {
                        data: this.namespace !== null && this.relative
                                ? mwTitle.getRelativeText( this.namespace )
                                : title,
                        url: mwTitle.getUrl(),
                        imageUrl: this.showImages ? data.imageUrl : null,
-                       description: this.showDescriptions ? data.description : null,
+                       description: this.showDescriptions ? description : null,
                        missing: data.missing,
                        redirect: data.redirect,
                        disambiguation: data.disambiguation,
index fc0fd6e..40f4f52 100644 (file)
@@ -18,8 +18,8 @@
 /* Flatlist styling for PHP widgets... */
 .mw-htmlform-flatlist .oo-ui-fieldLayout-align-inline,
 /* ...and for JS widgets */
-.mw-htmlform-flatlist .oo-ui-optionWidget,
-.mw-htmlform-flatlist .oo-ui-multioptionWidget {
+.mw-htmlform-flatlist .oo-ui-radioOptionWidget,
+.mw-htmlform-flatlist .oo-ui-checkboxMultioptionWidget {
        display: inline-block;
        margin-right: 1em;
 }
index 6280c95..9c8fe70 100644 (file)
                                                        // Depending on how corrupt the string is, it is likely that some
                                                        // modules' implement() succeeded while the ones after the error will
                                                        // never run and leave their modules in the 'loading' state forever.
+                                                       mw.loader.store.stats.failed++;
 
                                                        // Since this is an error not caused by an individual module but by
                                                        // something that infected the implement call itself, don't take any
                                        items: {},
 
                                        // Cache hit stats
-                                       stats: { hits: 0, misses: 0, expired: 0 },
+                                       stats: { hits: 0, misses: 0, expired: 0, failed: 0 },
 
                                        /**
                                         * Construct a JSON-serializable object representing the content of the store.
                                 *  - this.Raw: The raw value is directly included.
                                 *  - this.Cdata: The raw value is directly included. An exception is
                                 *    thrown if it contains any illegal ETAGO delimiter.
-                                *    See <http://www.w3.org/TR/html401/appendix/notes.html#h-B.3.2>.
+                                *    See <https://www.w3.org/TR/html401/appendix/notes.html#h-B.3.2>.
                                 * @return {string} HTML
                                 */
                                element: function ( name, attrs, contents ) {
index 866f213..654f232 100644 (file)
                                        ? util.wikiScript() + '?title=' + util.wikiUrlencode( title ) + '&' + query
                                        : util.wikiScript() + '?' + query;
                        } else {
-                               url = mw.config.get( 'wgArticlePath' ).replace( '$1', util.wikiUrlencode( title ) );
+                               url = mw.config.get( 'wgArticlePath' )
+                                       .replace( '$1', util.wikiUrlencode( title ).replace( /\$/g, '$$$$' ) );
                        }
 
                        // Append the encoded fragment
index 2ff75d2..474d541 100644 (file)
@@ -17,9 +17,6 @@ ul.gallery {
        margin: 2px;
        padding: 2px;
        display: block;
-       width: -moz-fit-content;
-       width: -webkit-fit-content;
-       width: fit-content;
 }
 
 li.gallerycaption {
index 556b51b..5f52d1e 100644 (file)
@@ -1,6 +1,6 @@
 /**
  * Adds window.Node with node types according to:
- * http://www.w3.org/TR/DOM-Level-2-Core/core.html#ID-1950641247
+ * https://www.w3.org/TR/DOM-Level-2-Core/core.html#ID-1950641247
  */
 
 window.Node = window.Node || {
index d026cb0..5e05590 100644 (file)
@@ -64,10 +64,10 @@ function isCompatible( str ) {
                // Hardcoded exceptions for browsers that pass the requirement but we don't want to
                // support in the modern run-time.
                && !(
-                       ua.match( /webOS\/1\.[0-4]/ ) ||
+                       ua.match( /webOS\/1\.[0-4]|SymbianOS|Series60|NetFront|Opera Mini|S40OviBrowser|MeeGo|Android.+Glass/ ) ||
                        ua.match( /PlayStation/i ) ||
-                       ua.match( /SymbianOS|Series60|NetFront|Opera Mini|S40OviBrowser|MeeGo/ ) ||
-                       ( ua.match( /Glass/ ) && ua.match( /Android/ ) )
+                       // UC Mini (speed mode on)
+                       ua.match( /^Mozilla\/5\.0 .+ Gecko\/$/ )
                )
        );
 }
index a19fea1..0bfa318 100644 (file)
@@ -41,6 +41,7 @@ $wgAutoloadClasses += [
        'ParserTestResult' => "$testDir/parser/ParserTestResult.php",
        'ParserTestResultNormalizer' => "$testDir/parser/ParserTestResultNormalizer.php",
        'PhpunitTestRecorder' => "$testDir/parser/PhpunitTestRecorder.php",
+       'TestFileEditor' => "$testDir/parser/TestFileEditor.php",
        'TestFileReader' => "$testDir/parser/TestFileReader.php",
        'TestRecorder' => "$testDir/parser/TestRecorder.php",
        'TidySupport' => "$testDir/parser/TidySupport.php",
diff --git a/tests/parser/TestFileEditor.php b/tests/parser/TestFileEditor.php
new file mode 100644 (file)
index 0000000..05b1216
--- /dev/null
@@ -0,0 +1,196 @@
+<?php
+
+class TestFileEditor {
+       private $lines;
+       private $numLines;
+       private $deletions;
+       private $changes;
+       private $pos;
+       private $warningCallback;
+       private $result;
+
+       public static function edit( $text, array $deletions, array $changes, $warningCallback = null ) {
+               $editor = new self( $text, $deletions, $changes, $warningCallback );
+               $editor->execute();
+               return $editor->result;
+       }
+
+       private function __construct( $text, array $deletions, array $changes, $warningCallback ) {
+               $this->lines = explode( "\n", $text );
+               $this->numLines = count( $this->lines );
+               $this->deletions = array_flip( $deletions );
+               $this->changes = $changes;
+               $this->pos = 0;
+               $this->warningCallback = $warningCallback;
+               $this->result = '';
+       }
+
+       private function execute() {
+               while ( $this->pos < $this->numLines ) {
+                       $line = $this->lines[$this->pos];
+                       switch ( $this->getHeading( $line ) ) {
+                               case 'test':
+                                       $this->parseTest();
+                                       break;
+                               case 'hooks':
+                               case 'functionhooks':
+                               case 'transparenthooks':
+                                       $this->parseHooks();
+                                       break;
+                               default:
+                                       if ( $this->pos < $this->numLines - 1 ) {
+                                               $line .= "\n";
+                                       }
+                                       $this->emitComment( $line );
+                                       $this->pos++;
+                       }
+               }
+               foreach ( $this->deletions as $deletion => $unused ) {
+                       $this->warning( "Could not find test \"$deletion\" to delete it" );
+               }
+               foreach ( $this->changes as $test => $sectionChanges ) {
+                       foreach ( $sectionChanges as $section => $change ) {
+                               $this->warning( "Could not find section \"$section\" in test \"$test\" " .
+                                       "to {$change['op']} it" );
+                       }
+               }
+       }
+
+       private function warning( $text ) {
+               $cb = $this->warningCallback;
+               if ( $cb ) {
+                       $cb( $text );
+               }
+       }
+
+       private function getHeading( $line ) {
+               if ( preg_match( '/^!!\s*(\S+)/', $line, $m ) ) {
+                       return $m[1];
+               } else {
+                       return false;
+               }
+       }
+
+       private function parseTest() {
+               $test = [];
+               $line = $this->lines[$this->pos++];
+               $heading = $this->getHeading( $line );
+               $section = [
+                       'name' => $heading,
+                       'headingLine' => $line,
+                       'contents' => ''
+               ];
+
+               while ( $this->pos < $this->numLines ) {
+                       $line = $this->lines[$this->pos++];
+                       $nextHeading = $this->getHeading( $line );
+                       if ( $nextHeading === 'end' ) {
+                               $test[] = $section;
+
+                               // Add trailing line breaks to the "end" section, to allow for neat deletions
+                               $trail = '';
+                               for ( $i = 0; $i < $this->numLines - $this->pos - 1; $i++ ) {
+                                       if ( $this->lines[$this->pos + $i] === '' ) {
+                                               $trail .= "\n";
+                                       } else {
+                                               break;
+                                       }
+                               }
+                               $this->pos += strlen( $trail );
+
+                               $test[] = [
+                                       'name' => 'end',
+                                       'headingLine' => $line,
+                                       'contents' => $trail
+                               ];
+                               $this->emitTest( $test );
+                               return;
+                       } elseif ( $nextHeading !== false ) {
+                               $test[] = $section;
+                               $heading = $nextHeading;
+                               $section = [
+                                       'name' => $heading,
+                                       'headingLine' => $line,
+                                       'contents' => ''
+                               ];
+                       } else {
+                               $section['contents'] .= "$line\n";
+                       }
+               }
+
+               throw new Exception( 'Unexpected end of file' );
+       }
+
+       private function parseHooks() {
+               $line = $this->lines[$this->pos++];
+               $heading = $this->getHeading( $line );
+               $expectedEnd = 'end' . $heading;
+               $contents = $line;
+
+               do {
+                       $line = $this->lines[$this->pos++];
+                       $nextHeading = $this->getHeading( $line );
+                       $contents .= "$line\n";
+               } while ( $this->pos < $this->numLines && $nextHeading !== $expectedEnd );
+
+               if ( $nextHeading !== $expectedEnd ) {
+                       throw new Exception( 'Unexpected end of file' );
+               }
+               $this->emitHooks( $heading, $contents );
+       }
+
+       protected function emitComment( $contents ) {
+               $this->result .= $contents;
+       }
+
+       protected function emitTest( $test ) {
+               $testName = false;
+               foreach ( $test as $section ) {
+                       if ( $section['name'] === 'test' ) {
+                               $testName = rtrim( $section['contents'], "\n" );
+                       }
+               }
+               if ( isset( $this->deletions[$testName] ) ) {
+                       // Acknowledge deletion
+                       unset( $this->deletions[$testName] );
+                       return;
+               }
+               if ( isset( $this->changes[$testName] ) ) {
+                       $changes =& $this->changes[$testName];
+                       foreach ( $test as $i => $section ) {
+                               $sectionName = $section['name'];
+                               if ( isset( $changes[$sectionName] ) ) {
+                                       $change = $changes[$sectionName];
+                                       switch ( $change['op'] ) {
+                                       case 'rename':
+                                               $test[$i]['name'] = $change['value'];
+                                               $test[$i]['headingLine'] = "!! {$change['value']}";
+                                               break;
+                                       case 'update':
+                                               $test[$i]['contents'] = $change['value'];
+                                               break;
+                                       case 'delete':
+                                               $test[$i]['deleted'] = true;
+                                               break;
+                                       default:
+                                               throw new Exception( "Unknown op: ${change['op']}" );
+                                       }
+                                       // Acknowledge
+                                       // Note that we use the old section name for the rename op
+                                       unset( $changes[$sectionName] );
+                               }
+                       }
+               }
+               foreach ( $test as $section ) {
+                       if ( isset( $section['deleted'] ) ) {
+                               continue;
+                       }
+                       $this->result .= $section['headingLine'] . "\n";
+                       $this->result .= $section['contents'];
+               }
+       }
+
+       protected function emitHooks( $heading, $contents ) {
+               $this->result .= $contents;
+       }
+}
index 6279d68..b6e811b 100644 (file)
@@ -130,12 +130,15 @@ class TestFileReader {
                        'input' => $data[$input],
                        'options' => $data['options'],
                        'config' => $data['config'],
+                       'line' => $this->sectionLineNum['test'],
+                       'file' => $this->file
                ];
 
                if ( $nonTidySection !== false ) {
                        // Add non-tidy test
                        $this->tests[] = [
                                'result' => $data[$nonTidySection],
+                               'resultSection' => $nonTidySection
                        ] + $commonInfo;
 
                        if ( $tidySection !== false ) {
@@ -143,13 +146,16 @@ class TestFileReader {
                                $this->tests[] = [
                                        'desc' => $data['test'] . ' (with tidy)',
                                        'result' => $data[$tidySection],
+                                       'resultSection' => $tidySection,
                                        'options' => $data['options'] . ' tidy',
+                                       'isSubtest' => true,
                                ] + $commonInfo;
                        }
                } elseif ( $tidySection !== false ) {
                        // No need to override desc when there is no subtest
                        $this->tests[] = [
                                'result' => $data[$tidySection],
+                               'resultSection' => $tidySection,
                                'options' => $data['options'] . ' tidy'
                        ] + $commonInfo;
                } else {
@@ -258,7 +264,6 @@ class TestFileReader {
                $this->sectionLineNum = [];
                $this->sectionData = [];
                $this->section = null;
-
        }
 
        /**
index 70215b6..4b81699 100644 (file)
@@ -32,7 +32,7 @@
  *
  * @since 1.22
  */
-abstract class TestRecorder {
+class TestRecorder {
 
        /**
         * Called at beginning of the parser test run
diff --git a/tests/parser/editTests.php b/tests/parser/editTests.php
new file mode 100644 (file)
index 0000000..a9704e6
--- /dev/null
@@ -0,0 +1,490 @@
+<?php
+
+require __DIR__.'/../../maintenance/Maintenance.php';
+
+define( 'MW_PARSER_TEST', true );
+
+/**
+ * Interactive parser test runner and test file editor
+ */
+class ParserEditTests extends Maintenance {
+       private $termWidth;
+       private $testFiles;
+       private $testCount;
+       private $recorder;
+       private $runner;
+       private $numExecuted;
+       private $numSkipped;
+       private $numFailed;
+
+       function __construct() {
+               parent::__construct();
+               $this->addOption( 'session-data', 'internal option, do not use', false, true );
+               $this->addOption( 'use-tidy-config',
+                       'Use the wiki\'s Tidy configuration instead of known-good' .
+                       'defaults.' );
+       }
+
+       public function finalSetup() {
+               parent::finalSetup();
+               self::requireTestsAutoloader();
+               TestSetup::applyInitialConfig();
+       }
+
+       public function execute() {
+               $this->termWidth = $this->getTermSize()[0] - 1;
+
+               $this->recorder = new TestRecorder();
+               $this->setupFileData();
+
+               if ( $this->hasOption( 'session-data' ) ) {
+                       $this->session = json_decode( $this->getOption( 'session-data' ), true );
+               } else {
+                       $this->session = [ 'options' => [] ];
+               }
+               if ( $this->hasOption( 'use-tidy-config' ) ) {
+                       $this->session['options']['use-tidy-config'] = true;
+               }
+               $this->runner = new ParserTestRunner( $this->recorder, $this->session['options'] );
+
+               $this->runTests();
+
+               if ( $this->numFailed === 0 ) {
+                       if ( $this->numSkipped === 0 ) {
+                               print "All tests passed!\n";
+                       } else {
+                               print "All tests passed (but skipped {$this->numSkipped})\n";
+                       }
+                       return;
+               }
+               print "{$this->numFailed} test(s) failed.\n";
+               $this->showResults();
+       }
+
+       protected function setupFileData() {
+               global $wgParserTestFiles;
+               $this->testFiles = [];
+               $this->testCount = 0;
+               foreach ( $wgParserTestFiles as $file ) {
+                       $fileInfo = TestFileReader::read( $file );
+                       $this->testFiles[$file] = $fileInfo;
+                       $this->testCount += count( $fileInfo['tests'] );
+               }
+       }
+
+       protected function runTests() {
+               $teardown = $this->runner->staticSetup();
+               $teardown = $this->runner->setupDatabase( $teardown );
+               $teardown = $this->runner->setupUploads( $teardown );
+
+               print "Running tests...\n";
+               $this->results = [];
+               $this->numExecuted = 0;
+               $this->numSkipped = 0;
+               $this->numFailed = 0;
+               foreach ( $this->testFiles as $fileName => $fileInfo ) {
+                       $this->runner->addArticles( $fileInfo['articles'] );
+                       foreach ( $fileInfo['tests'] as $testInfo ) {
+                               $result = $this->runner->runTest( $testInfo );
+                               if ( $result === false ) {
+                                       $this->numSkipped++;
+                               } elseif ( !$result->isSuccess() ) {
+                                       $this->results[$fileName][$testInfo['desc']] = $result;
+                                       $this->numFailed++;
+                               }
+                               $this->numExecuted++;
+                               $this->showProgress();
+                       }
+               }
+               print "\n";
+       }
+
+       protected function showProgress() {
+               $done = $this->numExecuted;
+               $total = $this->testCount;
+               $width = $this->termWidth - 9;
+               $pos = round( $width * $done / $total );
+               printf( '│' . str_repeat( '█', $pos ) . str_repeat( '-', $width - $pos ) .
+                       "│ %5.1f%%\r", $done / $total * 100 );
+       }
+
+       protected function showResults() {
+               if ( isset( $this->session['startFile'] ) ) {
+                       $startFile = $this->session['startFile'];
+                       $startTest = $this->session['startTest'];
+                       $foundStart = false;
+               } else {
+                       $startFile = false;
+                       $startTest = false;
+                       $foundStart = true;
+               }
+
+               $testIndex = 0;
+               foreach ( $this->testFiles as $fileName => $fileInfo ) {
+                       if ( !isset( $this->results[$fileName] ) ) {
+                               continue;
+                       }
+                       if ( !$foundStart && $startFile !== false && $fileName !== $startFile ) {
+                               $testIndex += count( $this->results[$fileName] );
+                               continue;
+                       }
+                       foreach ( $fileInfo['tests'] as $testInfo ) {
+                               if ( !isset( $this->results[$fileName][$testInfo['desc']] ) ) {
+                                       continue;
+                               }
+                               $result = $this->results[$fileName][$testInfo['desc']];
+                               $testIndex++;
+                               if ( !$foundStart && $startTest !== false ) {
+                                       if ( $testInfo['desc'] !== $startTest ) {
+                                               continue;
+                                       }
+                                       $foundStart = true;
+                               }
+
+                               $this->handleFailure( $testIndex, $testInfo, $result );
+                       }
+               }
+
+               if ( !$foundStart ) {
+                       print "Could not find the test after a restart, did you rename it?";
+                       unset( $this->session['startFile'] );
+                       unset( $this->session['startTest'] );
+                       $this->showResults();
+               }
+               print "All done\n";
+       }
+
+       protected function heading( $text ) {
+               $term = new AnsiTermColorer;
+               $heading = "─── $text ";
+               $heading .= str_repeat( '─', $this->termWidth - mb_strlen( $heading ) );
+               $heading = $term->color( 34 ) . $heading . $term->reset() . "\n";
+               return $heading;
+       }
+
+       protected function unifiedDiff( $left, $right ) {
+               $fromLines = explode( "\n", $left );
+               $toLines = explode( "\n", $right );
+               $formatter = new UnifiedDiffFormatter;
+               return $formatter->format( new Diff( $fromLines, $toLines ) );
+       }
+
+       protected function handleFailure( $index, $testInfo, $result ) {
+               $term = new AnsiTermColorer;
+               $div1 = $term->color( 34 ) . str_repeat( '━', $this->termWidth ) .
+                       $term->reset() . "\n";
+               $div2 = $term->color( 34 ) . str_repeat( '─', $this->termWidth ) .
+                       $term->reset() . "\n";
+
+               print $div1;
+               print "Failure $index/{$this->numFailed}: {$testInfo['file']} line {$testInfo['line']}\n" .
+                       "{$testInfo['desc']}\n";
+
+               print $this->heading( 'Input' );
+               print "{$testInfo['input']}\n";
+
+               print $this->heading( 'Alternating expected/actual output' );
+               print $this->alternatingAligned( $result->expected, $result->actual );
+
+               print $this->heading( 'Diff' );
+
+               $dwdiff = $this->dwdiff( $result->expected, $result->actual );
+               if ( $dwdiff !== false ) {
+                       $diff = $dwdiff;
+               } else {
+                       $diff = $this->unifiedDiff( $result->expected, $result->actual );
+               }
+               print $diff;
+
+               if ( $testInfo['options'] || $testInfo['config'] ) {
+                       print $this->heading( 'Options / Config' );
+                       if ( $testInfo['options'] ) {
+                               print $testInfo['options'] . "\n";
+                       }
+                       if ( $testInfo['config'] ) {
+                               print $testInfo['config'] . "\n";
+                       }
+               }
+
+               print $div2;
+               print "What do you want to do?\n";
+               $specs = [
+                       '[R]eload code and run again',
+                       '[U]pdate source file, copy actual to expected',
+                       '[I]gnore' ];
+
+               if ( strpos( $testInfo['options'], ' tidy' ) === false ) {
+                       if ( empty( $testInfo['isSubtest'] ) ) {
+                               $specs[] = "Enable [T]idy";
+                       }
+               } else {
+                       $specs[] = 'Disable [T]idy';
+               }
+
+               if ( !empty( $testInfo['isSubtest'] ) ) {
+                       $specs[] = 'Delete [s]ubtest';
+               }
+               $specs[] = '[D]elete test';
+               $specs[] = '[Q]uit';
+
+               $options = [];
+               foreach ( $specs as $spec ) {
+                       if ( !preg_match( '/^(.*\[)(.)(\].*)$/', $spec, $m ) ) {
+                               throw new MWException( 'Invalid option spec: ' . $spec );
+                       }
+                       print '* ' . $m[1] . $term->color( 35 ) . $m[2] . $term->color( 0 ) . $m[3] . "\n";
+                       $options[strtoupper( $m[2] )] = true;
+               }
+
+               do {
+                       $response = $this->readconsole();
+                       $cmdResult = false;
+                       if ( $response === false ) {
+                               exit( 0 );
+                       }
+
+                       $response = strtoupper( trim( $response ) );
+                       if ( !isset( $options[$response] ) ) {
+                               print "Invalid response, please enter a single letter from the list above\n";
+                               continue;
+                       }
+
+                       switch ( strtoupper( trim( $response ) ) ) {
+                               case 'R':
+                                       $cmdResult = $this->reload( $testInfo );
+                                       break;
+                               case 'U':
+                                       $cmdResult = $this->update( $testInfo, $result );
+                                       break;
+                               case 'I':
+                                       return;
+                               case 'T':
+                                       $cmdResult = $this->switchTidy( $testInfo );
+                                       break;
+                               case 'S':
+                                       $cmdResult = $this->deleteSubtest( $testInfo );
+                                       break;
+                               case 'D':
+                                       $cmdResult = $this->deleteTest( $testInfo );
+                                       break;
+                               case 'Q':
+                                       exit( 0 );
+                       }
+               } while ( !$cmdResult );
+       }
+
+       protected function dwdiff( $expected, $actual ) {
+               if ( !is_executable( '/usr/bin/dwdiff' ) ) {
+                       return false;
+               }
+
+               $markers = [
+                       "\n" => '¶',
+                       ' ' => '·',
+                       "\t" => '→'
+               ];
+               $markedExpected = strtr( $expected, $markers );
+               $markedActual = strtr( $actual, $markers );
+               $diff = $this->unifiedDiff( $markedExpected, $markedActual );
+
+               $tempFile = tmpfile();
+               fwrite( $tempFile, $diff );
+               fseek( $tempFile, 0 );
+               $pipes = [];
+               $proc = proc_open( '/usr/bin/dwdiff -Pc --diff-input',
+                       [ 0 => $tempFile, 1 => [ 'pipe', 'w' ], 2 => STDERR ],
+                       $pipes );
+
+               if ( !$proc ) {
+                       return false;
+               }
+
+               $result = stream_get_contents( $pipes[1] );
+               proc_close( $proc );
+               fclose( $tempFile );
+               return $result;
+       }
+
+       protected function alternatingAligned( $expectedStr, $actualStr ) {
+               $expectedLines = explode( "\n", $expectedStr );
+               $actualLines = explode( "\n", $actualStr );
+               $maxLines = max( count( $expectedLines ), count( $actualLines ) );
+               $result = '';
+               for ( $i = 0; $i < $maxLines; $i++ ) {
+                       if ( $i < count( $expectedLines ) ) {
+                               $expectedLine = $expectedLines[$i];
+                               $expectedChunks = str_split( $expectedLine, $this->termWidth - 3 );
+                       } else {
+                               $expectedChunks = [];
+                       }
+
+                       if ( $i < count( $actualLines ) ) {
+                               $actualLine = $actualLines[$i];
+                               $actualChunks = str_split( $actualLine, $this->termWidth - 3 );
+                       } else {
+                               $actualChunks = [];
+                       }
+
+                       $maxChunks = max( count( $expectedChunks ), count( $actualChunks ) );
+
+                       for ( $j = 0; $j < $maxChunks; $j++ ) {
+                               if ( isset( $expectedChunks[$j] ) ) {
+                                       $result .= "E: " . $expectedChunks[$j];
+                                       if ( $j === count( $expectedChunks ) - 1 ) {
+                                               $result .= "¶";
+                                       }
+                                       $result .= "\n";
+                               } else {
+                                       $result .= "E:\n";
+                               }
+                               $result .= "\33[4m" . // underline
+                                       "A: ";
+                               if ( isset( $actualChunks[$j] ) ) {
+                                       $result .= $actualChunks[$j];
+                                       if ( $j === count( $actualChunks ) - 1 ) {
+                                               $result .= "¶";
+                                       }
+                               }
+                               $result .= "\33[0m\n"; // reset
+                       }
+               }
+               return $result;
+       }
+
+       protected function reload( $testInfo ) {
+               global $argv;
+               pcntl_exec( PHP_BINARY, [
+                       $argv[0],
+                       '--session-data',
+                       json_encode( [
+                               'startFile' => $testInfo['file'],
+                               'startTest' => $testInfo['desc']
+                       ] + $this->session ) ] );
+
+               print "pcntl_exec() failed\n";
+               return false;
+       }
+
+       protected function findTest( $file, $testInfo ) {
+               $initialPart = '';
+               for ( $i = 1; $i < $testInfo['line']; $i++ ) {
+                       $line = fgets( $file );
+                       if ( $line === false ) {
+                               print "Error reading from file\n";
+                               return false;
+                       }
+                       $initialPart .= $line;
+               }
+
+               $line = fgets( $file );
+               if ( !preg_match( '/^!!\s*test/', $line ) ) {
+                       print "Test has moved, cannot edit\n";
+                       return false;
+               }
+
+               $testPart = $line;
+
+               $desc = fgets( $file );
+               if ( trim( $desc ) !== $testInfo['desc'] ) {
+                       print "Description does not match, cannot edit\n";
+                       return false;
+               }
+               $testPart .= $desc;
+               return [ $initialPart, $testPart ];
+       }
+
+       protected function getOutputFileName( $inputFileName ) {
+               if ( is_writable( $inputFileName ) ) {
+                       $outputFileName = $inputFileName;
+               } else {
+                       $outputFileName = wfTempDir() . '/' . basename( $inputFileName );
+                       print "Cannot write to input file, writing to $outputFileName instead\n";
+               }
+               return $outputFileName;
+       }
+
+       protected function editTest( $fileName, $deletions, $changes ) {
+               $text = file_get_contents( $fileName );
+               if ( $text === false ) {
+                       print "Unable to open test file!";
+                       return false;
+               }
+               $result = TestFileEditor::edit( $text, $deletions, $changes,
+                       function ( $msg ) {
+                               print "$msg\n";
+                       }
+               );
+               if ( is_writable( $fileName ) ) {
+                       file_put_contents( $fileName, $result );
+                       print "Wrote updated file\n";
+               } else {
+                       print "Cannot write updated file, here is a patch you can paste:\n\n";
+                       print
+                               "--- {$fileName}\n" .
+                               "+++ {$fileName}~\n" .
+                               $this->unifiedDiff( $text, $result ) .
+                               "\n";
+               }
+       }
+
+       protected function update( $testInfo, $result ) {
+               $this->editTest( $testInfo['file'],
+                       [], // deletions
+                       [ // changes
+                               $testInfo['test'] => [
+                                       $testInfo['resultSection'] => [
+                                               'op' => 'update',
+                                               'value' => $result->actual . "\n"
+                                       ]
+                               ]
+                       ]
+               );
+       }
+
+       protected function deleteTest( $testInfo ) {
+               $this->editTest( $testInfo['file'],
+                       [ $testInfo['test'] ], // deletions
+                       [] // changes
+               );
+       }
+
+       protected function switchTidy( $testInfo ) {
+               $resultSection = $testInfo['resultSection'];
+               if ( in_array( $resultSection, [ 'html/php', 'html/*', 'html', 'result' ] ) ) {
+                       $newSection = 'html+tidy';
+               } elseif ( in_array( $resultSection, [ 'html/php+tidy', 'html+tidy' ] ) ) {
+                       $newSection = 'html';
+               } else {
+                       print "Unrecognised result section name \"$resultSection\"";
+                       return;
+               }
+
+               $this->editTest( $testInfo['file'],
+                       [], // deletions
+                       [ // changes
+                               $testInfo['test'] => [
+                                       $resultSection => [
+                                               'op' => 'rename',
+                                               'value' => $newSection
+                                       ]
+                               ]
+                       ]
+               );
+       }
+
+       protected function deleteSubtest( $testInfo ) {
+               $this->editTest( $testInfo['file'],
+                       [], // deletions
+                       [ // changes
+                               $testInfo['test'] => [
+                                       $testInfo['resultSection'] => [
+                                               'op' => 'delete'
+                                       ]
+                               ]
+                       ]
+               );
+       }
+}
+
+$maintClass = 'ParserEditTests';
+require RUN_MAINTENANCE_IF_MAIN;
index 38923f0..1d0867a 100644 (file)
@@ -68,7 +68,8 @@ class ParserTestsMaintenance extends Maintenance {
                        'are: removeTbody to remove <tbody> tags; and trimWhitespace ' .
                        'to trim whitespace from the start and end of text nodes.',
                        false, true );
-               $this->addOption( 'use-tidy-config', 'Use the wiki\'s Tidy configuration instead of known-good' .
+               $this->addOption( 'use-tidy-config',
+                       'Use the wiki\'s Tidy configuration instead of known-good' .
                        'defaults.' );
        }
 
index ba7b0d4..a18e219 100644 (file)
@@ -1,5 +1,5 @@
 # MediaWiki Parser test cases
-# Some taken from http://meta.wikimedia.org/wiki/Parser_testing
+# Some taken from https://meta.wikimedia.org/wiki/Parser_testing
 # All (C) their respective authors and released under the GPL
 #
 # The syntax should be fairly self-explanatory.
@@ -524,7 +524,7 @@ http://fr.wikipedia.org/wiki/🍺
 !! end
 
 # Note that the html+tidy output removes the spaces after the <li>,
-# which is a bug (http://sourceforge.net/p/tidy/bugs/945/, etc).
+# which is a bug (https://sourceforge.net/p/tidy/bugs/945/, etc).
 # This is an issue for all tests with lists.  We intentionally do
 # *not* add html+tidy clauses for these, as we don't want to
 # document/test the broken behavior.  (Parsoid matches the non-tidy
@@ -1230,7 +1230,7 @@ Text-level semantic html elements in wikitext
 !! end
 
 # test cases taken from
-# http://www.w3.org/TR/html5/text-level-semantics.html#the-ruby-element
+# https://www.w3.org/TR/html5/text-level-semantics.html#the-ruby-element
 !! test
 Ruby markup (W3C-style)
 !! wikitext
@@ -1293,7 +1293,7 @@ Non-word characters don't terminate tag names (bug 17663, 40670, 52022)
 </p>
 !! end
 
-# There is a tidy bug here: http://sourceforge.net/p/tidy/bugs/946/
+# There is a tidy bug here: https://sourceforge.net/p/tidy/bugs/946/
 # If the non-word-character tag made it through the sanitizer, tidy
 # would munge it up.
 !! test
@@ -1420,6 +1420,15 @@ sed abit.
 </span></p>
 !! end
 
+!! test
+Don't parse <nowiki><span class="error"></nowiki> (T149622)
+!! wikitext
+<nowiki><span class="error"></nowiki>
+!! html/php
+<p>&lt;span class="error"&gt;
+</p>
+!! end
+
 !! test
 nowiki 3
 !! wikitext
@@ -3840,7 +3849,7 @@ Definition Lists: Hacky use to indent tables (WS-insensitive)
 ## All Parsoid only definition list tests have this difference.
 ##
 ## See also: https://phabricator.wikimedia.org/T8569
-## and http://lists.wikimedia.org/pipermail/wikitext-l/2011-November/000483.html
+## and https://lists.wikimedia.org/pipermail/wikitext-l/2011-November/000483.html
 
 !! test
 Table / list interaction: indented table with lists in table contents
@@ -5194,7 +5203,7 @@ http://www.example.com/?title=AT%26T
 <p><a rel="mw:ExtLink" href="http://www.example.com/?title=AT%26T">http://www.example.com/?title=AT%26T</a></p>
 !! end
 
-# According to http://www.w3.org/TR/2011/WD-html5-20110525/Overview.html#parsing-urls a plain
+# According to https://www.w3.org/TR/2011/WD-html5-20110525/Overview.html#parsing-urls a plain
 # % is actually legal in HTML5. Any change in output would need testing though.
 !! test
 Bug 4781, 5267: %25 in URL
@@ -5781,7 +5790,7 @@ Plain ''italic'''s plain
 
 # This should not produce <table></table> as <table><tr><td></td></tr></table>
 # is the bare minimum required by the spec, see:
-# http://www.w3.org/TR/xhtml-modularization/dtd_module_defs.html#a_module_Basic_Tables
+# https://www.w3.org/TR/xhtml-modularization/dtd_module_defs.html#a_module_Basic_Tables
 # Parsoid team replies: empty table tags are legal in HTML5
 !! test
 A table with no data.
@@ -19098,7 +19107,7 @@ parsoid=wt2html,wt2wt,html2html
 <p><span typeof="mw:Entity">î</span><span typeof="mw:Entity">î</span></p>
 !! end
 
-# See: http://www.w3.org/TR/html5/syntax.html#character-references
+# See: https://www.w3.org/TR/html5/syntax.html#character-references
 # Note that U+000C (form feed) is not a valid XML character, so
 # it is banned even though allowed in HTML5.
 !! test
index 9599016..e0f4416 100644 (file)
@@ -1190,7 +1190,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
 
                /** @var ExternalStoreDB $externalStoreDB */
                $externalStoreDB = ExternalStore::getStoreObject( 'DB' );
-               $defaultArray = (array) $wgDefaultExternalStore;
+               $defaultArray = (array)$wgDefaultExternalStore;
                $dbws = [];
                foreach ( $defaultArray as $url ) {
                        if ( strpos( $url, 'DB://' ) === 0 ) {
@@ -1217,7 +1217,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                        return false;
                }
 
-               $defaultArray = (array) $wgDefaultExternalStore;
+               $defaultArray = (array)$wgDefaultExternalStore;
                foreach ( $defaultArray as $url ) {
                        if ( strpos( $url, 'DB://' ) === 0 ) {
                                return true;
diff --git a/tests/phpunit/data/upload/buggynamespace-bad.svg b/tests/phpunit/data/upload/buggynamespace-bad.svg
new file mode 100644 (file)
index 0000000..974fac0
--- /dev/null
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 13.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 14948)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1"
+        id="svg2" xmlns:x="&ns_extend;" xmlns:i="&ns_ai;" xmlns:graph="&ns_graphs;" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:svg="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:cc="http://creativecommons.org/ns#" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" inkscape:output_extension="org.inkscape.output.svg.inkscape" sodipodi:version="0.32" sodipodi:docname="India_location_map.svg" inkscape:version="0.46"
+        xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="1500px"
+        height="1614.844px" viewBox="0 0 1500 1614.844" enable-background="new 0 0 1500 1614.844" xml:space="preserve">
+<switch>
+       <foreignObject requiredExtensions="&ns_ai;" x="0" y="0" width="1" height="1">
+               <i:pgfRef  xlink:href="#adobe_illustrator_pgf">
+               </i:pgfRef>
+       </foreignObject>
+       <g i:extraneous="self">
+               <circle cx="750" cy="750" r="500" />
+       </g>
+</switch>
+<i:pgf  id="adobe_illustrator_pgf">
+       <![CDATA[
+       eJzsvWl3XjXyL3pf91r9HZ50MyQkfrw1awcIZCBAYyAQaEIzBMd+krjx1LYDzf/F+exXNUml/Qwx
+d1/++qv/+P2XX3/z1fc//9mvf/jyH796+/Lbc2Z9+eNXvzn/9Pbr77/64cfvvv/q7Ye//+53hNBH
++sFf/MXf/Nv/5ec/+38A7g2BFw==
+       ]]>
+</i:pgf>
+</svg>
diff --git a/tests/phpunit/data/upload/buggynamespace-evilhtml.svg b/tests/phpunit/data/upload/buggynamespace-evilhtml.svg
new file mode 100644 (file)
index 0000000..f4be479
--- /dev/null
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 13.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 14948)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
+       <!ENTITY ns_html "http://www.w3.org/1999/xhtml">
+]>
+<svg:svg version="1.1"
+        id="svg2"
+        xmlns="&ns_html;"
+        xmlns:svg="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="1500px"
+        height="1614.844px" viewBox="0 0 1500 1614.844" enable-background="new 0 0 1500 1614.844" xml:space="preserve">
+       <svg:g><div>foo</div></svg:g>
+</svg:svg>
diff --git a/tests/phpunit/data/upload/buggynamespace-okay.svg b/tests/phpunit/data/upload/buggynamespace-okay.svg
new file mode 100644 (file)
index 0000000..4a5c6aa
--- /dev/null
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:i="&amp;ns_ai;"
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   version="1.1"
+   width="1500"
+   height="1614.844"
+   viewBox="0 0 1500 1614.844"
+   id="svg2"
+   xml:space="preserve"><metadata
+   id="metadata15"><rdf:RDF><cc:Work
+       rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+         rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
+   id="defs13" />
+<switch
+   id="switch3">
+       <foreignObject
+   id="foreignObject5"
+   height="1"
+   width="1"
+   y="0"
+   x="0"
+   requiredExtensions="http://ns.adobe.com/AdobeIllustrator/10.0/">
+               <i:pgfRef
+   xlink:href="#adobe_illustrator_pgf">
+               </i:pgfRef>
+       </foreignObject>
+       <g
+   id="g7">
+               <circle
+   cx="750"
+   cy="750"
+   r="500"
+   id="circle9" />
+       </g>
+</switch>
+<i:pgf
+   id="adobe_illustrator_pgf">
+       
+       eJzsvWl3XjXyL3pf91r9HZ50MyQkfrw1awcIZCBAYyAQaEIzBMd+krjx1LYDzf/F+exXNUml/Qwx
+d1/++qv/+P2XX3/z1fc//9mvf/jyH796+/Lbc2Z9+eNXvzn/9Pbr77/64cfvvv/q7Ye//+53hNBH
++sFf/MXf/Nv/5ec/+38A7g2BFw==
+       
+</i:pgf>
+</svg>
\ No newline at end of file
diff --git a/tests/phpunit/data/upload/buggynamespace-okay2.svg b/tests/phpunit/data/upload/buggynamespace-okay2.svg
new file mode 100644 (file)
index 0000000..fe42310
--- /dev/null
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:i="&amp;#38;ns_ai;"
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   version="1.1"
+   width="1500"
+   height="1614.844"
+   viewBox="0 0 1500 1614.844"
+   id="svg2"
+   xml:space="preserve"><metadata
+   id="metadata15"><rdf:RDF><cc:Work
+       rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+         rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
+   id="defs13" />
+<switch
+   id="switch3">
+       <foreignObject
+   requiredExtensions="http://ns.adobe.com/AdobeIllustrator/10.0/"
+   x="0"
+   y="0"
+   width="1"
+   height="1"
+   id="foreignObject5">
+               <i:pgfRef
+   xlink:href="#adobe_illustrator_pgf">
+               </i:pgfRef>
+       </foreignObject>
+       <g
+   id="g7">
+               <circle
+   cx="750"
+   cy="750"
+   r="500"
+   id="circle9" />
+       </g>
+</switch>
+<i:pgf
+   id="adobe_illustrator_pgf">
+       
+       eJzsvWl3XjXyL3pf91r9HZ50MyQkfrw1awcIZCBAYyAQaEIzBMd+krjx1LYDzf/F+exXNUml/Qwx
+d1/++qv/+P2XX3/z1fc//9mvf/jyH796+/Lbc2Z9+eNXvzn/9Pbr77/64cfvvv/q7Ye//+53hNBH
++sFf/MXf/Nv/5ec/+38A7g2BFw==
+       
+</i:pgf>
+</svg>
\ No newline at end of file
diff --git a/tests/phpunit/data/upload/buggynamespace-original.svg b/tests/phpunit/data/upload/buggynamespace-original.svg
new file mode 100644 (file)
index 0000000..c61c91c
--- /dev/null
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 13.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 14948)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
+       <!ENTITY ns_extend "http://ns.adobe.com/Extensibility/1.0/">
+       <!ENTITY ns_ai "http://ns.adobe.com/AdobeIllustrator/10.0/">
+       <!ENTITY ns_graphs "http://ns.adobe.com/Graphs/1.0/">
+       <!ENTITY ns_vars "http://ns.adobe.com/Variables/1.0/">
+       <!ENTITY ns_imrep "http://ns.adobe.com/ImageReplacement/1.0/">
+       <!ENTITY ns_sfw "http://ns.adobe.com/SaveForWeb/1.0/">
+       <!ENTITY ns_custom "http://ns.adobe.com/GenericCustomNamespace/1.0/">
+       <!ENTITY ns_adobe_xpath "http://ns.adobe.com/XPath/1.0/">
+]>
+<svg version="1.1"
+        id="svg2" xmlns:x="&ns_extend;" xmlns:i="&ns_ai;" xmlns:graph="&ns_graphs;" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:svg="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:cc="http://creativecommons.org/ns#" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" inkscape:output_extension="org.inkscape.output.svg.inkscape" sodipodi:version="0.32" sodipodi:docname="India_location_map.svg" inkscape:version="0.46"
+        xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="1500px"
+        height="1614.844px" viewBox="0 0 1500 1614.844" enable-background="new 0 0 1500 1614.844" xml:space="preserve">
+<switch>
+       <foreignObject requiredExtensions="&ns_ai;" x="0" y="0" width="1" height="1">
+               <i:pgfRef  xlink:href="#adobe_illustrator_pgf">
+               </i:pgfRef>
+       </foreignObject>
+       <g i:extraneous="self">
+               <circle cx="750" cy="750" r="500" />
+       </g>
+</switch>
+<i:pgf  id="adobe_illustrator_pgf">
+       <![CDATA[
+       eJzsvWl3XjXyL3pf91r9HZ50MyQkfrw1awcIZCBAYyAQaEIzBMd+krjx1LYDzf/F+exXNUml/Qwx
+d1/++qv/+P2XX3/z1fc//9mvf/jyH796+/Lbc2Z9+eNXvzn/9Pbr77/64cfvvv/q7Ye//+53hNBH
++sFf/MXf/Nv/5ec/+38A7g2BFw==
+       ]]>
+</i:pgf>
+</svg>
index 5c4d1c0..e491d61 100644 (file)
@@ -52,6 +52,9 @@ class FormOptionsTest extends MediaWikiTestCase {
        private function assertGuessString( $data ) {
                $this->guess( FormOptions::STRING, $data );
        }
+       private function assertGuessArray( $data ) {
+               $this->guess( FormOptions::ARR, $data );
+       }
 
        /** Generic helper */
        private function guess( $expected, $data ) {
@@ -84,15 +87,10 @@ class FormOptionsTest extends MediaWikiTestCase {
                $this->assertGuessString( '5' );
                $this->assertGuessString( '0' );
                $this->assertGuessString( '1.5' );
-       }
 
-       /**
-        * @expectedException MWException
-        * @covers FormOptions::guessType
-        */
-       public function testGuessTypeOnArrayThrowException() {
-               $this->object->guessType( [ 'foo' ] );
+               $this->assertGuessArray( [ 'foo' ] );
        }
+
        /**
         * @expectedException MWException
         * @covers FormOptions::guessType
index 9f4a01c..89416f2 100644 (file)
@@ -18,7 +18,6 @@ class GitInfoTest extends MediaWikiTestCase {
                $this->assertEquals( 'master', $gitInfo->getCurrentBranch() );
                $this->assertContains( '0123456789abcdef0123456789abcdef01234567',
                        $gitInfo->getHeadViewUrl() );
-
        }
 
        public function testValidJsonData() {
index bc50966..e2ee193 100644 (file)
@@ -92,7 +92,6 @@ class HtmlTest extends MediaWikiTestCase {
         * @covers Html::expandAttributes
         */
        public function testExpandAttributesSkipsNullAndFalse() {
-
                # ## EMPTY ########
                $this->assertEmpty(
                        Html::expandAttributes( [ 'foo' => null ] ),
@@ -190,7 +189,6 @@ class HtmlTest extends MediaWikiTestCase {
                        Html::expandAttributes( [ 'zero' => 0 ] ),
                        'Number 0 value needs no quotes'
                );
-
        }
 
        /**
@@ -447,7 +445,7 @@ class HtmlTest extends MediaWikiTestCase {
 
        /**
         * List of input element types values introduced by HTML5
-        * Full list at http://www.w3.org/TR/html-markup/input.html
+        * Full list at https://www.w3.org/TR/html-markup/input.html
         */
        public static function provideHtml5InputTypes() {
                $types = [
index ae0b4be..c3804c6 100644 (file)
@@ -188,7 +188,7 @@ class HttpTest extends MediaWikiTestCase {
 
        /**
         * Constant values are from PHP 5.3.28 using cURL 7.24.0
-        * @see http://php.net/manual/en/curl.constants.php
+        * @see https://secure.php.net/manual/en/curl.constants.php
         *
         * All constant values are present so that developers don’t need to remember
         * to add them if added at a later date. The commented out constants were
index 61b165a..428b012 100644 (file)
@@ -6,7 +6,6 @@
 class LinkFilterTest extends MediaWikiLangTestCase {
 
        protected function setUp() {
-
                parent::setUp();
 
                $this->setMwGlobals( 'wgUrlProtocols', [
@@ -26,7 +25,6 @@ class LinkFilterTest extends MediaWikiLangTestCase {
                        'mms://',
                        '//',
                ] );
-
        }
 
        /**
@@ -38,11 +36,9 @@ class LinkFilterTest extends MediaWikiLangTestCase {
         * @return string Regex
         */
        function createRegexFromLIKE( $like ) {
-
                $regex = '!^';
 
                foreach ( $like as $item ) {
-
                        if ( $item instanceof LikeMatch ) {
                                if ( $item->toString() == '%' ) {
                                        $regex .= '.*';
@@ -58,7 +54,6 @@ class LinkFilterTest extends MediaWikiLangTestCase {
                $regex .= '$!';
 
                return $regex;
-
        }
 
        /**
@@ -67,7 +62,6 @@ class LinkFilterTest extends MediaWikiLangTestCase {
         * @return array
         */
        public static function provideValidPatterns() {
-
                return [
                        // Protocol, Search pattern, URL which matches the pattern
                        [ 'http://', '*.test.com', 'http://www.test.com' ],
@@ -164,7 +158,6 @@ class LinkFilterTest extends MediaWikiLangTestCase {
                        // [ '', 'https://*.wikimedia.org/r/#/q/status:open,n,z',
                        //      'https://gerrit.wikimedia.org/XXX/r/#/q/status:open,n,z', false ],
                ];
-
        }
 
        /**
@@ -181,7 +174,6 @@ class LinkFilterTest extends MediaWikiLangTestCase {
         * @param bool $shouldBeFound Should the URL be found? (defaults true)
         */
        function testMakeLikeArrayWithValidPatterns( $protocol, $pattern, $url, $shouldBeFound = true ) {
-
                $indexes = wfMakeUrlIndexes( $url );
                $likeArray = LinkFilter::makeLikeArray( $pattern, $protocol );
 
@@ -211,7 +203,6 @@ class LinkFilterTest extends MediaWikiLangTestCase {
                                "Search pattern '$protocol$pattern' should not find url '$url' \n$debugmsg"
                        );
                }
-
        }
 
        /**
@@ -220,7 +211,6 @@ class LinkFilterTest extends MediaWikiLangTestCase {
         * @return array
         */
        public static function provideInvalidPatterns() {
-
                return [
                        [ '' ],
                        [ '*' ],
@@ -240,7 +230,6 @@ class LinkFilterTest extends MediaWikiLangTestCase {
                        [ 'test.com/*/index' ],
                        [ 'test.com/dir/index?arg=*' ],
                ];
-
        }
 
        /**
@@ -253,12 +242,10 @@ class LinkFilterTest extends MediaWikiLangTestCase {
         * @param string $pattern Invalid search pattern
         */
        function testMakeLikeArrayWithInvalidPatterns( $pattern ) {
-
                $this->assertFalse(
                        LinkFilter::makeLikeArray( $pattern ),
                        "'$pattern' is not a valid pattern and should be rejected"
                );
-
        }
 
 }
index a5e2ac0..dc0c64c 100644 (file)
@@ -315,6 +315,7 @@ class MediaWikiServicesTest extends MediaWikiTestCase {
                        'CryptRand' => [ 'CryptRand', CryptRand::class ],
                        'CryptHKDF' => [ 'CryptHKDF', CryptHKDF::class ],
                        'MediaHandlerFactory' => [ 'MediaHandlerFactory', MediaHandlerFactory::class ],
+                       'Parser' => [ 'Parser', Parser::class ],
                        'GenderCache' => [ 'GenderCache', GenderCache::class ],
                        'LinkCache' => [ 'LinkCache', LinkCache::class ],
                        'LinkRenderer' => [ 'LinkRenderer', LinkRenderer::class ],
index df92012..a8d1e33 100644 (file)
@@ -34,7 +34,7 @@ class MediaWikiTest extends MediaWikiTestCase {
                                'url' => 'http://example.org/w/index.php?title=Foo_Bar',
                                'query' => [ 'title' => 'Foo_Bar' ],
                                'title' => 'Foo_Bar',
-                               'redirect' => 'http://example.org/wiki/Foo_Bar',
+                               'redirect' => false,
                        ],
                        [
                                // View: Script path with implicit title from page id
@@ -76,21 +76,21 @@ class MediaWikiTest extends MediaWikiTestCase {
                                'url' => 'http://example.org/w/?title=Foo_Bar',
                                'query' => [ 'title' => 'Foo_Bar' ],
                                'title' => 'Foo_Bar',
-                               'redirect' => 'http://example.org/wiki/Foo_Bar',
+                               'redirect' => false,
                        ],
                        [
                                // View: Root path with escaped title
                                'url' => 'http://example.org/?title=Foo_Bar',
                                'query' => [ 'title' => 'Foo_Bar' ],
                                'title' => 'Foo_Bar',
-                               'redirect' => 'http://example.org/wiki/Foo_Bar',
+                               'redirect' => false,
                        ],
                        [
                                // View: Canonical with redundant query
                                'url' => 'http://example.org/wiki/Foo_Bar?action=view',
                                'query' => [ 'action' => 'view' ],
                                'title' => 'Foo_Bar',
-                               'redirect' => 'http://example.org/wiki/Foo_Bar',
+                               'redirect' => false,
                        ],
                        [
                                // Edit: Canonical view url with action query
@@ -104,7 +104,7 @@ class MediaWikiTest extends MediaWikiTestCase {
                                'url' => 'http://example.org/w/index.php?title=Foo_Bar&action=view',
                                'query' => [ 'title' => 'Foo_Bar', 'action' => 'view' ],
                                'title' => 'Foo_Bar',
-                               'redirect' => 'http://example.org/wiki/Foo_Bar',
+                               'redirect' => false,
                        ],
                        [
                                // Edit: Index with action query
index cc1708a..29c9e22 100644 (file)
@@ -266,11 +266,9 @@ class TestPageProps extends MediaWikiLangTestCase {
        }
 
        protected function setProperties( $pageID, $properties ) {
-
                $rows = [];
 
                foreach ( $properties as $propertyName => $propertyValue ) {
-
                        $row = [
                                'pp_page' => $pageID,
                                'pp_propname' => $propertyName,
@@ -295,11 +293,9 @@ class TestPageProps extends MediaWikiLangTestCase {
        }
 
        protected function setProperty( $pageID, $propertyName, $propertyValue ) {
-
                $properties = [];
                $properties[$propertyName] = $propertyValue;
 
                $this->setProperties( $pageID, $properties );
-
        }
 }
index 7c31384..02935a5 100644 (file)
@@ -32,7 +32,7 @@ class TestSample extends MediaWikiLangTestCase {
         * they run.  While MediaWiki isn't strictly an Agile Programming
         * project, you are encouraged to use the naming described under
         * "Agile Documentation" at
-        * http://www.phpunit.de/manual/3.4/en/other-uses-for-tests.html
+        * https://www.phpunit.de/manual/3.4/en/other-uses-for-tests.html
         */
        public function testTitleObjectStringConversion() {
                $title = Title::newFromText( "text" );
@@ -45,7 +45,7 @@ class TestSample extends MediaWikiLangTestCase {
 
        /**
         * If you want to run a the same test with a variety of data, use a data provider.
-        * see: http://www.phpunit.de/manual/3.4/en/writing-tests-for-phpunit.html
+        * see: https://www.phpunit.de/manual/3.4/en/writing-tests-for-phpunit.html
         */
        public static function provideTitles() {
                return [
@@ -60,7 +60,7 @@ class TestSample extends MediaWikiLangTestCase {
        // @codingStandardsIgnoreStart Generic.Files.LineLength
        /**
         * @dataProvider provideTitles
-        * See http://phpunit.de/manual/3.7/en/appendixes.annotations.html#appendixes.annotations.dataProvider
+        * See https://phpunit.de/manual/3.7/en/appendixes.annotations.html#appendixes.annotations.dataProvider
         */
        // @codingStandardsIgnoreEnd
        public function testCreateBasicListOfTitles( $titleName, $ns, $text ) {
@@ -89,7 +89,7 @@ class TestSample extends MediaWikiLangTestCase {
 
        /**
         * @depends testSetUpMainPageTitleForNextTest
-        * See http://phpunit.de/manual/3.7/en/appendixes.annotations.html#appendixes.annotations.depends
+        * See https://phpunit.de/manual/3.7/en/appendixes.annotations.html#appendixes.annotations.depends
         */
        public function testCheckMainPageTitleIsConsideredLocal( $title ) {
                $this->assertTrue( $title->isLocal() );
@@ -98,7 +98,7 @@ class TestSample extends MediaWikiLangTestCase {
        // @codingStandardsIgnoreStart Generic.Files.LineLength
        /**
         * @expectedException InvalidArgumentException
-        * See http://phpunit.de/manual/3.7/en/appendixes.annotations.html#appendixes.annotations.expectedException
+        * See https://phpunit.de/manual/3.7/en/appendixes.annotations.html#appendixes.annotations.expectedException
         */
        // @codingStandardsIgnoreEnd
        public function testTitleObjectFromObject() {
index c915b70..12db1a1 100644 (file)
@@ -134,19 +134,19 @@ class SanitizerTest extends MediaWikiTestCase {
                                'Self-closing closing div'
                        ],
                        // Make sure special nested HTML5 semantics are not broken
-                       // http://www.whatwg.org/html/text-level-semantics.html#the-kbd-element
+                       // https://html.spec.whatwg.org/multipage/semantics.html#the-kbd-element
                        [
                                '<kbd><kbd>Shift</kbd>+<kbd>F3</kbd></kbd>',
                                '<kbd><kbd>Shift</kbd>+<kbd>F3</kbd></kbd>',
                                'Nested <kbd>.'
                        ],
-                       // http://www.whatwg.org/html/text-level-semantics.html#the-sub-and-sup-elements
+                       // https://html.spec.whatwg.org/multipage/semantics.html#the-sub-and-sup-elements
                        [
                                '<var>x<sub><var>i</var></sub></var>, <var>y<sub><var>i</var></sub></var>',
                                '<var>x<sub><var>i</var></sub></var>, <var>y<sub><var>i</var></sub></var>',
                                'Nested <var>.'
                        ],
-                       // http://www.whatwg.org/html/text-level-semantics.html#the-dfn-element
+                       // https://html.spec.whatwg.org/multipage/semantics.html#the-dfn-element
                        [
                                '<dfn><abbr title="Garage Door Opener">GDO</abbr></dfn>',
                                '<dfn><abbr title="Garage Door Opener">GDO</abbr></dfn>',
index 9359568..152602a 100644 (file)
@@ -91,6 +91,5 @@ class TemplateCategoriesTest extends MediaWikiLangTestCase {
                        $title->getParentCategories(),
                        'Verify that the page is no longer in the category after template deletion'
                );
-
        }
 }
index 92446ed..93687df 100644 (file)
@@ -180,7 +180,9 @@ class WatchedItemQueryServiceUnitTest extends PHPUnit_Framework_TestCase {
                                        '(rc_this_oldid=page_latest) OR (rc_type=3)',
                                ],
                                $this->isType( 'string' ),
-                               [],
+                               [
+                                       'LIMIT' => 3,
+                               ],
                                [
                                        'watchlist' => [
                                                'INNER JOIN',
@@ -214,12 +216,184 @@ class WatchedItemQueryServiceUnitTest extends PHPUnit_Framework_TestCase {
                                        'rc_deleted' => 0,
                                        'wl_notificationtimestamp' => null,
                                ] ),
+                               $this->getFakeRow( [
+                                       'rc_id' => 3,
+                                       'rc_namespace' => 1,
+                                       'rc_title' => 'Foo3',
+                                       'rc_timestamp' => '20151212010103',
+                                       'rc_type' => RC_NEW,
+                                       'rc_deleted' => 0,
+                                       'wl_notificationtimestamp' => null,
+                               ] ),
                        ] ) );
 
                $queryService = new WatchedItemQueryService( $this->getMockLoadBalancer( $mockDb ) );
                $user = $this->getMockUnrestrictedNonAnonUserWithId( 1 );
 
-               $items = $queryService->getWatchedItemsWithRecentChangeInfo( $user );
+               $startFrom = null;
+               $items = $queryService->getWatchedItemsWithRecentChangeInfo(
+                       $user, [ 'limit' => 2 ], $startFrom
+               );
+
+               $this->assertInternalType( 'array', $items );
+               $this->assertCount( 2, $items );
+
+               foreach ( $items as list( $watchedItem, $recentChangeInfo ) ) {
+                       $this->assertInstanceOf( WatchedItem::class, $watchedItem );
+                       $this->assertInternalType( 'array', $recentChangeInfo );
+               }
+
+               $this->assertEquals(
+                       new WatchedItem( $user, new TitleValue( 0, 'Foo1' ), '20151212010101' ),
+                       $items[0][0]
+               );
+               $this->assertEquals(
+                       [
+                               'rc_id' => 1,
+                               'rc_namespace' => 0,
+                               'rc_title' => 'Foo1',
+                               'rc_timestamp' => '20151212010101',
+                               'rc_type' => RC_NEW,
+                               'rc_deleted' => 0,
+                       ],
+                       $items[0][1]
+               );
+
+               $this->assertEquals(
+                       new WatchedItem( $user, new TitleValue( 1, 'Foo2' ), null ),
+                       $items[1][0]
+               );
+               $this->assertEquals(
+                       [
+                               'rc_id' => 2,
+                               'rc_namespace' => 1,
+                               'rc_title' => 'Foo2',
+                               'rc_timestamp' => '20151212010102',
+                               'rc_type' => RC_NEW,
+                               'rc_deleted' => 0,
+                       ],
+                       $items[1][1]
+               );
+
+               $this->assertEquals( [ '20151212010103', 3 ], $startFrom );
+       }
+
+       public function testGetWatchedItemsWithRecentChangeInfo_extension() {
+               $mockDb = $this->getMockDb();
+               $mockDb->expects( $this->once() )
+                       ->method( 'select' )
+                       ->with(
+                               [ 'recentchanges', 'watchlist', 'page', 'extension_dummy_table' ],
+                               [
+                                       'rc_id',
+                                       'rc_namespace',
+                                       'rc_title',
+                                       'rc_timestamp',
+                                       'rc_type',
+                                       'rc_deleted',
+                                       'wl_notificationtimestamp',
+                                       'rc_cur_id',
+                                       'rc_this_oldid',
+                                       'rc_last_oldid',
+                                       'extension_dummy_field',
+                               ],
+                               [
+                                       'wl_user' => 1,
+                                       '(rc_this_oldid=page_latest) OR (rc_type=3)',
+                                       'extension_dummy_cond',
+                               ],
+                               $this->isType( 'string' ),
+                               [
+                                       'extension_dummy_option',
+                               ],
+                               [
+                                       'watchlist' => [
+                                               'INNER JOIN',
+                                               [
+                                                       'wl_namespace=rc_namespace',
+                                                       'wl_title=rc_title'
+                                               ]
+                                       ],
+                                       'page' => [
+                                               'LEFT JOIN',
+                                               'rc_cur_id=page_id',
+                                       ],
+                                       'extension_dummy_join_cond' => [],
+                               ]
+                       )
+                       ->will( $this->returnValue( [
+                               $this->getFakeRow( [
+                                       'rc_id' => 1,
+                                       'rc_namespace' => 0,
+                                       'rc_title' => 'Foo1',
+                                       'rc_timestamp' => '20151212010101',
+                                       'rc_type' => RC_NEW,
+                                       'rc_deleted' => 0,
+                                       'wl_notificationtimestamp' => '20151212010101',
+                               ] ),
+                               $this->getFakeRow( [
+                                       'rc_id' => 2,
+                                       'rc_namespace' => 1,
+                                       'rc_title' => 'Foo2',
+                                       'rc_timestamp' => '20151212010102',
+                                       'rc_type' => RC_NEW,
+                                       'rc_deleted' => 0,
+                                       'wl_notificationtimestamp' => null,
+                               ] ),
+                       ] ) );
+
+               $user = $this->getMockUnrestrictedNonAnonUserWithId( 1 );
+
+               $mockExtension = $this->getMockBuilder( WatchedItemQueryServiceExtension::class )
+                       ->getMock();
+               $mockExtension->expects( $this->once() )
+                       ->method( 'modifyWatchedItemsWithRCInfoQuery' )
+                       ->with(
+                               $this->identicalTo( $user ),
+                               $this->isType( 'array' ),
+                               $this->isInstanceOf( IDatabase::class ),
+                               $this->isType( 'array' ),
+                               $this->isType( 'array' ),
+                               $this->isType( 'array' ),
+                               $this->isType( 'array' ),
+                               $this->isType( 'array' )
+                       )
+                       ->will( $this->returnCallback( function (
+                               $user, $options, $db, &$tables, &$fields, &$conds, &$dbOptions, &$joinConds
+                       ) {
+                               $tables[] = 'extension_dummy_table';
+                               $fields[] = 'extension_dummy_field';
+                               $conds[] = 'extension_dummy_cond';
+                               $dbOptions[] = 'extension_dummy_option';
+                               $joinConds['extension_dummy_join_cond'] = [];
+                       } ) );
+               $mockExtension->expects( $this->once() )
+                       ->method( 'modifyWatchedItemsWithRCInfo' )
+                       ->with(
+                               $this->identicalTo( $user ),
+                               $this->isType( 'array' ),
+                               $this->isInstanceOf( IDatabase::class ),
+                               $this->isType( 'array' ),
+                               $this->anything(),
+                               $this->anything() // Can't test for null here, PHPUnit applies this after the callback
+                       )
+                       ->will( $this->returnCallback( function ( $user, $options, $db, &$items, $res, &$startFrom ) {
+                               foreach ( $items as $i => &$item ) {
+                                       $item[1]['extension_dummy_field'] = $i;
+                               }
+                               unset( $item );
+
+                               $this->assertNull( $startFrom );
+                               $startFrom = [ '20160203123456', 42 ];
+                       } ) );
+
+               $queryService = new WatchedItemQueryService( $this->getMockLoadBalancer( $mockDb ) );
+               TestingAccessWrapper::newFromObject( $queryService )->extensions = [ $mockExtension ];
+
+               $startFrom = null;
+               $items = $queryService->getWatchedItemsWithRecentChangeInfo(
+                       $user, [], $startFrom
+               );
 
                $this->assertInternalType( 'array', $items );
                $this->assertCount( 2, $items );
@@ -241,6 +415,7 @@ class WatchedItemQueryServiceUnitTest extends PHPUnit_Framework_TestCase {
                                'rc_timestamp' => '20151212010101',
                                'rc_type' => RC_NEW,
                                'rc_deleted' => 0,
+                               'extension_dummy_field' => 0,
                        ],
                        $items[0][1]
                );
@@ -257,93 +432,110 @@ class WatchedItemQueryServiceUnitTest extends PHPUnit_Framework_TestCase {
                                'rc_timestamp' => '20151212010102',
                                'rc_type' => RC_NEW,
                                'rc_deleted' => 0,
+                               'extension_dummy_field' => 1,
                        ],
                        $items[1][1]
                );
+
+               $this->assertEquals( [ '20160203123456', 42 ], $startFrom );
        }
 
        public function getWatchedItemsWithRecentChangeInfoOptionsProvider() {
                return [
                        [
                                [ 'includeFields' => [ WatchedItemQueryService::INCLUDE_FLAGS ] ],
+                               null,
                                [ 'rc_type', 'rc_minor', 'rc_bot' ],
                                [],
                                [],
                        ],
                        [
                                [ 'includeFields' => [ WatchedItemQueryService::INCLUDE_USER ] ],
+                               null,
                                [ 'rc_user_text' ],
                                [],
                                [],
                        ],
                        [
                                [ 'includeFields' => [ WatchedItemQueryService::INCLUDE_USER_ID ] ],
+                               null,
                                [ 'rc_user' ],
                                [],
                                [],
                        ],
                        [
                                [ 'includeFields' => [ WatchedItemQueryService::INCLUDE_COMMENT ] ],
+                               null,
                                [ 'rc_comment' ],
                                [],
                                [],
                        ],
                        [
                                [ 'includeFields' => [ WatchedItemQueryService::INCLUDE_PATROL_INFO ] ],
+                               null,
                                [ 'rc_patrolled', 'rc_log_type' ],
                                [],
                                [],
                        ],
                        [
                                [ 'includeFields' => [ WatchedItemQueryService::INCLUDE_SIZES ] ],
+                               null,
                                [ 'rc_old_len', 'rc_new_len' ],
                                [],
                                [],
                        ],
                        [
                                [ 'includeFields' => [ WatchedItemQueryService::INCLUDE_LOG_INFO ] ],
+                               null,
                                [ 'rc_logid', 'rc_log_type', 'rc_log_action', 'rc_params' ],
                                [],
                                [],
                        ],
                        [
                                [ 'namespaceIds' => [ 0, 1 ] ],
+                               null,
                                [],
                                [ 'wl_namespace' => [ 0, 1 ] ],
                                [],
                        ],
                        [
                                [ 'namespaceIds' => [ 0, "1; DROP TABLE watchlist;\n--" ] ],
+                               null,
                                [],
                                [ 'wl_namespace' => [ 0, 1 ] ],
                                [],
                        ],
                        [
                                [ 'rcTypes' => [ RC_EDIT, RC_NEW ] ],
+                               null,
                                [],
                                [ 'rc_type' => [ RC_EDIT, RC_NEW ] ],
                                [],
                        ],
                        [
                                [ 'dir' => WatchedItemQueryService::DIR_OLDER ],
+                               null,
                                [],
                                [],
                                [ 'ORDER BY' => [ 'rc_timestamp DESC', 'rc_id DESC' ] ]
                        ],
                        [
                                [ 'dir' => WatchedItemQueryService::DIR_NEWER ],
+                               null,
                                [],
                                [],
                                [ 'ORDER BY' => [ 'rc_timestamp', 'rc_id' ] ]
                        ],
                        [
                                [ 'dir' => WatchedItemQueryService::DIR_OLDER, 'start' => '20151212010101' ],
+                               null,
                                [],
                                [ "rc_timestamp <= '20151212010101'" ],
                                [ 'ORDER BY' => [ 'rc_timestamp DESC', 'rc_id DESC' ] ]
                        ],
                        [
                                [ 'dir' => WatchedItemQueryService::DIR_OLDER, 'end' => '20151212010101' ],
+                               null,
                                [],
                                [ "rc_timestamp >= '20151212010101'" ],
                                [ 'ORDER BY' => [ 'rc_timestamp DESC', 'rc_id DESC' ] ]
@@ -354,18 +546,21 @@ class WatchedItemQueryServiceUnitTest extends PHPUnit_Framework_TestCase {
                                        'start' => '20151212020101',
                                        'end' => '20151212010101'
                                ],
+                               null,
                                [],
                                [ "rc_timestamp <= '20151212020101'", "rc_timestamp >= '20151212010101'" ],
                                [ 'ORDER BY' => [ 'rc_timestamp DESC', 'rc_id DESC' ] ]
                        ],
                        [
                                [ 'dir' => WatchedItemQueryService::DIR_NEWER, 'start' => '20151212010101' ],
+                               null,
                                [],
                                [ "rc_timestamp >= '20151212010101'" ],
                                [ 'ORDER BY' => [ 'rc_timestamp', 'rc_id' ] ]
                        ],
                        [
                                [ 'dir' => WatchedItemQueryService::DIR_NEWER, 'end' => '20151212010101' ],
+                               null,
                                [],
                                [ "rc_timestamp <= '20151212010101'" ],
                                [ 'ORDER BY' => [ 'rc_timestamp', 'rc_id' ] ]
@@ -376,96 +571,112 @@ class WatchedItemQueryServiceUnitTest extends PHPUnit_Framework_TestCase {
                                        'start' => '20151212010101',
                                        'end' => '20151212020101'
                                ],
+                               null,
                                [],
                                [ "rc_timestamp >= '20151212010101'", "rc_timestamp <= '20151212020101'" ],
                                [ 'ORDER BY' => [ 'rc_timestamp', 'rc_id' ] ]
                        ],
                        [
                                [ 'limit' => 10 ],
+                               null,
                                [],
                                [],
-                               [ 'LIMIT' => 10 ],
+                               [ 'LIMIT' => 11 ],
                        ],
                        [
                                [ 'limit' => "10; DROP TABLE watchlist;\n--" ],
+                               null,
                                [],
                                [],
-                               [ 'LIMIT' => 10 ],
+                               [ 'LIMIT' => 11 ],
                        ],
                        [
                                [ 'filters' => [ WatchedItemQueryService::FILTER_MINOR ] ],
+                               null,
                                [],
                                [ 'rc_minor != 0' ],
                                [],
                        ],
                        [
                                [ 'filters' => [ WatchedItemQueryService::FILTER_NOT_MINOR ] ],
+                               null,
                                [],
                                [ 'rc_minor = 0' ],
                                [],
                        ],
                        [
                                [ 'filters' => [ WatchedItemQueryService::FILTER_BOT ] ],
+                               null,
                                [],
                                [ 'rc_bot != 0' ],
                                [],
                        ],
                        [
                                [ 'filters' => [ WatchedItemQueryService::FILTER_NOT_BOT ] ],
+                               null,
                                [],
                                [ 'rc_bot = 0' ],
                                [],
                        ],
                        [
                                [ 'filters' => [ WatchedItemQueryService::FILTER_ANON ] ],
+                               null,
                                [],
                                [ 'rc_user = 0' ],
                                [],
                        ],
                        [
                                [ 'filters' => [ WatchedItemQueryService::FILTER_NOT_ANON ] ],
+                               null,
                                [],
                                [ 'rc_user != 0' ],
                                [],
                        ],
                        [
                                [ 'filters' => [ WatchedItemQueryService::FILTER_PATROLLED ] ],
+                               null,
                                [],
                                [ 'rc_patrolled != 0' ],
                                [],
                        ],
                        [
                                [ 'filters' => [ WatchedItemQueryService::FILTER_NOT_PATROLLED ] ],
+                               null,
                                [],
                                [ 'rc_patrolled = 0' ],
                                [],
                        ],
                        [
                                [ 'filters' => [ WatchedItemQueryService::FILTER_UNREAD ] ],
+                               null,
                                [],
                                [ 'rc_timestamp >= wl_notificationtimestamp' ],
                                [],
                        ],
                        [
                                [ 'filters' => [ WatchedItemQueryService::FILTER_NOT_UNREAD ] ],
+                               null,
                                [],
                                [ 'wl_notificationtimestamp IS NULL OR rc_timestamp < wl_notificationtimestamp' ],
                                [],
                        ],
                        [
                                [ 'onlyByUser' => 'SomeOtherUser' ],
+                               null,
                                [],
                                [ 'rc_user_text' => 'SomeOtherUser' ],
                                [],
                        ],
                        [
                                [ 'notByUser' => 'SomeOtherUser' ],
+                               null,
                                [],
                                [ "rc_user_text != 'SomeOtherUser'" ],
                                [],
                        ],
                        [
-                               [ 'startFrom' => [ '20151212010101', 123 ], 'dir' => WatchedItemQueryService::DIR_OLDER ],
+                               [ 'dir' => WatchedItemQueryService::DIR_OLDER ],
+                               [ '20151212010101', 123 ],
                                [],
                                [
                                        "(rc_timestamp < '20151212010101') OR ((rc_timestamp = '20151212010101') AND (rc_id <= 123))"
@@ -473,7 +684,8 @@ class WatchedItemQueryServiceUnitTest extends PHPUnit_Framework_TestCase {
                                [ 'ORDER BY' => [ 'rc_timestamp DESC', 'rc_id DESC' ] ],
                        ],
                        [
-                               [ 'startFrom' => [ '20151212010101', 123 ], 'dir' => WatchedItemQueryService::DIR_NEWER ],
+                               [ 'dir' => WatchedItemQueryService::DIR_NEWER ],
+                               [ '20151212010101', 123 ],
                                [],
                                [
                                        "(rc_timestamp > '20151212010101') OR ((rc_timestamp = '20151212010101') AND (rc_id >= 123))"
@@ -481,10 +693,8 @@ class WatchedItemQueryServiceUnitTest extends PHPUnit_Framework_TestCase {
                                [ 'ORDER BY' => [ 'rc_timestamp', 'rc_id' ] ],
                        ],
                        [
-                               [
-                                       'startFrom' => [ '20151212010101', "123; DROP TABLE watchlist;\n--" ],
-                                       'dir' => WatchedItemQueryService::DIR_OLDER
-                               ],
+                               [ 'dir' => WatchedItemQueryService::DIR_OLDER ],
+                               [ '20151212010101', "123; DROP TABLE watchlist;\n--" ],
                                [],
                                [
                                        "(rc_timestamp < '20151212010101') OR ((rc_timestamp = '20151212010101') AND (rc_id <= 123))"
@@ -499,6 +709,7 @@ class WatchedItemQueryServiceUnitTest extends PHPUnit_Framework_TestCase {
         */
        public function testGetWatchedItemsWithRecentChangeInfo_optionsAndEmptyResult(
                array $options,
+               $startFrom,
                array $expectedExtraFields,
                array $expectedExtraConds,
                array $expectedDbOptions
@@ -552,9 +763,10 @@ class WatchedItemQueryServiceUnitTest extends PHPUnit_Framework_TestCase {
                $queryService = new WatchedItemQueryService( $this->getMockLoadBalancer( $mockDb ) );
                $user = $this->getMockUnrestrictedNonAnonUserWithId( 1 );
 
-               $items = $queryService->getWatchedItemsWithRecentChangeInfo( $user, $options );
+               $items = $queryService->getWatchedItemsWithRecentChangeInfo( $user, $options, $startFrom );
 
                $this->assertEmpty( $items );
+               $this->assertNull( $startFrom );
        }
 
        public function filterPatrolledOptionProvider() {
@@ -797,53 +1009,62 @@ class WatchedItemQueryServiceUnitTest extends PHPUnit_Framework_TestCase {
                return [
                        [
                                [ 'rcTypes' => [ 1337 ] ],
+                               null,
                                'Bad value for parameter $options[\'rcTypes\']',
                        ],
                        [
                                [ 'rcTypes' => [ 'edit' ] ],
+                               null,
                                'Bad value for parameter $options[\'rcTypes\']',
                        ],
                        [
                                [ 'rcTypes' => [ RC_EDIT, 1337 ] ],
+                               null,
                                'Bad value for parameter $options[\'rcTypes\']',
                        ],
                        [
                                [ 'dir' => 'foo' ],
+                               null,
                                'Bad value for parameter $options[\'dir\']',
                        ],
                        [
                                [ 'start' => '20151212010101' ],
+                               null,
                                'Bad value for parameter $options[\'dir\']: must be provided',
                        ],
                        [
                                [ 'end' => '20151212010101' ],
+                               null,
                                'Bad value for parameter $options[\'dir\']: must be provided',
                        ],
                        [
-                               [ 'startFrom' => [ '20151212010101', 123 ] ],
+                               [],
+                               [ '20151212010101', 123 ],
                                'Bad value for parameter $options[\'dir\']: must be provided',
                        ],
                        [
-                               [ 'dir' => WatchedItemQueryService::DIR_OLDER, 'startFrom' => '20151212010101' ],
-                               'Bad value for parameter $options[\'startFrom\']: must be a two-element array',
+                               [ 'dir' => WatchedItemQueryService::DIR_OLDER ],
+                               '20151212010101',
+                               'Bad value for parameter $startFrom: must be a two-element array',
                        ],
                        [
-                               [ 'dir' => WatchedItemQueryService::DIR_OLDER, 'startFrom' => [ '20151212010101' ] ],
-                               'Bad value for parameter $options[\'startFrom\']: must be a two-element array',
+                               [ 'dir' => WatchedItemQueryService::DIR_OLDER ],
+                               [ '20151212010101' ],
+                               'Bad value for parameter $startFrom: must be a two-element array',
                        ],
                        [
-                               [
-                                       'dir' => WatchedItemQueryService::DIR_OLDER,
-                                       'startFrom' => [ '20151212010101', 123, 'foo' ]
-                               ],
-                               'Bad value for parameter $options[\'startFrom\']: must be a two-element array',
+                               [ 'dir' => WatchedItemQueryService::DIR_OLDER ],
+                               [ '20151212010101', 123, 'foo' ],
+                               'Bad value for parameter $startFrom: must be a two-element array',
                        ],
                        [
                                [ 'watchlistOwner' => $this->getMockUnrestrictedNonAnonUserWithId( 2 ) ],
+                               null,
                                'Bad value for parameter $options[\'watchlistOwnerToken\']',
                        ],
                        [
                                [ 'watchlistOwner' => 'Other User', 'watchlistOwnerToken' => 'some-token' ],
+                               null,
                                'Bad value for parameter $options[\'watchlistOwner\']',
                        ],
                ];
@@ -854,6 +1075,7 @@ class WatchedItemQueryServiceUnitTest extends PHPUnit_Framework_TestCase {
         */
        public function testGetWatchedItemsWithRecentChangeInfo_invalidOptions(
                array $options,
+               $startFrom,
                $expectedInExceptionMessage
        ) {
                $mockDb = $this->getMockDb();
@@ -864,7 +1086,7 @@ class WatchedItemQueryServiceUnitTest extends PHPUnit_Framework_TestCase {
                $user = $this->getMockUnrestrictedNonAnonUserWithId( 1 );
 
                $this->setExpectedException( InvalidArgumentException::class, $expectedInExceptionMessage );
-               $queryService->getWatchedItemsWithRecentChangeInfo( $user, $options );
+               $queryService->getWatchedItemsWithRecentChangeInfo( $user, $options, $startFrom );
        }
 
        public function testGetWatchedItemsWithRecentChangeInfo_usedInGeneratorOptionAndEmptyResult() {
index 6da16a0..3ad16d1 100644 (file)
@@ -195,7 +195,6 @@ class ApiContinuationManagerTest extends MediaWikiTestCase {
                                'Expected exception'
                        );
                }
-
        }
 
 }
index 48472cf..98e24fb 100644 (file)
@@ -1230,7 +1230,6 @@ class ApiResultTest extends MediaWikiTestCase {
                                ],
                        ],
                ];
-
        }
 
        /**
@@ -1380,7 +1379,6 @@ class ApiResultTest extends MediaWikiTestCase {
                        'two' => 2,
                ], $arr['foo'] );
        }
-
 }
 
 class ApiResultTestStringifiableObject {
index 6359983..d8282be 100644 (file)
@@ -25,7 +25,6 @@ class ApiRevisionDeleteTest extends ApiTestCase {
                        $this->revs[] = Title::newFromText( self::$page )
                                ->getLatestRevID( Title::GAID_FOR_UPDATE );
                }
-
        }
 
        public function testHidingRevisions() {
index 13486e2..f57db11 100644 (file)
@@ -695,7 +695,6 @@ class AuthManagerTest extends \MediaWikiTestCase {
                                $ex->getMessage()
                        );
                }
-
        }
 
        public function testBeginAuthentication() {
@@ -3265,7 +3264,6 @@ class AuthManagerTest extends \MediaWikiTestCase {
                $this->manager->removeAuthenticationSessionData( null );
                $this->assertNull( $this->manager->getAuthenticationSessionData( 'foo' ) );
                $this->assertNull( $this->manager->getAuthenticationSessionData( 'bar' ) );
-
        }
 
        public function testCanLinkAccounts() {
index c52c3e9..ec4bea1 100644 (file)
@@ -104,6 +104,5 @@ class EmailNotificationSecondaryAuthenticationProviderTest extends \PHPUnit_Fram
                $authManager->setAuthenticationSessionData( 'no-email', true );
                $provider->setManager( $authManager );
                $provider->beginSecondaryAccountCreation( $userNotExpectsConfirmation, $creator, [] );
-
        }
 }
index 088dd00..caf1680 100644 (file)
@@ -328,7 +328,6 @@ class LocalPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestCase
                        AuthenticationResponse::newPass( $userName ),
                        $provider->beginPrimaryAuthentication( $reqs )
                );
-
        }
 
        /**
@@ -645,7 +644,6 @@ class LocalPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestCase
                $this->assertNull( $provider->finishAccountCreation( $user, $user, $res2 ) );
                $ret = $provider->beginPrimaryAuthentication( $reqs );
                $this->assertEquals( AuthenticationResponse::PASS, $ret->status, 'new password is set' );
-
        }
 
 }
index bc78c08..d4ebe34 100644 (file)
@@ -347,7 +347,6 @@ class TemporaryPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestC
                        'wrongpassword',
                        $ret->message->getKey()
                );
-
        }
 
        /**
index 7fe3351..7dea123 100644 (file)
@@ -36,7 +36,6 @@ class UserDataAuthenticationRequestTest extends AuthenticationRequestTestCase {
                        $this->assertSame( $email ?: 'default@example.com', $user->getEmail() );
                        $this->assertSame( $realname ?: 'Fake Name', $user->getRealName() );
                }
-
        }
 
        public static function providePopulateUser() {
index aed2d83..d8773f8 100644 (file)
@@ -58,17 +58,18 @@ class LBFactoryTest extends MediaWikiTestCase {
        }
 
        public function testLBFactorySimpleServer() {
-               global $wgDBserver, $wgDBname, $wgDBuser, $wgDBpassword, $wgDBtype;
+               global $wgDBserver, $wgDBname, $wgDBuser, $wgDBpassword, $wgDBtype, $wgSQLiteDataDir;
 
                $servers = [
                        [
-                               'host'      => $wgDBserver,
-                               'dbname'    => $wgDBname,
-                               'user'      => $wgDBuser,
-                               'password'  => $wgDBpassword,
-                               'type'      => $wgDBtype,
-                               'load'      => 0,
-                               'flags'     => DBO_TRX // REPEATABLE-READ for consistency
+                               'host'        => $wgDBserver,
+                               'dbname'      => $wgDBname,
+                               'user'        => $wgDBuser,
+                               'password'    => $wgDBpassword,
+                               'type'        => $wgDBtype,
+                               'dbDirectory' => $wgSQLiteDataDir,
+                               'load'        => 0,
+                               'flags'       => DBO_TRX // REPEATABLE-READ for consistency
                        ],
                ];
 
@@ -86,26 +87,28 @@ class LBFactoryTest extends MediaWikiTestCase {
        }
 
        public function testLBFactorySimpleServers() {
-               global $wgDBserver, $wgDBname, $wgDBuser, $wgDBpassword, $wgDBtype;
+               global $wgDBserver, $wgDBname, $wgDBuser, $wgDBpassword, $wgDBtype, $wgSQLiteDataDir;
 
                $servers = [
                        [ // master
-                               'host'     => $wgDBserver,
-                               'dbname'   => $wgDBname,
-                               'user'     => $wgDBuser,
-                               'password' => $wgDBpassword,
-                               'type'     => $wgDBtype,
-                               'load'     => 0,
-                               'flags'    => DBO_TRX // REPEATABLE-READ for consistency
+                               'host'        => $wgDBserver,
+                               'dbname'      => $wgDBname,
+                               'user'        => $wgDBuser,
+                               'password'    => $wgDBpassword,
+                               'type'        => $wgDBtype,
+                               'dbDirectory' => $wgSQLiteDataDir,
+                               'load'        => 0,
+                               'flags'       => DBO_TRX // REPEATABLE-READ for consistency
                        ],
                        [ // emulated slave
-                               'host'     => $wgDBserver,
-                               'dbname'   => $wgDBname,
-                               'user'     => $wgDBuser,
-                               'password' => $wgDBpassword,
-                               'type'     => $wgDBtype,
-                               'load'     => 100,
-                               'flags'    => DBO_TRX // REPEATABLE-READ for consistency
+                               'host'        => $wgDBserver,
+                               'dbname'      => $wgDBname,
+                               'user'        => $wgDBuser,
+                               'password'    => $wgDBpassword,
+                               'type'        => $wgDBtype,
+                               'dbDirectory' => $wgSQLiteDataDir,
+                               'load'        => 100,
+                               'flags'       => DBO_TRX // REPEATABLE-READ for consistency
                        ]
                ];
 
@@ -118,19 +121,23 @@ class LBFactoryTest extends MediaWikiTestCase {
                $dbw = $lb->getConnection( DB_MASTER );
                $this->assertTrue( $dbw->getLBInfo( 'master' ), 'master shows as master' );
                $this->assertEquals(
-                       $wgDBserver, $dbw->getLBInfo( 'clusterMasterHost' ), 'cluster master set' );
+                       ( $wgDBserver != '' ) ? $wgDBserver : 'localhost',
+                       $dbw->getLBInfo( 'clusterMasterHost' ),
+                       'cluster master set' );
 
                $dbr = $lb->getConnection( DB_SLAVE );
                $this->assertTrue( $dbr->getLBInfo( 'replica' ), 'slave shows as slave' );
                $this->assertEquals(
-                       $wgDBserver, $dbr->getLBInfo( 'clusterMasterHost' ), 'cluster master set' );
+                       ( $wgDBserver != '' ) ? $wgDBserver : 'localhost',
+                       $dbr->getLBInfo( 'clusterMasterHost' ),
+                       'cluster master set' );
 
                $factory->shutdown();
                $lb->closeAll();
        }
 
        public function testLBFactoryMulti() {
-               global $wgDBserver, $wgDBname, $wgDBuser, $wgDBpassword, $wgDBtype;
+               global $wgDBserver, $wgDBname, $wgDBuser, $wgDBpassword, $wgDBtype, $wgSQLiteDataDir;
 
                $factory = new LBFactoryMulti( [
                        'sectionsByDB' => [],
@@ -145,6 +152,7 @@ class LBFactoryTest extends MediaWikiTestCase {
                                'user'            => $wgDBuser,
                                'password'        => $wgDBpassword,
                                'type'            => $wgDBtype,
+                               'dbDirectory' => $wgSQLiteDataDir,
                                'flags'           => DBO_DEFAULT
                        ],
                        'hostsByName' => [
@@ -233,7 +241,7 @@ class LBFactoryTest extends MediaWikiTestCase {
        }
 
        private function newLBFactoryMulti( array $baseOverride = [], array $serverOverride = [] ) {
-               global $wgDBserver, $wgDBuser, $wgDBpassword, $wgDBname, $wgDBtype;
+               global $wgDBserver, $wgDBuser, $wgDBpassword, $wgDBname, $wgDBtype, $wgSQLiteDataDir;
 
                return new LBFactoryMulti( $baseOverride + [
                        'sectionsByDB' => [],
@@ -247,6 +255,7 @@ class LBFactoryTest extends MediaWikiTestCase {
                                'user' => $wgDBuser,
                                'password' => $wgDBpassword,
                                'type' => $wgDBtype,
+                               'dbDirectory' => $wgSQLiteDataDir,
                                'flags' => DBO_DEFAULT
                        ],
                        'hostsByName' => [
@@ -258,17 +267,32 @@ class LBFactoryTest extends MediaWikiTestCase {
        }
 
        public function testNiceDomains() {
-               global $wgDBname;
+               global $wgDBname, $wgDBtype;
+
+               if ( $wgDBtype === 'sqlite' ) {
+                       $tmpDir = $this->getNewTempDirectory();
+                       $dbPath = "$tmpDir/unit_test_db.sqlite";
+                       file_put_contents( $dbPath, '' );
+                       $tempFsFile = new TempFSFile( $dbPath );
+                       $tempFsFile->autocollect();
+               } else {
+                       $dbPath = null;
+               }
 
-               $factory = $this->newLBFactoryMulti();
+               $factory = $this->newLBFactoryMulti(
+                       [],
+                       [ 'dbFilePath' => $dbPath ]
+               );
                $lb = $factory->getMainLB();
 
-               $db = $lb->getConnectionRef( DB_MASTER );
-               $this->assertEquals(
-                       $wgDBname,
-                       $db->getDomainID()
-               );
-               unset( $db );
+               if ( $wgDBtype !== 'sqlite' ) {
+                       $db = $lb->getConnectionRef( DB_MASTER );
+                       $this->assertEquals(
+                               $wgDBname,
+                               $db->getDomainID()
+                       );
+                       unset( $db );
+               }
 
                /** @var Database $db */
                $db = $lb->getConnection( DB_MASTER, [], '' );
@@ -280,19 +304,19 @@ class LBFactoryTest extends MediaWikiTestCase {
                );
 
                $this->assertEquals(
-                       $db->addIdentifierQuotes( 'page' ),
+                       $this->quoteTable( $db, 'page' ),
                        $db->tableName( 'page' ),
                        "Correct full table name"
                );
 
                $this->assertEquals(
-                       $db->addIdentifierQuotes( $wgDBname ) . '.' . $db->addIdentifierQuotes( 'page' ),
+                       $this->quoteTable( $db, $wgDBname ) . '.' . $this->quoteTable( $db, 'page' ),
                        $db->tableName( "$wgDBname.page" ),
                        "Correct full table name"
                );
 
                $this->assertEquals(
-                       $db->addIdentifierQuotes( 'nice_db' ) . '.' . $db->addIdentifierQuotes( 'page' ),
+                       $this->quoteTable( $db, 'nice_db' ) . '.' . $this->quoteTable( $db, 'page' ),
                        $db->tableName( 'nice_db.page' ),
                        "Correct full table name"
                );
@@ -303,12 +327,12 @@ class LBFactoryTest extends MediaWikiTestCase {
                        $db->getDomainID()
                );
                $this->assertEquals(
-                       $db->addIdentifierQuotes( 'my_page' ),
+                       $this->quoteTable( $db, 'my_page' ),
                        $db->tableName( 'page' ),
                        "Correct full table name"
                );
                $this->assertEquals(
-                       $db->addIdentifierQuotes( 'other_nice_db' ) . '.' . $db->addIdentifierQuotes( 'page' ),
+                       $this->quoteTable( $db, 'other_nice_db' ) . '.' . $this->quoteTable( $db, 'page' ),
                        $db->tableName( 'other_nice_db.page' ),
                        "Correct full table name"
                );
@@ -318,9 +342,23 @@ class LBFactoryTest extends MediaWikiTestCase {
        }
 
        public function testTrickyDomain() {
+               global $wgDBtype;
+
+               if ( $wgDBtype === 'sqlite' ) {
+                       $tmpDir = $this->getNewTempDirectory();
+                       $dbPath = "$tmpDir/unit_test_db.sqlite";
+                       file_put_contents( $dbPath, '' );
+                       $tempFsFile = new TempFSFile( $dbPath );
+                       $tempFsFile->autocollect();
+               } else {
+                       $dbPath = null;
+               }
+
                $dbname = 'unittest-domain';
                $factory = $this->newLBFactoryMulti(
-                       [ 'localDomain' => $dbname ], [ 'dbname' => $dbname ] );
+                       [ 'localDomain' => $dbname ],
+                       [ 'dbname' => $dbname, 'dbFilePath' => $dbPath ]
+               );
                $lb = $factory->getMainLB();
                /** @var Database $db */
                $db = $lb->getConnection( DB_MASTER, [], '' );
@@ -332,19 +370,19 @@ class LBFactoryTest extends MediaWikiTestCase {
                );
 
                $this->assertEquals(
-                       $db->addIdentifierQuotes( 'page' ),
+                       $this->quoteTable( $db, 'page' ),
                        $db->tableName( 'page' ),
                        "Correct full table name"
                );
 
                $this->assertEquals(
-                       $db->addIdentifierQuotes( $dbname ) . '.' . $db->addIdentifierQuotes( 'page' ),
+                       $this->quoteTable( $db, $dbname ) . '.' . $this->quoteTable( $db, 'page' ),
                        $db->tableName( "$dbname.page" ),
                        "Correct full table name"
                );
 
                $this->assertEquals(
-                       $db->addIdentifierQuotes( 'nice_db' ) . '.' . $db->addIdentifierQuotes( 'page' ),
+                       $this->quoteTable( $db, 'nice_db' ) . '.' . $this->quoteTable( $db, 'page' ),
                        $db->tableName( 'nice_db.page' ),
                        "Correct full table name"
                );
@@ -352,12 +390,12 @@ class LBFactoryTest extends MediaWikiTestCase {
                $factory->setDomainPrefix( 'my_' );
 
                $this->assertEquals(
-                       $db->addIdentifierQuotes( 'my_page' ),
+                       $this->quoteTable( $db, 'my_page' ),
                        $db->tableName( 'page' ),
                        "Correct full table name"
                );
                $this->assertEquals(
-                       $db->addIdentifierQuotes( 'other_nice_db' ) . '.' . $db->addIdentifierQuotes( 'page' ),
+                       $this->quoteTable( $db, 'other_nice_db' ) . '.' . $this->quoteTable( $db, 'page' ),
                        $db->tableName( 'other_nice_db.page' ),
                        "Correct full table name"
                );
@@ -367,7 +405,7 @@ class LBFactoryTest extends MediaWikiTestCase {
                \MediaWiki\restoreWarnings();
 
                $this->assertEquals(
-                       $db->addIdentifierQuotes( 'garbage-db' ) . '.' . $db->addIdentifierQuotes( 'page' ),
+                       $this->quoteTable( $db, 'garbage-db' ) . '.' . $this->quoteTable( $db, 'page' ),
                        $db->tableName( 'garbage-db.page' ),
                        "Correct full table name"
                );
@@ -375,4 +413,12 @@ class LBFactoryTest extends MediaWikiTestCase {
                $factory->closeAll();
                $factory->destroy();
        }
+
+       private function quoteTable( Database $db, $table ) {
+               if ( $db->getType() === 'sqlite' ) {
+                       return $table;
+               } else {
+                       return $db->addIdentifierQuotes( $table );
+               }
+       }
 }
index 0e87ffa..7c36f7d 100644 (file)
@@ -173,7 +173,6 @@ class MWExceptionTest extends MediaWikiTestCase {
         * @dataProvider provideJsonSerializedKeys
         */
        public function testJsonserializeexceptionKeys( $expectedKeyType, $exClass, $key ) {
-
                # Make sure we log a backtrace:
                $this->setMwGlobals( [ 'wgLogExceptionBacktrace' => true ] );
 
@@ -235,7 +234,6 @@ class MWExceptionTest extends MediaWikiTestCase {
                        MWExceptionHandler::jsonSerializeException( new Exception() )
                );
                $this->assertObjectNotHasAttribute( 'backtrace', $json );
-
        }
 
 }
index 22d52f0..2a75cf4 100644 (file)
@@ -103,7 +103,7 @@ class FakeDatabase extends Database {
 
        /**
         * Get the number of fields in a result object
-        * @see http://www.php.net/mysql_num_fields
+        * @see https://secure.php.net/mysql_num_fields
         *
         * @param mixed $res A SQL result
         * @return int
@@ -114,7 +114,7 @@ class FakeDatabase extends Database {
 
        /**
         * Get a field name in a result object
-        * @see http://www.php.net/mysql_field_name
+        * @see https://secure.php.net/mysql_field_name
         *
         * @param mixed $res A SQL result
         * @param int $n
@@ -142,7 +142,7 @@ class FakeDatabase extends Database {
 
        /**
         * Change the position of the cursor in a result object
-        * @see http://www.php.net/mysql_data_seek
+        * @see https://secure.php.net/mysql_data_seek
         *
         * @param mixed $res A SQL result
         * @param int $row
@@ -153,7 +153,7 @@ class FakeDatabase extends Database {
 
        /**
         * Get the last error number
-        * @see http://www.php.net/mysql_errno
+        * @see https://secure.php.net/mysql_errno
         *
         * @return int
         */
@@ -163,7 +163,7 @@ class FakeDatabase extends Database {
 
        /**
         * Get a description of the last error
-        * @see http://www.php.net/mysql_error
+        * @see https://secure.php.net/mysql_error
         *
         * @return string
         */
@@ -197,7 +197,7 @@ class FakeDatabase extends Database {
 
        /**
         * Get the number of rows affected by the last write query
-        * @see http://www.php.net/mysql_affected_rows
+        * @see https://secure.php.net/mysql_affected_rows
         *
         * @return int
         */
@@ -217,7 +217,7 @@ class FakeDatabase extends Database {
 
        /**
         * Returns a wikitext link to the DB's website, e.g.,
-        *   return "[http://www.mysql.com/ MySQL]";
+        *   return "[https://www.mysql.com/ MySQL]";
         * Should at least contain plain text, if for some reason
         * your database has no website.
         *
diff --git a/tests/phpunit/includes/interwiki/InterwikiLookupAdapterTest.php b/tests/phpunit/includes/interwiki/InterwikiLookupAdapterTest.php
new file mode 100644 (file)
index 0000000..4754b04
--- /dev/null
@@ -0,0 +1,117 @@
+<?php
+
+/**
+ * @covers MediaWiki\Interwiki\InterwikiLookupAdapter
+ *
+ * @group MediaWiki
+ * @group Interwiki
+ */
+use MediaWiki\Interwiki\InterwikiLookupAdapter;
+
+class InterwikiLookupAdapterTest extends MediaWikiTestCase {
+
+       /**
+        * @var InterwikiLookupAdapter
+        */
+       private $interwikiLookup;
+
+       protected function setUp() {
+               parent::setUp();
+
+               $this->interwikiLookup = new InterwikiLookupAdapter(
+                       $this->getSiteLookup( $this->getSites() )
+               );
+       }
+
+       public function testIsValidInterwiki() {
+               $this->assertTrue(
+                       $this->interwikiLookup->isValidInterwiki( 'enwt' ),
+                       'enwt known prefix is valid'
+               );
+               $this->assertTrue(
+                       $this->interwikiLookup->isValidInterwiki( 'foo' ),
+                       'foo site known prefix is valid'
+               );
+               $this->assertFalse(
+                       $this->interwikiLookup->isValidInterwiki( 'xyz' ),
+                       'unknown prefix is not valid'
+               );
+       }
+
+       public function testFetch() {
+
+               $interwiki = $this->interwikiLookup->fetch( '' );
+               $this->assertNull( $interwiki );
+
+               $interwiki = $this->interwikiLookup->fetch( 'xyz' );
+               $this->assertFalse( $interwiki );
+
+               $interwiki = $this->interwikiLookup->fetch( 'foo' );
+               $this->assertInstanceOf( Interwiki::class, $interwiki );
+               $this->assertSame( 'foobar', $interwiki->getWikiID() );
+
+               $interwiki = $this->interwikiLookup->fetch( 'enwt' );
+               $this->assertInstanceOf( Interwiki::class, $interwiki );
+
+               $this->assertSame( 'https://en.wiktionary.org/wiki/$1', $interwiki->getURL(), 'getURL' );
+               $this->assertSame( 'https://en.wiktionary.org/w/api.php', $interwiki->getAPI(), 'getAPI' );
+               $this->assertSame( 'enwiktionary', $interwiki->getWikiID(), 'getWikiID' );
+               $this->assertTrue( $interwiki->isLocal(), 'isLocal' );
+       }
+
+       public function testGetAllPrefixes() {
+               $this->assertEquals(
+                       [ 'foo', 'enwt' ],
+                       $this->interwikiLookup->getAllPrefixes(),
+                       'getAllPrefixes()'
+               );
+
+               $this->assertEquals(
+                       [ 'foo' ],
+                       $this->interwikiLookup->getAllPrefixes( false ),
+                       'get external prefixes'
+               );
+
+               $this->assertEquals(
+                       [ 'enwt' ],
+                       $this->interwikiLookup->getAllPrefixes( true ),
+                       'get local prefixes'
+               );
+       }
+
+       private function getSiteLookup( SiteList $sites ) {
+               $siteLookup = $this->getMockBuilder( SiteLookup::class )
+                       ->disableOriginalConstructor()
+                       ->getMock();
+
+               $siteLookup->expects( $this->any() )
+                       ->method( 'getSites' )
+                       ->will( $this->returnValue( $sites ) );
+
+               return $siteLookup;
+       }
+
+       private function getSites() {
+               $sites = [];
+
+               $site = new Site();
+               $site->setGlobalId( 'foobar' );
+               $site->addInterwikiId( 'foo' );
+               $site->setSource( 'external' );
+               $sites[] = $site;
+
+               $site = new MediaWikiSite();
+               $site->setGlobalId( 'enwiktionary' );
+               $site->setGroup( 'wiktionary' );
+               $site->setLanguageCode( 'en' );
+               $site->addNavigationId( 'enwiktionary' );
+               $site->addInterwikiId( 'enwt' );
+               $site->setSource( 'local' );
+               $site->setPath( MediaWikiSite::PATH_PAGE, "https://en.wiktionary.org/wiki/$1" );
+               $site->setPath( MediaWikiSite::PATH_FILE, "https://en.wiktionary.org/w/$1" );
+               $sites[] = $site;
+
+               return new SiteList( $sites );
+       }
+
+}
index 01b575c..d252c80 100644 (file)
@@ -146,7 +146,7 @@ class FormatJsonTest extends MediaWikiTestCase {
         * @return stdClass|string|bool|int|float|null
         */
        public static function toObject( $value ) {
-               return !is_array( $value ) ? $value : (object) array_map( __METHOD__, $value );
+               return !is_array( $value ) ? $value : (object)array_map( __METHOD__, $value );
        }
 
        /**
index 5f5a1e8..366714b 100644 (file)
@@ -129,8 +129,8 @@ class CSSMinTest extends MediaWikiTestCase {
         * @covers CSSMin::remap
         */
        public function testRemapRemapping( $message, $input, $expectedOutput ) {
-               $localPath = __DIR__ . '/../../data/cssmin/';
-               $remotePath = 'http://localhost/w/';
+               $localPath = __DIR__ . '/../../data/cssmin';
+               $remotePath = 'http://localhost/w';
 
                $realOutput = CSSMin::remap( $input, $localPath, $remotePath );
                $this->assertEquals( $expectedOutput, $realOutput, "CSSMin::remap: $message" );
index 70c0ece..6d096c2 100644 (file)
@@ -24,7 +24,6 @@ class LinkRendererTest extends MediaWikiLangTestCase {
                        'wgScript' => '/w/index.php',
                ] );
                $this->factory = MediaWikiServices::getInstance()->getLinkRendererFactory();
-
        }
 
        public function testMergeAttribs() {
index f70b42d..47ed67b 100644 (file)
@@ -17,7 +17,6 @@ class ExifBitmapTest extends MediaWikiMediaTestCase {
                $this->setMwGlobals( 'wgShowEXIF', true );
 
                $this->handler = new ExifBitmapHandler;
-
        }
 
        /**
index 4cbeeb9..8284d05 100644 (file)
@@ -138,7 +138,6 @@ class SessionProviderTest extends MediaWikiTestCase {
                                $ex->getMessage()
                        );
                }
-
        }
 
        public function testHashToSessionId() {
index 3815416..e6a6ad3 100644 (file)
@@ -299,7 +299,6 @@ class SessionTest extends MediaWikiTestCase {
 
                $session->resetAllTokens();
                $this->assertArrayNotHasKey( 'wsTokenSecrets', $backend->data );
-
        }
 
        /**
index 061e598..c1083af 100644 (file)
@@ -22,7 +22,7 @@ class QueryAllSpecialPagesTest extends MediaWikiTestCase {
         * Pages whose query use the same DB table more than once.
         * This is used to skip testing those pages when run against a MySQL backend
         * which does not support reopening a temporary table. See upstream bug:
-        * http://bugs.mysql.com/bug.php?id=10327
+        * https://bugs.mysql.com/bug.php?id=10327
         */
        protected $reopensTempTable = [
                'BrokenRedirects',
@@ -51,7 +51,7 @@ class QueryAllSpecialPagesTest extends MediaWikiTestCase {
 
                foreach ( $this->queryPages as $page ) {
                        // With MySQL, skips special pages reopening a temporary table
-                       // See http://bugs.mysql.com/bug.php?id=10327
+                       // See https://bugs.mysql.com/bug.php?id=10327
                        if (
                                $wgDBtype === 'mysql'
                                && in_array( $page->getName(), $this->reopensTempTable )
index 3debe6e..6be272f 100644 (file)
@@ -349,7 +349,7 @@ class UploadBaseTest extends MediaWikiTestCase {
                        ],
                        [
                                // This currently doesn't seem to work in any browsers, but in case
-                               // http://www.w3.org/TR/css3-images/ is implemented for SVG files
+                               // https://www.w3.org/TR/css3-images/ is implemented for SVG files
                                '<svg xmlns="http://www.w3.org/2000/svg"> <rect width="100" height="100" style="background-image:image(\'sprites.svg#xywh=40,0,20,20\')"/> </svg>',
                                true,
                                true,
@@ -397,6 +397,46 @@ class UploadBaseTest extends MediaWikiTestCase {
                // @codingStandardsIgnoreEnd
        }
 
+       /**
+        * @dataProvider provideDetectScriptInSvg
+        */
+       public function testDetectScriptInSvg( $svg, $expected, $message ) {
+               // This only checks some weird cases, most tests are in testCheckSvgScriptCallback() above
+               $result = $this->upload->detectScriptInSvg( $svg, false );
+               $this->assertSame( $expected, $result, $message );
+       }
+
+       public static function provideDetectScriptInSvg() {
+               global $IP;
+               return [
+                       [
+                               "$IP/tests/phpunit/data/upload/buggynamespace-original.svg",
+                               false,
+                               'SVG with a weird but valid namespace definition created by Adobe Illustrator'
+                       ],
+                       [
+                               "$IP/tests/phpunit/data/upload/buggynamespace-okay.svg",
+                               false,
+                               'SVG with a namespace definition created by Adobe Illustrator and mangled by Inkscape'
+                       ],
+                       [
+                               "$IP/tests/phpunit/data/upload/buggynamespace-okay2.svg",
+                               false,
+                               'SVG with a namespace definition created by Adobe Illustrator and mangled by Inkscape (twice)'
+                       ],
+                       [
+                               "$IP/tests/phpunit/data/upload/buggynamespace-bad.svg",
+                               [ 'uploadscriptednamespace', 'i' ],
+                               'SVG with a namespace definition using an undefined entity'
+                       ],
+                       [
+                               "$IP/tests/phpunit/data/upload/buggynamespace-evilhtml.svg",
+                               [ 'uploadscriptednamespace', 'http://www.w3.org/1999/xhtml' ],
+                               'SVG with an html namespace encoded as an entity'
+                       ],
+               ];
+       }
+
        /**
         * @dataProvider provideCheckXMLEncodingMissmatch
         */
@@ -442,4 +482,11 @@ class UploadTestHandler extends UploadBase {
                );
                return [ $check->wellFormed, $check->filterMatch ];
        }
+
+       /**
+        * Same as parent function, but override visibility to 'public'.
+        */
+       public function detectScriptInSvg( $filename, $partial ) {
+               return parent::detectScriptInSvg( $filename, $partial );
+       }
 }
index 34548c0..199fc8f 100644 (file)
@@ -269,7 +269,6 @@ class UserTest extends MediaWikiTestCase {
                // let the user have a few (3) edits
                $page = WikiPage::factory( Title::newFromText( 'Help:UserTest_EditCount' ) );
                for ( $i = 0; $i < 3; $i++ ) {
-
                        $page->doEditContent(
                                ContentHandler::makeContent( (string)$i, $page->getTitle() ),
                                'test',
@@ -505,7 +504,6 @@ class UserTest extends MediaWikiTestCase {
        public function testGetId() {
                $user = static::getTestUser()->getUser();
                $this->assertTrue( $user->getId() > 0 );
-
        }
 
        /**
index ce6894e..cb1b3d2 100644 (file)
@@ -81,7 +81,7 @@ class BatchRowUpdateTest extends MediaWikiTestCase {
         */
        public function testReaderGetPrimaryKey( $message, array $expected, array $row ) {
                $reader = new BatchRowIterator( $this->mockDb(), 'some_table', array_keys( $expected ), 8675309 );
-               $this->assertEquals( $expected, $reader->extractPrimaryKeys( (object) $row ), $message );
+               $this->assertEquals( $expected, $reader->extractPrimaryKeys( (object)$row ), $message );
        }
 
        public static function provider_readerSetFetchColumns() {
@@ -226,7 +226,7 @@ class BatchRowUpdateTest extends MediaWikiTestCase {
                for ( $i = 0; $i < $numRows; $i += $batchSize ) {
                        $rows = [];
                        for ( $j = 0; $j < $batchSize && $i + $j < $numRows; $j++ ) {
-                               $rows [] = (object) call_user_func( $rowGenerator );
+                               $rows [] = (object)call_user_func( $rowGenerator );
                        }
                        $res[] = $rows;
                }
index ad61284..e11fd8a 100644 (file)
@@ -92,7 +92,7 @@ class ExtensionJsonValidationTest extends PHPUnit_Framework_TestCase {
                }
 
                $validator = new Validator;
-               $validator->check( $data, (object) [ '$ref' => 'file://' . $schemaPath ] );
+               $validator->check( $data, (object)[ '$ref' => 'file://' . $schemaPath ] );
                if ( $validator->isValid() && !$licenseError ) {
                        // All good.
                        $this->assertTrue( true );
index 86ce53f..2e6bf37 100644 (file)
@@ -91,7 +91,6 @@ class ResourcesTest extends MediaWikiTestCase {
         */
        public function testMissingMessages() {
                $data = self::getAllModules();
-               $validDeps = array_keys( $data['modules'] );
                $lang = Language::factory( 'en' );
 
                /** @var ResourceLoaderModule $module */
@@ -114,7 +113,6 @@ class ResourcesTest extends MediaWikiTestCase {
         */
        public function testUnsatisfiableDependencies() {
                $data = self::getAllModules();
-               $validDeps = array_keys( $data['modules'] );
 
                /** @var ResourceLoaderModule $module */
                foreach ( $data['modules'] as $moduleName => $module ) {
index 5a7fc48..5d5d693 100644 (file)
@@ -108,7 +108,7 @@ class ParserTestTopLevelSuite extends PHPUnit_Framework_TestSuite {
                        $testsName = $extensionName . '__' . basename( $fileName, '.txt' );
                        $parserTestClassName = ucfirst( $testsName );
 
-                       // Official spec for class names: http://php.net/manual/en/language.oop5.basic.php
+                       // Official spec for class names: https://secure.php.net/manual/en/language.oop5.basic.php
                        // Prepend 'ParserTest_' to be paranoid about it not starting with a number
                        $parserTestClassName = 'ParserTest_' .
                                preg_replace( '/[^a-zA-Z0-9_\x7f-\xff]/', '_', $parserTestClassName );
index 4eac362..6dd17f1 100644 (file)
                } );
        } );
 
-       QUnit.test( 'getUrl', 13, function ( assert ) {
+       QUnit.test( 'getUrl', 14, function ( assert ) {
                var href;
                mw.config.set( {
                        wgScript: '/w/index.php',
                href = mw.util.getUrl( 'Foo:Sandbox? 5+5=10! (test)/sub ' );
                assert.equal( href, '/wiki/Foo:Sandbox%3F_5%2B5%3D10!_(test)/sub_', 'complex title' );
 
+               // T149767
+               href = mw.util.getUrl( 'My$$test$$$$$title' );
+               assert.equal( href, '/wiki/My$$test$$$$$title', 'title with multiple consecutive dollar signs' );
+
                href = mw.util.getUrl();
                assert.equal( href, '/wiki/Foobar', 'default title' );
 
index 2934b39..045b633 100644 (file)
@@ -10,6 +10,7 @@
                        'Mozilla/5.0 (Windows NT 6.1.1; rv:5.0) Gecko/20100101 Firefox/5.0',
                        'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:9.0) Gecko/20100101 Firefox/9.0',
                        'Mozilla/5.0 (Macintosh; I; Intel Mac OS X 11_7_9; de-LI; rv:1.9b4) Gecko/2012010317 Firefox/10.0a4',
+                       'Mozilla/5.0 (X11; Linux i686; rv:10.0) Gecko/20100101 Firefox/10.0',
                        'Mozilla/5.0 (Windows NT 6.1; rv:12.0) Gecko/20120403211507 Firefox/12.0',
                        'Mozilla/5.0 (Windows NT 6.2; Win64; x64; rv:16.0.1) Gecko/20121011 Firefox/16.0.1',
                        // Kindle Fire
@@ -46,6 +47,8 @@
                        'Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420.1 (KHTML, like Gecko) Version/3.0 Mobile/3B48b Safari/419.3',
                        // Android
                        'Mozilla/5.0 (Linux; U; Android 2.1; en-us; Nexus One Build/ERD62) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17',
+                       // UC Mini (speed mode off)
+                       'Mozilla/5.0 (Linux; U; Android 6.0.1; en-US; Nexus_5 Build/MMB29S) AppleWebKit/528.5+ (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1 UCBrowser/10.7.6.805 Mobile',
 
                        /* Grade C */
 
                        'Wget/1.10.1 (Red Hat modified)',
                        // Unknown
                        'I\'m an unknown browser',
+                       'I\'m an unknown Glass browser',
                        // Empty
                        ''
                ],
                blacklisted: [
                        /* Grade C */
 
+                       // PlayStation
+                       'Mozilla/5.0 (PLAYSTATION 3; 1.10)',
+                       'Mozilla/5.0 (PLAYSTATION 3; 3.55)',
+                       'Mozilla/5.0 (PLAYSTATION 3 4.21) AppleWebKit/531.22.8 (KHTML, like Gecko)',
+                       'Mozilla/5.0 (PlayStation 4 1.70) AppleWebKit/536.26 (KHTML, like Gecko)',
                        // Open WebOS < 1.5 (Palm Pre, Palm Pixi)
                        'Mozilla/5.0 (webOS/1.0; U; en-US) AppleWebKit/525.27.1 (KHTML, like Gecko) Version/1.0 Safari/525.27.1 Pre/1.0',
                        'Mozilla/5.0 (webOS/1.4.0; U; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Version/1.0 Safari/532.2 Pixi/1.1 ',
                        // Google Glass
                        'Mozilla/5.0 (Linux; U; Android 4.0.4; en-us; Glass 1 Build/IMM76L; XE11) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30',
                        // MeeGo
-                       'Mozilla/5.0 (MeeGo; NokiaN9) AppleWebKit/534.13 (KHTML, like Gecko) NokiaBrowser/8.5.0 Mobile Safari/534.13'
+                       'Mozilla/5.0 (MeeGo; NokiaN9) AppleWebKit/534.13 (KHTML, like Gecko) NokiaBrowser/8.5.0 Mobile Safari/534.13',
+                       // UC Mini (speed mode on)
+                       'Mozilla/5.0 (X11; U; Linux i686; zh-CN; r:1.2.3.4) Gecko/'
                ]
        };